今天刚发布 v0.2.2 内测版到群里,就有一位朋友反馈了一个崩溃BUG.
那位朋友没有发DMP过来,而是直接发来调试有问题的程序过来,
用虚拟机打开发来的文件,加载调试,就出现问题了.
加载后运行, 调试器一直显示运行状态, 但就是没有反应,
不显示窗口, 模块窗口也只加载了 32位和64位 的 ntdll.dll.
觉得很奇怪, 就用od加载试一下, 刚加载(还没运行) 就提示如下:
[Asm] 纯文本查看 复制代码 ---------------------------
Protect_sdk反调试测试.exe - 应用程序错误
---------------------------
应用程序无法正常启动(0xc0000142)。请单击“确定”关闭应用程序。
---------------------------
确定
---------------------------
0xc0000142 这个错误码,好眼熟, 感觉以前好像在哪见过, 翻翻以前写的博客,果然找到了.
利用StrongOD漏洞反调试
C0000142 STATUS_DLL_INIT_FAILED
只需要把 StrongOD 插件中的 !*Kill BadPE Bug 选项去掉即可.
(注意,去掉之后,需要重启调试器, 否则不生效.)
重启调试器之后,再加载目标程序,就没有刚刚的提示了, 但这次中断在 ntdll.dll 中, 如下:
[Asm] 纯文本查看 复制代码
77C90F3C 8975 FC MOV DWORD PTR SS:[EBP-0x4], ESI ;中断在此
77C90F3F EB 0E JMP SHORT ntdll.77C90F4F
77C90F41 33C0 XOR EAX, EAX
77C90F43 40 INC EAX
77C90F44 C3 RET
看了一下调试器设置选项, 没有勾选 tls 中断系统 之类的选项.
又看了一下OEP 如下:
[Asm] 纯文本查看 复制代码
004000A8 00000000 DD 00000000 ; AddressOfEntryPoint = 0x0
这个程序oep是0, 调试器默认会在oep下断, 就相当于是在 magic "MZ" 处下断了. 这里就是程序的BUG了, 想要解决, 最好的办法,就是在载入时, 中断. 这个时候,
无论是否设置了 中断在系统模块中, 都应当中断. 否则, 程序就会直接跑飞了.或者直接抛个异常了.
至于od1.x是如何实现中断在ntdll的, 何时中断的, 等问题,还没研究. 等调试器选项 Events(事件) 写好后,再来分析这些吧.
calc_Anti_自己构造的畸形BIN_OEP为0.7z
(36.1 KB, 下载次数: 1)
|