幻影2。0测试版的Anti-debug
幻影2。0编写得真不错,它的anti-debug很有特色,我追它可是害惨了我的爱机。系统崩溃
不下20次,反复重启--晕!!虽然在半月前就彻底追过了,但是仍有很多问题没有明白。今天将它写出来,望各位大虾多多指教,为本人解惑。
我觉得它有如下特点:
1、花指令
2、SEH反跟踪
3、在Ring3、Ring0级清除断点寄存器
4、利用createfile查找调试工具(如sice、trw、bw.superbpm等等)
5、断点可不能乱下,不然系统会崩溃(d.boy大侠说:“设计中应该一触发断点
就会崩溃;崩溃是因为 int3 被幻影占领了”。)
以下的代码都是d.boy大侠用幻影2。0测试版加壳的exescope,我已改过的(原是花指令):
167:004AC094
PUSH DWORD [WORD FS:00]
0167:004AC09A PUSHF
0167:004AC09B PUSH BYTE +03
0167:004AC0C7 MOV
[WORD FS:00],ESP 《————建立SEH链
0167:004AC0CD
PUSHF
0167:004AC0CE PUSH BYTE +03
0167:004AC0FA
XOR EAX,EAX
0167:004AC0FC PUSHF
0167:004AC0FD JC 004AC109
0167:004AC113
MOV [EAX],EAX 《————产生异常
0167:004AC115 PUSHF
0167:004AC116 PUSH
BYTE +03
0167:004AC118 JNC 004AC125
0167:004AC11A
JMP SHORT 004AC1
当光标停在4ac0fa处时,看看stack中,异常处理入口为4dca77,这时断点可以下在那里。接下去会有
很多类似的异常,异常处理入口也在4dca77处,但是后面的两个异常的断点就不能设在这里了,不然系统
就会崩溃的。我胡乱猜测是第一次异常时,读入4dca77后的代码,产生页面保护错误,于是就在这里做手脚,就像
上面d.boy大侠说的那样,“int3 被幻影占领了”(各位大侠,我乱猜的,请指教!)
下面我们就进入了异常处理代码中:
0167:004DCA77 C8000000 ENTER 00,00
0167:004DCA7B 9C PUSHF
0167:004DCA7C 6A03 PUSH
BYTE +03
0167:004DCA7E 730B JNC
004DCA8B
0167:004DCA80 EB02
JMP SHORT 004DCA84
0167:004DCB94 MOV
EAX,[EBP+10] 《————eax中为context的指针
0167:004DCB97
JPE 004DCB9C
0167:004DCBA1 MOV
EBX,[EAX+B8] 《————取出context.eip
0167:004DCBA7 JZ
004DCBAC
0167:004DCBAC ADD EBX,BYTE
+02 《————context.eip+2
0167:004DCBAF PUSHF
0167:004DCBC6 ADD EBX,BYTE +03 《————再加
0167:004DCBCE ADD EBX,BYTE +2D
《————再加
0167:004DCBD1 JC 004DCBD6
0167:004DCBD6 MOV [EAX+B8],EBX 《————送回
0167:004DCBDC PUSHF
0167:004DCBF3 XOR
EBX,EBX 《————清零
0167:004DCBF5
JC 004DCBFA
0167:004DCBFA MOV
[EAX+04],EBX 《————修改
0167:004DCBFD PUSHF
0167:004DCC14 MOV
[EAX+08],EBX 《————修改
0167:004DCC17
JPE 004DCC1C
0167:004DCC1C 89580C
MOV [EAX+0C],EBX 《————修改
0167:004DCC1F
7203 JC 004DCC24
0167:004DCC24 895810 MOV
[EAX+10],EBX 《————修改
0167:004DCC27 9C
PUSHF
0167:004DCC3E 895814
MOV [EAX+14],EBX 《————修改
0167:004DCC41 7403 JZ
004DCC46
0167:004DCC46 C7401855010000 MOV
DWORD [EAX+18],0155 《————修改
0167:004DCC4D 7403
JZ 004DCC52
0167:004DCC8A
C9 LEAVE
0167:004DCC8B
C21000 RET 10
经过三次上面的异常处理后,会来到下面的地方:
0167:004AFD61 SIDT [ESI]
《————esi==4dc9d8
0167:004AFD64 JZ
004AFD69
0167:004AFD66 JNZ 004AFD69
0167:004AFD69 MOV ESI,[ESI+02] 《————[esi+02]==800b0000
0167:004AFD6C JZ 004AFD71
0167:004AFD6E
JNZ 004AFD71
0167:004AFD76 MOV
AX,[ESI+18] 《————AX=F5E4
0167:004AFD7A JC
004AFD7F
0167:004AFD7C JNC 004AFD7F
0167:004AFD7F MOV BX,[ESI+1E]
《————BX=C18C
0167:004AFD83 JC 004AFD88
0167:004AFD85
JNC 004AFD88
0167:004AFD88 MOV
[EBP+00433C35],AX 《————F5E4送入4dc9de中
0167:004AFD8F JC
004AFD94
0167:004AFD91 JNC 004AFD94
0167:004AFD94 MOV [EBP+00433C37],BX
《————C18C送入4dc9e0中
0167:004AFD9B PUSHF
0167:004AFD9C
PUSH BYTE +03
0167:004AFD9E JNC 004AFDAB
0167:004AFE18 MOV [ESI+18],AX
《————这时eax==4dcca5,esi=800b0000,AX=CCA5
0167:004AFE1C PUSHF
0167:004AFE1D PUSH BYTE +03
0167:004AFE1F JNC
004AFE2C
0167:004AFE49 SHR EAX,10
0167:004AFE4C JZ 004AFE51
0167:004AFE51 MOV [ESI+1E],AX
《————esi=800b0000,AX=004D
0167:004AFE55 JPE
004AFE5A
这中间有一段解码,不断写页面。。。。当来到下面
0167:004B00BF INT3
0167:004B00C0 PUSHF
0167:004B00C1 JC
004B00CD
这时会通过int3进入Ring0.入口就在4dcca5处。进入Ring0后,会来到以下地方:
004DCFB9 XOR EAX,EAX
004DCFBB PUSHF
004DCFE8
MOV DR0,EAX
004DD018 MOV DR1,EAX
004DD048 MOV DR2,EAX
004DD050 MOV DR3,EAX
004DD06A MOV EAX,0155
004DD09C
MOV DR7,EAX
004DD0D2 IRET 《————从这里出来回到Ring3
出来后,会反复循环在Ring0和Ring3之间,不断解码写页面,最后好像是造成页面错误,产生异常又进入上面的异常处理例程中4dca77
回到正常例程后,还有一些异常处理,跟上面的差不多。最后来到这里:
0167:004D4F72 C3
RET
看看stack中,程序将会到00748f8f中,当到这里:
0167:0074930C 837A08FF CMP
DWORD [EDX+08],BYTE -01 《————edx=816477c8,此时可不能让[EDX+08]==-1
0167:00749310
9C PUSHF
0167:00749311
6A03 PUSH BYTE +03
0167:00749313 730B JNC
00749320
0167:0074933D 7563
JNZ 007493A2 《————这里必须跳
之后会来到:
0167:007494A3 803E00
CMP BYTE [ESI],00 《————注意这里
0167:007494A6 7403
JZ 007494AB
0167:007494A8
7501 JNZ 007494AB
在7494a3处,d esi,你会看到“\bw2k.\\.\SUPERBPM.\\.\ICEDUMP.\\.\TRW.\\.\TRWDEBUG.\\.\REGVXD.\\.\NTICE.\\.\SIWVID.\\.\SICE.\\.\FILEVXD”
在接下来的749449处,你千万不能跳的。
在接下去的代码中还有类似第一处的异常处理,很是麻烦的。需要耐心!当你来到74a56e处时:
0167:0074A56E 83F800 CMP
EAX,BYTE +00
0167:0074A571 7403
JZ 0074A576
0167:0074A573 7501
JNZ 0074A576
这里以下的代码就是重定位、破坏import.
这些搞完后,还有一些异常处理,需要耐心啊。最后来到下面:
0167:0074BCC3 JMP
EAX <----eax==4887ec
0167:0074BCC5 JC
0074BCCA
0167:0074BCC7 JNC 0074BCCA
0167:0074BCC9
JNZ 0074BD33
0167:0074BCCB CDQ
0167:0074BCCC ADD [EAX],EAX
呵呵。。总算到达oep了。
0167:004887EC 55 PUSH
EBP
0167:004887ED 8BEC MOV
EBP,ESP
0167:004887EF 83C4EC
ADD ESP,BYTE -14
0167:004887F2 33C0
XOR EAX,EAX
0167:004887F4 8945F0
MOV [EBP-10],EAX
0167:004887F7
8945EC MOV [EBP-14],EAX
0167:004887FA B8CC854800 MOV EAX,004885CC
0167:004887FF E854D2F7FF CALL 00405A58
啊,总是走完了,人也搞得糊里糊涂的。。。
谢谢你看完这篇罗里罗嗦地帖子。
望d.boy大侠及各位多多指教!!!
- 标 题:幻影2.0测试版的Anti-debug (6千字)
- 作 者:玉川
- 时 间:2002-4-4
22:07:09
- 链 接:http://bbs.pediy.com