Может ли компьютер составить программу для себя

Представьте, что вы написали программу, которая может изменить сама себя и стать другой программой. Это возможно или нет?

Давайте быстро вспомним, как работает программа. Во-первых, она загружается в память компьютера. Это значит, что начиная с определенного адреса в памяти располагаются машинные инструкции, из которых состоит программа:

Во-вторых, чтобы программа начала работать, нужно «натравить» на неё процессор. У процессора есть специальный указатель , который всегда указывает на какой-то адрес. Из этого адреса процессор читает и исполняет инструкцию. Указатель сдвигается на следующий адрес, процессор читает следующую инструкцию, и т.д.

Значит, тот адрес, с которого начинается программа, нужно записать в указатель процессора. Тогда процессор начнет читать инструкции и исполнять их, начиная с этого адреса. То есть программа фактически начнёт работать.

Но программа также работает с какими-то своими переменными. Скажем, если мы напишем в коде

То будет выделен адрес памяти для переменной a , и в этот адрес будет записано число 5.

Я Создал Свой Компьютер с Нуля! Он Работает!

Значит, и сама программа находится в памяти, и её данные находятся в памяти. И очевидно, что данные можно читать и перезаписывать.

Чем отличаются данные, лежащие в памяти, от машинных инструкций, лежащих в памяти? Абсолютно ничем. Значит, данные можно трактовать как машинные инструкции, а машинные инструкции можно трактовать как данные?

Например, число 12058880 – это машинный код, который обозначает «записать число 1 в первый регистр процессора» (неважно, это просто пример).

Стало быть, если мы напишем:

a = 12058880

То мы поместим в память, с одной стороны, число 12058880, а с другой стороны – машинную инструкцию.

Значит, код программы вполне может сгенерировать код другой программы и записать его в память. Останется только его выполнить. Если мы знаем адрес переменной a , то нужно записать её адрес в указатель инструкций процессора, и тогда процессор прочитает число 12058880 из этого адреса и выполнит его как инструкцию.

Читайте также:
Подключить Смарт часы программа

А если программа знает собственный адрес? Тогда она может записать какие-то данные прямо поверх своих инструкций, тем самым изменив саму себя.

Получается, что мы загружаем программу в память, запускаем её, потом смотрим в память – а там лежит уже другая программа.

Но не тут-то было

Раньше программы действительно могли так делать. Можно было отправить процессор выполнять созданные программой данные, или записать инструкции поверх других инструкций. Но это приводило к огромным дырам в безопасности и в частности, к разгулу вирусных программ.

Кроме того, даже если программа не была вредоносной, какая-нибудь ошибка в ней вполне могла привести к тому, что процессор попадал на область данных и начинал выполнять их как инструкции, что естественно приводило к полному краху и непредсказуемым последствиям.

В результате была придумана защита. Память была поделена на сегменты (не физические, а условные). В сегмент кода загружался и исполнялся только код, а в сегмент данных помещались только данные, и они никогда не пересекались. Программа могла делать запись только в сегмент данных. Если делалась попытка записать что-то в сегмент кода или выполнить что-то в сегменте данных – то процессор это сразу перехватывал, и выбрасывал ошибку, которая знакома всем: «Программа совершила недопустимую операцию и будет закрыта».

Как через картинку проникнуть в компьютер ? (разбираем и защищаемся)

Тем не менее, и в такой защите время от времени находят бреши. То баги в самом процессоре, то хитроумные и непредусмотренные механизмы изменения защиты.

Но для обычных людей времена самомодифицирующихся программ давно прошли 🙂

Когда-то я написал игру на ассемблере, и мне нужен был генератор случайных чисел. Чтобы не возиться с ним, я сделал так, чтобы программа читала собственные машинные коды как случайные числа. Они, конечно, не были случайными, но были достаточно похожи на них.

Источник: dzen.ru

Читайте также:
Структура маркетинговой программы по продукту включает

Может ли программа изменить саму себя?

Как написать скрипт, который при выполнении может вносить изменения в свой код? И чтобы после каждого запуска, результат выполнения программы отличался от предыдущего.

комментировать
в избранное
Litwi­ n [38.5K]
7 лет назад

Даже на ассемблере это сделать невозможно. Более того, только на ассемблере или C++ (с помощью встроенного ассемблера) можно написать программу, которая будет менять свой код во время выполнения. Я когда-то так делал, когда писал на ассемблере программу, в которой получились подпрограммы, отличающиеся друг от друга парой тройкой операторов. Сделал одну такую, и перед вызовом её менял коды операторов на требуемые.

При использовании языков программирования, которые не поддерживают вставки кусочков на ассемблере такое сделать невозможно. А скрипты уж явно не поддерживают такое.

Но файл программы при этом не меняется.

Дело в том, что пока программа работает, записать что-то в её файл не получается, т.к. он уже открыт. Вирусы меняют коды программ перед их запуском. Т.е., именно они и дают команду на запуск программы.

Но это можно обойти, создав другой файл. Куда будет записано изначально требуемое изменение, и при запуске программы она сначала считает этот файл, а потом уже произведёт требуемые изначально кусочки кода. Но опять опять-таки — в языке программирования требуется поддержка ассемблера.

Но можно сделать и ход конём. Тут есть два способа. Оба предполагают использование вспомогательного файла. Данных или скрипта. Простой и сложный способы:

  1. Простой. Изменения по условиям. Создаётся другой файл, в который записываются определённые условия (или данные), на основании которых написанная программа, скрипт, будут работать определённым способом. И те условия можно будет каждый раз изменять. Сама программа или скрипт при этом останутся неизменными.
  2. Сложный. Для программ — тут надо точно знать, где и что менять в файле с двоичным кодом программы. Изменение скрипта попроще, ибо он в текстовом виде хранится. Тут надо другой скрипт, который нужно будет запускать перед завершением основного с передачей вспомогательному параметров о требуемых изменений первого. После завершения первого второй на основе переданных ему параметров произведёт изменения текста основного скрипта.
Читайте также:
Прикладные программы ПК это

Источник: www.bolshoyvopros.ru

Может ли компьютер составить программу для себя

Ответ:

Нет! Для этого нужно обладать специальными знаниями.

1 votes Thanks 1

More Questions From This User See All

leilaanatoliy

leilaanatoliy August 2022 | 0 Ответы

ukazhi kakoj cifroj okanchivaetsya proizvedenie 219 2 43

leilaanatoliy

leilaanatoliy August 2022 | 0 Ответы

a vspomni i zapishi opredeleniya sleduyushim ponyatiyam eslivozniknet neobhodimost

leilaanatoliy

leilaanatoliy August 2022 | 0 Ответы

schet tysyachami do 1 000 000zapishi predydushee i posleduyushee chisla5 02010 00150

leilaanatoliy

leilaanatoliy August 2022 | 0 Ответы

ukazhi vernuyu zapis proizvedeniya 2 2 2 2 v vide stepeniotvet nazadprover

leilaanatoliy

leilaanatoliy July 2022 | 0 Ответы

sootnesi zhivotnyh i rasteniya s zapovednikami kazahstanaaksu zhabaglinskijkuvshink

leilaanatoliy

leilaanatoliy July 2022 | 0 Ответы

umenshi 2145 v 7 raz vyberi vernyj otvet iz otvetov 360 306 36 pomogi pozhalujst

leilaanatoliy

leilaanatoliy August 2021 | 0 Ответы

Источник: scholar.tips

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru