首页
社区
课程
招聘
周末好哈!发个代码,来烦烦各位[讨论]
发表于: 2007-3-17 18:58 3618

周末好哈!发个代码,来烦烦各位[讨论]

2007-3-17 18:58
3618
游戏中写屏,参照论坛上的贴子,我找到游戏中的写屏函数处,调试时出错,搞了几天了,弄不明白。请教!谢谢

*******************************以下为DLL中部分代码****************************************

extern "C" __declspec(dllexport) void ok123()         
{         
          HWND hwnd = ::FindWindow( NULL , "游戏在线" ); //获取窗口句柄
if(hwnd)
{

GetWindowThreadProcessId(hwnd,&hProcId);  //获取进程ID
HANDLE ghd = OpenProcess( PROCESS_ALL_ACCESS,FALSE,hProcId);    //获取进程句柄
if(ghd)
{
OpenProcessToken(ghd,TOKEN_ALL_ACCESS,&hdlTokenHandle);
FARPROC p=(FARPROC)func;
DWORD dwp=(DWORD)p-0x000525843-0x5;
DWORD dwoldflag;
VirtualProtectEx(ghd,(void*)0x00525844,4,PAGE_READWRITE,&dwoldflag);
WriteProcessMemory(ghd,(void*)0x00525844,&dwp, 4 , NULL );
            VirtualProtectEx(ghd,(void*)0x00525844,4,dwoldflag,&dwoldflag);
CloseHandle(ghd);
}
}

}

const DWORD conaddress=0x00345849;
_declspec(naked) void func(void)
{
_asm
{
pushad
call dispfunc
popad
jmp conaddress

}
}

void dispfunc()
{

}

*******************************以上为DLL中部分代码*******************************************
游戏中写屏函数入口:

          |.  BD 1C030000   mov     ebp, 31C     
00525843  |.  E8 91030700   call    00345849         //想在这拦截,调入自已写的函数
          |.  83C4 0C       add     esp, 0C

调试时出现:

              "0x10001035指令引用的内存0x681070d2,该内存不能“writen"   "

经过调试可以肯定,内存代码修改是成功的,是什么原因倒致出错?堆栈?


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
2
我没有做过这方面的开发,只能根据自己调试的经验来胡乱猜测一下原因了

我觉得有两种可能的原因

其一是堆栈问题,可以看到原来的CALL指令后有清栈的动作,那么被调用者是_stdcall 属性的子函数,而堆栈中是参数,虽然你的替代函数用了 pushad 和 popad,你还是必须在汇编级别进行调试,看看在你的功能函数 dispfunc 执行完毕并返回后堆栈指针是否正确,因为对于 naked 的函数,不能想当然,一定要在汇编指令这个层次看了,才知道你的代码工作是否正确

原因之二,是我认为可能性比较大一点的,就是那条 jmp conaddress 指令并没有将 conaddress 的执作为跳转的目的地址,而是作为对 eip 操作的一个偏移地址了,因为 I386 的指令集有许许多的跳转,而其助记符只有 jmp ,对于 naked 的函数,C的编译器对汇编指令的翻译不一定是按你想像的进行的,
同样只需要在汇编级上对程序进行调试即可
如果真是这个原因,那么你可以这样修改(还记得写 shellcode 时常用的方法吗): mov eax,conaddress     /     jmp eax
这样便可以进行绝对调了.

BTW:在VC的调试环境中,按调试工具条上的反汇编按钮或者直接按ALT + 8便可打开源码对应的汇编代码,当然前提是编译和连接时打开了源码调试的选项(对于默认的DEBUG模式是打开的)

如果不用VC而用其它调试工具的话,可以在需要设断点的地方手动插入一条 int3
,那么程序跑到这里便会停下来,然后激活你的Just in time Debugger即可跟踪

如果不是我猜的原因,那么你可以放上更详细的介绍,大家继续探讨.

祝你好运.
2007-3-17 20:14
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
谢谢 书呆彭

你的分析好详,佩服。

我立马去调试下,有进展就来报告给各位。
2007-3-17 20:36
0
游客
登录 | 注册 方可回帖
返回
//