首页
社区
课程
招聘
跨进程内存补丁制作求助
发表于: 2010-6-23 22:51 4139

跨进程内存补丁制作求助

2010-6-23 22:51
4139
版主或各位大侠:我参考《加密与解密(第三版)》内存补丁一节内容,编制如下程序段,可无论如何也没看见被调试的程序被启动并出现其窗口(该程序无论破解与否都应有一窗口出现),想请各位帮助分析下,看问题出在何处?才开始涉及这方面内容,所以有些不知如何入手!
#define PATCH_DRESS1 0x05BB01F
#define PATCH_DRESS2 0x05BB3E4
       
        char szFileName[40] = {"c:\\gmg\\Mesa 12.00\\Mesa.exe"};
        BYTE TarGetData1[] = {0x74,0x37};
        BYTE TarGetData2[] = {0x0f,0x84,0xb2};
        BYTE WriteData1[] = {0x90,0x90};
        BYTE WriteData2[] = {0xe9,0xb3,0x00};
        BYTE ReadBuffer[128] = {0};
        DWORD Oldpp;
        STARTUPINFOA si;
        PROCESS_INFORMATION pi;
        BOOL bContinueRun = TRUE;

        //创建一个挂起的进程
        if(!CreateProcess(szFileName,0,0,0,0,CREATE_SUSPENDED,0,0,&si,&pi))
        {
                ::MessageBoxA(NULL,"CreateProcess Failed.","error",MB_OK);
                return;
        }

        while(bContinueRun)
        {
                ResumeThread(pi.hThread);
                Sleep(10);
                SuspendThread(pi.hThread);
                ReadProcessMemory(pi.hProcess,(LPVOID)PATCH_DRESS1,&ReadBuffer,2,NULL);
                if(!memcmp(TarGetData1,ReadBuffer,2))
                {
                        VirtualProtectEx(pi.hProcess,(LPVOID)PATCH_DRESS1,2,0x40,&Oldpp);
                        WriteProcessMemory(pi.hProcess,(LPVOID)PATCH_DRESS1,&WriteData1,2,0);
                        VirtualProtectEx(pi.hProcess,(LPVOID)PATCH_DRESS2,3,0x40,&Oldpp);
                        WriteProcessMemory(pi.hProcess,(LPVOID)PATCH_DRESS2,&WriteData2,3,0);
                        ResumeThread(pi.hThread);
                        bContinueRun = FALSE;
                }
        }
        CloseHandle(pi.hProcess);
        CloseHandle(pi.hThread);

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 260
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
帮你顶上去
2010-6-27 22:15
0
雪    币: 934
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
char szFileName[40] = {"c:\\gmg\\Mesa 12.00\\Mesa.exe"};
第一句就错了,你路径也太特殊了,里面有0\,而且40buff也没有作收尾处理,所以变量里面存储的文件路径是有问题的。用strcmp吧。建议看看孙鑫老师的C++书籍有将这方面内容,打好基础再学习吧。
2010-6-27 22:32
0
雪    币: 359
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
[QUOTE=batcom;829290]char szFileName[40] = {"c:\\gmg\\Mesa 12.00\\Mesa.exe"};
第一句就错了,你路径也太特殊了,里面有0\,而且40buff也没有作收尾处理,所以变量里面存储的文件路径是有问题的。用strcmp吧。建议看看孙鑫老师的C++书籍有将这方面内容,打好基...[/QUOTE]

LZ的是"0\"不是"\0",这没问题;
szFileName末尾会被编译器补"\0",不需要收尾处理;
memcmp没有用错,由于不知道后面是否会有"\0",所以用strcmp是不合适的。

从你的TarGetData2和WriteData2分析,应该是长je指令,改成长jmp指令,但是前者6字节,后者5字节,你这种改法偏移地址错位,除非这个je指令后面三个字节都是00,否则是会出错的。可以试试WriteData2改两个字节用90E9替代看看,如果还是情况依旧,可以先调试运行加载器,看它是否正常退出了。如果是正常退出了,再附加到目标进程看看patch有没有成功,如果也成功了那就是其他问题,比如patch时机太晚或者有自校验等等。
2010-6-29 15:24
0
游客
登录 | 注册 方可回帖
返回
//