编辑“︁
虚拟机分析
”︁(章节)
跳转到导航
跳转到搜索
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
== 注册SEH == <syntaxhighlight lang="asm">.text:004012B5 push offset seh_handler .text:004012BA push large dword ptr fs:0 .text:004012C1 mov large fs:0, esp .text:004012C8 call initVM .text:004012CD int 3 ; Trap to Debugger</syntaxhighlight> <code>initVM</code>完成的是一些虚拟机启动前的初始化工作(其实就是对一些寄存器和相关的部分赋初值), 我们之后来讨论. 这里我们关注的是SEH部分. 这里注册了一个SEH句柄, 异常处理函数我重命名为<code>seh_handler</code>, 并之后使用<code>int 3</code>手动触发异常. 而在<code>seh_handler</code>位置, IDA并未正确识别出对应的代码 <pre>.text:004012D7 seh_handler db 64h ; DATA XREF: process_input+7Do .text:004012D8 dd 58Fh, 0C4830000h, 13066804h, 0FF640040h, 35h, 25896400h .text:004012D8 dd 0 .text:004012F4 dd 1B8h, 0F7C93300h, 0F7C033F1h, 0FFC483E1h, 8F64FDEBh .text:004012F4 dd 5, 4C48300h, 40133068h, 35FF6400h, 0 .text:0040131C dd 258964h, 33000000h, 33198BC9h, 83E1F7C0h, 0FDEBFFC4h .text:0040131C dd 58F64h, 83000000h, 5E6804C4h, 64004013h, 35FFh, 89640000h .text:0040131C dd 25h, 0C033CC00h, 0C483E1F7h, 83FDEBFFh, 4035FF05h, 0D8B0200h .text:0040131C dd 4035FFh, 3000B1FFh, 58F0040h, 4031C8h, 31C83D80h, 750A0040h .text:0040131C dd 0B1FF4176h, 403000h, 31C8058Fh, 3D800040h, 4031C8h</pre> 我们可以点击相应位置按下<code>c</code>键, 将这些数据转换成代码进行识别. (我们需要按下多次c键进行转换), 得到如下代码. 如下, 在<code>seh_handler</code>位置, 又用类似的方法注册了一个位于<code>401306h</code>的异常处理函数, 并通过<code>xor ecx,ecx; div ecx</code>手动触发了一个<code>除0异常</code>. 而在<code>loc_401301</code>位置, 这是一个反调试技巧, <code>jmp loc_401301+2</code>会使得<code>EIP</code>转向一条指令中间, 使得无法继续调试. 所以我们可以将<code>00401301~00401306</code>部分的代码<code>nop</code>掉, 然后在<code>00401306</code>位置创建一个新函数<code>seh_handler2</code> <pre>seh_handler: ; DATA XREF: process_input+7Do .text:004012D7 pop large dword ptr fs:0 .text:004012DE add esp, 4 .text:004012E1 push 401306h .text:004012E6 push large dword ptr fs:0 .text:004012ED mov large fs:0, esp .text:004012F4 mov eax, 1 .text:004012F9 xor ecx, ecx .text:004012FB div ecx .text:004012FD xor eax, eax .text:004012FF mul ecx .text:00401301 .text:00401301 loc_401301: ; CODE XREF: .text:00401304j .text:00401301 add esp, 0FFFFFFFFh .text:00401304 jmp short near ptr loc_401301+2 .text:00401306 ; --------------------------------------------------------------------------- .text:00401306 pop large dword ptr fs:0 .text:0040130D add esp, 4 .text:00401310 push 401330h .text:00401315 push large dword ptr fs:0 .text:0040131C mov large fs:0, esp .text:00401323 xor ecx, ecx .text:00401325 mov ebx, [ecx] .text:00401327 xor eax, eax .text:00401329 mul ecx</pre> 类似的, 还有<code>401330h</code>重命名为<code>seh_handler3</code>, 而<code>40135Eh</code>是最后一个注册的异常处理函数, 我们可以推测这才是虚拟机真正的main函数, 因此我们将<code>40135Eh</code>重命名为<code>vm_main</code>. (有关SEH和反调试的部分, 可以推荐大家自己去动态调试一番弄清楚)
摘要:
请注意,所有对gamedev的贡献均可能会被其他贡献者编辑、修改或删除。如果您不希望您的文字作品被随意编辑,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源(详情请见
Gamedev:著作权
)。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)
导航菜单
个人工具
未登录
讨论
贡献
创建账号
登录
命名空间
页面
讨论
不转换
不转换
简体
繁體
大陆简体
香港繁體
澳門繁體
大马简体
新加坡简体
臺灣正體
查看
阅读
编辑
查看历史
更多
搜索
导航
首页
最近更改
随机页面
MediaWiki帮助
工具
链入页面
相关更改
特殊页面
页面信息