编辑“︁
虚拟机分析
”︁(章节)
跳转到导航
跳转到搜索
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
== 恢复堆栈平衡 == 我们创建了一个<code>vm_main</code>函数(重命名后还需要创建函数, IDA才能识别), 然后按下<code>F5</code>提示失败, 失败的原因则是由于堆栈不平衡导致的. 因此我们可以点击IDA菜单项<code>Options->General</code>在右侧勾选<code>stack pointer</code>. 这样就会显示出对应的栈指针. <pre>.text:004017F2 000 jmp vm_main .text:004017F7 ; --------------------------------------------------------------------------- .text:004017F7 000 push 0 ; uType .text:004017F9 004 push offset aError ; "Error" .text:004017FE 008 push offset Text ; "The key is wrong." .text:00401803 00C push 0 ; hWnd .text:00401805 010 call MessageBoxA .text:0040180A .text:0040180A locret_40180A: ; CODE XREF: vm_main+492j .text:0040180A 000 leave .text:0040180B -04 leave .text:0040180C -08 leave .text:0040180D -0C leave .text:0040180E -10 leave .text:0040180F -14 leave .text:00401810 -18 leave .text:00401811 -1C retn .text:00401811 vm_main endp ; sp-analysis failed</pre> 我们来到最下显示不平衡的位置. 最上的<code>jmp vm_main</code>表明虚拟机内在执行一个循环. 而<code>MessageBoxA</code>的调用则是显示最后弹出的错误信息. 而在<code>locret_40180A</code>位置处, 经过多次leave堆栈严重不平衡, 因此我们需要手动恢复堆栈平衡. 这里也很简单, 在<code>0040180A</code>位置已经堆栈平衡了(000), 因此我们只需要将这一句<code>leave</code>修改为<code>retn</code>就可以了. 如下这样 <pre>.text:0040180A locret_40180A: ; CODE XREF: vm_main+492j .text:0040180A 000 retn .text:0040180B ; --------------------------------------------------------------------------- .text:0040180B 004 leave .text:0040180C 004 leave .text:0040180D 004 leave</pre> 然后你就可以发现<code>vm_main</code>可以F5生成伪C代码了.
摘要:
请注意,所有对gamedev的贡献均可能会被其他贡献者编辑、修改或删除。如果您不希望您的文字作品被随意编辑,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源(详情请见
Gamedev:著作权
)。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)
导航菜单
个人工具
未登录
讨论
贡献
创建账号
登录
命名空间
页面
讨论
不转换
不转换
简体
繁體
大陆简体
香港繁體
澳門繁體
大马简体
新加坡简体
臺灣正體
查看
阅读
编辑
查看历史
更多
搜索
导航
首页
最近更改
随机页面
MediaWiki帮助
工具
链入页面
相关更改
特殊页面
页面信息