起因是在学习《逆向工程 核心原理》中的“记事本WriteFile()API钩取“章节时,遇到的问题
我的代码如下
[C++] 纯文本查看 复制代码
LPVOID WriteFileAddr;
CREATE_PROCESS_DEBUG_INFO g_cpdi;
BYTE g_setInt3 = 0xCC, g_bfbyte = 0;
BOOL OnCreateProcessDebugEvent(LPDEBUG_EVENT pde)
{
//获取WriteFile API地址
WriteFileAddr = GetProcAddress(GetModuleHandleA("kernel32"), "WriteFile");
if(WriteFileAddr == NULL)
{
printf("获取WriteFile API地址失败\n");
return FALSE;
}
//更改第一个字节为0xCC(INT 3)
memcpy(&g_cpdi, &pde->u.CreateProcessInfo, sizeof(CREATE_PROCESS_DEBUG_INFO));
//备份原来的字节
ReadProcessMemory(g_cpdi.hProcess, WriteFileAddr, (LPVOID)g_bfbyte, sizeof(BYTE), NULL);
//修改成0xCC,起到调试的作用
/*BOOL Ret = WriteProcessMemory(g_cpdi.hProcess, WriteFileAddr, (LPVOID)g_setInt3, sizeof(BYTE), NULL);
if(Ret == FALSE)
{
printf("修改成0xCC失败\n");
return FALSE;
}
*/
__asm
{
push ecx
mov cl,g_setInt3
mov byte ptr [WriteFileAddr],clS
pop ecx
}
return TRUE;
}
这是我的测试代码,首先就是用了WriteProcessMemory API,发现这个函数并没有修改成功,但是返回值却是成功的,所以我就用汇编来写
写完却发现也没有改成功,不仅没有改我想要的地址内容,而且还把地址改了,如下图
求大佬们解答一下
我的测试环境:虚拟机win xp VC6++
|