Самоизменяющийся код
Пытаюсь написать прогру которая сама изменяет свой исходный код на этапе выполнения, использую компилятор VC2003, но никак не получаеться... подскажите, кто знает идеи... а то я новичек, даже не знаю с чего начать.
Спасибо.
Знаю есть тут на форуме любители, начинать изучать язык с создания собственной ОС.. : )
прямо в точку
насчёт вопроса:
самомодифицирующийся код можно написать только на асме!!!!!!
PS: Указатели на функции - рулят :-D
Не понял. Запускаешь её, и она модифицирует свой исходник? :) Или надо модифицировать исполняемый код?
разумеется если ты будешь писать в __ASM{ ..... } то всё нормально, а если как обычно, то будут проблемы
я дельфист и потому привык к такой фигне, может быть на с++ проще.......
VirtualProtect поможет
Во FLAT модели сегментация особой роли не играет ибо нету ее там как таковой.
PS: Про страничное преобразование не забываем ;-)
Пытаюсь написать прогру которая сама изменяет свой исходный код на этапе выполнения, использую компилятор VC2003, но никак не получаеться... подскажите, кто знает идеи... а то я новичек, даже не знаю с чего начать.
Спасибо.
И зачем новичку такая экзотерическая функциональность? Кроме вирусов, ну где еще есть необходимость в самоизменяемом коде??
системы ИИ .
Да, вот новичку - самое оно задача.:) Аффтар, вирусняк пишешь? Признавайся... ;)
А можно поподробнее? Какие там еще есть механизмы научения которые невозможно реализовать интерпретируя простой макроязык наподобе, к примеру, того что используется в шрифтах ttf?
и ассемблер там какой то другой.....
выполняется в досе (стары версии) и винде .
Дык вопрос не в том можно ли, а в том нужно ли? Тот же CoreWars - это же контроллируемая среда. И потом операционная система имеет власть просто не давать процессу разрешение на запись в сегмент кода.
Делать модификацию кода на C - это все равно что к программе дописать ее же саму так, чтобы код программы лежал в ее же массиве :)
Реально же применение самомодификации кода на PC очень узкое: оно используется в некоторых алгоритмах (например алгоритм рисования прямых линий), а также в системах защиты кода
А вот где бы глянуть примерчик, или, там, статейку? Просто не думал, что для такой задачи, как рисование отрезка прямой линии, может потребоваться самомодифицирующийся код.
Ну это если ты относишься к программированию, как к шаманству, а к компилятору, как к бубну.
Я не вижу проблем в модификации программы в ран-тайме написанной на C/C++. Точнее вижу, но они все решаемы.
Простейший пример таких программ - упаковщики EXE.
mov cx, code_length
mov si, offset begin_code
mov al, xor_key
_loop:
xor [si+cx], al ;расшифровываем байт
loop _loop ;берем следующий байт
jmp si
;...
;...
begin_code:
;...
;...
в плане как узнать длину команд в байтах, если команды известны?
Например, какая длина следующего кода?
pushl $n
pushl $msg
pushl $msgf
call printf
addl $8, %esp
pushl $sfmt
call scanf
addl $8, %esp
addl $1, n
mov cx, code_length
mov si, offset begin_code
mov al, xor_key
_loop:
xor [si+cx], al ;расшифровываем байт
loop _loop ;берем следующий байт
jmp si
;...
;...
begin_code:
;...
;...
в плане как узнать длину команд в байтах, если команды известны?
Например, какая длина следующего кода?
pushl $n
pushl $msg
pushl $msgf
call printf
addl $8, %esp
pushl $sfmt
call scanf
addl $8, %esp
addl $1, n
открываешь отладчик, смотришь на адрес последней команды, потом первой, потом из последней вычитаешь первую,???,профит.
0x08048404 <main+0>: push $0x8049624
0x08048409 <main+5>: push $0x8049632
0x0804840e <main+10>: push $0x804962f
0x08048413 <main+15>: call 0x8048330 <printf@plt>
0x08048418 <main+20>: add $0x8,%esp
0x0804841b <main+23>: push $0x804962c
0x08048420 <main+28>: call 0x8048320 <scanf@plt>
0x08048425 <main+33>: add $0x8,%esp
0x08048428 <main+36>: addl $0x1,0x8049624
получается 36 байт, правильно?
#include <windows.h>
typedef unsigned char u8;
// ================ PRECOMPILED ================
// This code:
// __declspec(dllexport) int sum2(int v1, int v2){int v0; v0=v1+v2; return v0;}
u8 mycode[]="\x8B\x44\x24\x08\x8B\x4C\x24\x04\x03\xC8\x89\x4C\x24\x08\x8B\x44\x24\x08\xC3\x00";
// =============================================
int result=0;
int _tmain(int argc, _TCHAR* argv[])
{
result=((int(*)(int,int))(void*)mycode)(123,321);
printf("123+321=%d\n", result);
return 0;
}
А теперь включи в системе DEP для всех процессов. ;)
В таком можно выделить память функцией VirtualAlloc с правами на исполнение, и перекопировать туда код.
Вот примерно так:
там и проект для VC2010 можно скачать
[ATTACH=CONFIG]5562[/ATTACH]
Но Lisp, да, он просто создан для самомодификации, только не создан для программирования.