StillPhelix
Junior Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Разобрался. Из-за невнимательности пропустил одну букву. Вобщем, дорогу одолеет идущий. Правильный код: Код: #include<stdio.h> #include<stdlib.h> #include<memory.h> #include<windows.h> #define SELF_SIZE 0x18//((int)x_self_mod_end-(int)x_self_mod_code) __declspec(naked)int x_self_mod_code(int a,int b) { __asm { mov eax,[esp+4]//Получаем первый аргумент call get_eip//Определяем текущее положение в памяти (заталкивается в стек адрес метки get_eip) get_eip: add eax,[esp+8+4]//Складываем/вычитаем из первого аргумента второй (+4 байт - это размер места, занимаемого адресом метки get_eip) pop edx//В edx адрес начала инструкции add eax, ... xor byte ptr[edx],28h//Меняем add на sub и наоборот ret } } void x_self_mod_end(){}; int main() { int a; int (__cdecl*self_mod_code)(int a,int b); self_mod_code=(int (__cdecl*)(int,int))VirtualAlloc(NULL, SELF_SIZE, MEM_COMMIT,PAGE_EXECUTE_READWRITE); //self_mod_code=(int (__cdecl*)(int,int))malloc(SELF_SIZE); printf("error=0x%X, size=0x%X\n",GetLastError(),SELF_SIZE); memcpy(self_mod_code,x_self_mod_code,SELF_SIZE); for(a=1;a<10;a++)printf("%02X",x_self_mod_code(4,2)); printf("\n"); VirtualFree(self_mod_code, 0, MEM_RELEASE); return 0; } | Добавлено: Разобрался. Из-за невнимательности пропустил одну букву. Вобщем, дорогу одолеет идущий. Правильный исходник: #include<stdio.h> #include<stdlib.h> #include<memory.h> #include<windows.h> #define SELF_SIZE 0x18//((int)x_self_mod_end-(int)x_self_mod_code) __declspec(naked)int x_self_mod_code(int a,int b) { __asm { mov eax,[esp+4]//Получаем первый аргумент call get_eip//Определяем текущее положение в памяти (заталкивается в стек адрес метки get_eip) get_eip: add eax,[esp+8+4]//Складываем/вычитаем из первого аргумента второй (+4 байт - это размер места, занимаемого адресом метки get_eip) pop edx//В edx адрес начала инструкции add eax, ... xor byte ptr[edx],28h//Меняем add на sub и наоборот ret } } void x_self_mod_end(){}; int main() { int a; int (__cdecl*self_mod_code)(int a,int b); self_mod_code=(int (__cdecl*)(int,int))VirtualAlloc(NULL, SELF_SIZE, MEM_COMMIT,PAGE_EXECUTE_READWRITE); printf("error=0x%X, size=0x%X\n",GetLastError(),SELF_SIZE); memcpy(self_mod_code,x_self_mod_code,SELF_SIZE); for(a=1;a<10;a++)printf("%02X",x_self_mod_code(4,2)); printf("\n"); VirtualFree(self_mod_code, 0, MEM_RELEASE); return 0; } |