Тема: Код, який модификується самостійно
Доброго часу доби!
Код, який розташований нижче нормально компілюється Watcom та запускається. Але якщо цей код скомпілювати за допомогою Microsoft Visual Studio 2010, то скомпільована програма запуститься без помилок тільки під середовищем Microsoft Visual Studio 2010 у режимі Release. IDA повертає помилку доступа. Де виникає помилка у коментарях. Допоможіть розібратися!
#include<stdio.h>
#include<stdlib.h>
#include<memory.h>
#include<windows.h>
#define SELF_SIZE ((int)x_self_mod_code-(int)x_self_mod_end)//якщо замінити на реальне значення (20 байт у даному випадку, а не те що покаже Visual Studio 2010) не спрацює також.
__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);
memcpy(self_mod_code,x_self_mod_code,SELF_SIZE);//помилка виникає тут
for(a=1;a<10;a++)printf("%02X",self_mod_code(4,2));
printf("\n");
VirtualFree(self_mod_code, 0, MEM_RELEASE);
return 0;
0xDADA11C7: Не забувайте про теґ code