那也就是说,如果要改写到新进程的数据,那肯定要在WriteProcessMemory之前所以,改的时机就确定了,就是WriteProcessMemory之前。那要改哪里。你刚已经通过SetThreadContext获取到了新的eip地址
SetThreadContext函数,用来为指定线程设置context
BOOL WINAPI SetThreadContext( _In_ HANDLE hThread, //线程句柄 _In_ const CONTEXT *lpContext //指定线程的context结构体 );
typedef struct _CONTEXT{
DWORD ContextFlags;
DWORD Dr0;
DWORD Dr1;
DWORD Dr2;
DWORD Dr3;
DWORD Dr6;
DWORD Dr7;
FLOATING_SAVE_AREA FloatSave;
DWORD SegGs;
DWORD SegFs;
DWORD SegEs;
DWORD SegDs;
DWORD Edi;
DWORD Esi;
DWORD Ebx;
DWORD Edx;
DWORD Ecx;
DWORD Eax;
DWORD Ebp;
DWORD Eip; //设置新线程运行的入口点 偏移为0xB4
DWORD SegCs;
DWORD EFlags;
DWORD Esp;
DWORD SegSs;
} CONTEXT;
下断SetThreadContext,找到context结构体中的成员eip
接下来下断WriteProcessMemory
Address 0x00400000 写入的目的地址是
目的地址就是0x004B5780-0x00400000+0x00F80028 ==0x010357A8 在数据窗口中找到数据位置。然后将入口处改成CC
OD调试时,需要设置为实时调试设置设置 Jiack为实时调试器下完WriteProcessMemory后,改完数据,直接F9跑起来
那下断点WriteProcessMemory
有一个是源地址,有一个是目的地址Adress 这个是0x10000000,是目的1009c314 - 10000000 + 0x7fe30010改的地方是0x7fe30010 + 9c314先把od,设置为默认调试器 选项 实时调试设置设置 Jiack为实时调试器下完WriteProcessMemory后,改完数据,直接F9跑起来 |