能力值:
(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即可跟踪
如果不是我猜的原因,那么你可以放上更详细的介绍,大家继续探讨.
祝你好运.
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
谢谢 书呆彭
你的分析好详,佩服。
我立马去调试下,有进展就来报告给各位。
|