[LEFT][/LEFT] 先说明一下概况,被解剖的程序是[完美泡泡v464]这个外挂,壳是nSPack 2.X
鉴于这个壳比较容易干掉,所以不会麻烦到各位高人.脱壳之后直接运行外挂,登录试用账号挂机毫无问题.然而正准备用OD跟踪运行的时候问题来了.OD载入外挂后F9,外挂照常运行自动更新.但在更新检查完之后却自己调用ExitProcess了.
第一时间想到的是程序自校检,可是很快被自己否定了.自校验的话应该无论是否用OD载入都存在,直接运行外挂能正常试用说明了脱壳正确和没明显自校验特征. 因此怀疑是检测OD进程,但用插件将OD进程和窗口标题都隐藏了之后问题依旧.因为自己是破解新手,可以说0经验起步,对这个问题无从入手. 无意间拜读了一下laomms兄的[常见自校检分析实例],觉得还是有点机会,所以决定F8到底.
首先贴出来一下: 如下
=======================================================
0048E818 > $ 55 PUSH EBP //脱壳后的程序开始处
0048E819 . 8BEC MOV EBP,ESP
0048E81B . 83C4 F0 ADD ESP,-10
0048E81E . B8 88E44800 MOV EAX,unpacked.0048E488
0048E823 . E8 3C77F7FF CALL unpacked.00405F64
0048E828 . A1 641D4900 MOV EAX,DWORD PTR DS:[491D64]
0048E82D . 8B00 MOV EAX,DWORD PTR DS:[EAX]
0048E82F . E8 A0A8FCFF CALL unpacked.004590D4
0048E834 . A1 641D4900 MOV EAX,DWORD PTR DS:[491D64]
0048E839 . 8B00 MOV EAX,DWORD PTR DS:[EAX]
0048E83B . BA 90E84800 MOV EDX,unpacked.0048E890
0048E840 . E8 87A4FCFF CALL unpacked.00458CCC
0048E845 . 8B0D D8194900 MOV ECX,DWORD PTR DS:[4919D8]
0048E84B . A1 641D4900 MOV EAX,DWORD PTR DS:[491D64]
0048E850 . 8B00 MOV EAX,DWORD PTR DS:[EAX]
0048E852 . 8B15 04D54800 MOV EDX,DWORD PTR DS:[48D504]
0048E858 . E8 8FA8FCFF CALL unpacked.004590EC
0048E85D . 8B0D 4C1F4900 MOV ECX,DWORD PTR DS:[491F4C]
0048E863 . A1 641D4900 MOV EAX,DWORD PTR DS:[491D64]
0048E868 . 8B00 MOV EAX,DWORD PTR DS:[EAX]
0048E86A . 8B15 30CD4800 MOV EDX,DWORD PTR DS:[48CD30]
0048E870 . E8 77A8FCFF CALL unpacked.004590EC
0048E875 . A1 641D4900 MOV EAX,DWORD PTR DS:[491D64]
0048E87A . 8B00 MOV EAX,DWORD PTR DS:[EAX]
0048E87C . E8 EBA8FCFF CALL unpacked.0045916C //#1 个人觉得比较关键的两个Call,这个是启动更新程序检测版本
0048E881 . E8 4E56F7FF CALL unpacked.00403ED4 //#2 ExitProcess所在的call
0048E886 . 0000 ADD BYTE PTR DS:[EAX],AL
0048E888 FF DB FF
0048E889 FF DB FF
0048E88A FF DB FF
一般来说程序拼命重复的那个地方就是开始,第1个标示(#1)是启动更新程序的call,F8这句之后外挂开始自动检测更新,因为解剖的是最新版所以不会更新文件,在检查过后就自己动关闭了更新程序但并不退出外挂.而第2个call单步过后程序Exit,决定[F7]跟进去.
F7后的程序:(长了点 别见怪)
=================================================
00403ED4 /$ 53 PUSH EBX
00403ED5 |. 56 PUSH ESI
00403ED6 |. 57 PUSH EDI
00403ED7 |. 55 PUSH EBP
00403ED8 |. BB 34264900 MOV EBX,unpacked.00492634
00403EDD |. BE 00F04800 MOV ESI,unpacked.0048F000
00403EE2 |. BF 44204900 MOV EDI,unpacked.00492044
00403EE7 |. 807B 28 00 CMP BYTE PTR DS:[EBX+28],0
00403EEB |. 75 16 JNZ SHORT unpacked.00403F03
00403EED |. 833F 00 CMP DWORD PTR DS:[EDI],0
00403EF0 |. 74 11 JE SHORT unpacked.00403F03
00403EF2 |> 8B17 /MOV EDX,DWORD PTR DS:[EDI]
00403EF4 |. 89D0 |MOV EAX,EDX
00403EF6 |. 33D2 |XOR EDX,EDX
00403EF8 |. 8917 |MOV DWORD PTR DS:[EDI],EDX
00403EFA |. 8BE8 |MOV EBP,EAX
00403EFC |. FFD5 |CALL EBP
00403EFE |. 833F 00 |CMP DWORD PTR DS:[EDI],0
00403F01 |.^75 EF \JNZ SHORT unpacked.00403EF2
00403F03 |> 833D 04F04800 >CMP DWORD PTR DS:[48F004],0
00403F0A |. 74 11 JE SHORT unpacked.00403F1D
00403F0C |. E8 ABFEFFFF CALL unpacked.00403DBC
00403F11 |. E8 32FFFFFF CALL unpacked.00403E48
00403F16 |. 33C0 XOR EAX,EAX
00403F18 |. A3 04F04800 MOV DWORD PTR DS:[48F004],EAX
00403F1D |> 807B 28 02 /CMP BYTE PTR DS:[EBX+28],2
00403F21 |. 75 0A |JNZ SHORT unpacked.00403F2D
00403F23 |. 833E 00 |CMP DWORD PTR DS:[ESI],0
00403F26 |. 75 05 |JNZ SHORT unpacked.00403F2D
00403F28 |. 33C0 |XOR EAX,EAX
00403F2A |. 8943 0C |MOV DWORD PTR DS:[EBX+C],EAX
00403F2D |> E8 1AFDFFFF |CALL unpacked.00403C4C
00403F32 |. 807B 28 01 |CMP BYTE PTR DS:[EBX+28],1
00403F36 |. 76 05 |JBE SHORT unpacked.00403F3D
00403F38 |. 833E 00 |CMP DWORD PTR DS:[ESI],0
00403F3B |. 74 21 |JE SHORT unpacked.00403F5E
00403F3D |> 8B43 10 |MOV EAX,DWORD PTR DS:[EBX+10]
00403F40 |. 85C0 |TEST EAX,EAX
00403F42 |. 74 1A |JE SHORT unpacked.00403F5E
00403F44 |. E8 2F180000 |CALL unpacked.00405778
00403F49 |. 8B53 10 |MOV EDX,DWORD PTR DS:[EBX+10]
00403F4C |. 8B42 10 |MOV EAX,DWORD PTR DS:[EDX+10]
00403F4F |. 3B42 04 |CMP EAX,DWORD PTR DS:[EDX+4]
00403F52 |. 74 0A |JE SHORT unpacked.00403F5E
00403F54 |. 85C0 |TEST EAX,EAX
00403F56 |. 74 06 |JE SHORT unpacked.00403F5E
00403F58 |. 50 |PUSH EAX ; /hLibModule
00403F59 |. E8 06D3FFFF |CALL <JMP.&kernel32.FreeLibrary> ; \FreeLibrary
00403F5E |> E8 C1FCFFFF |CALL unpacked.00403C24
00403F63 |. 807B 28 01 |CMP BYTE PTR DS:[EBX+28],1
00403F67 |. 75 03 |JNZ SHORT unpacked.00403F6C
00403F69 |. FF53 24 |CALL DWORD PTR DS:[EBX+24]
00403F6C |> 807B 28 00 |CMP BYTE PTR DS:[EBX+28],0
00403F70 |. 74 05 |JE SHORT unpacked.00403F77
00403F72 |. E8 A1FEFFFF |CALL unpacked.00403E18
00403F77 |> 833B 00 |CMP DWORD PTR DS:[EBX],0
00403F7A |. 75 17 |JNZ SHORT unpacked.00403F93 //这个地方跳过Exit,但一改JMP就出错,郁闷
00403F7C |. 833D 24204900 >|CMP DWORD PTR DS:[492024],0
00403F83 |. 74 06 |JE SHORT unpacked.00403F8B
00403F85 |. FF15 24204900 |CALL DWORD PTR DS:[492024]
00403F8B |> 8B06 |MOV EAX,DWORD PTR DS:[ESI]
00403F8D |. 50 |PUSH EAX ; /ExitCode
00403F8E |. E8 B1D2FFFF |CALL <JMP.&kernel32.ExitProcess> ; \ExitProcess
00403F93 |> 8B03 |MOV EAX,DWORD PTR DS:[EBX]
00403F95 |. 56 |PUSH ESI
00403F96 |. 8BF0 |MOV ESI,EAX
00403F98 |. 8BFB |MOV EDI,EBX
00403F9A |. B9 0B000000 |MOV ECX,0B
00403F9F |. F3:A5 |REP MOVS DWORD PTR ES:[EDI],DWORD PTR D> //来到这里会程序异常 无法继续 已经忽略所有错误
00403FA1 |. 5E |POP ESI
00403FA2 \.^E9 76FFFFFF \JMP unpacked.00403F1D
00403FA7 . 5D POP EBP
00403FA8 . 5F POP EDI
很明显看到ExitProcess的地方,本来把它跳开就完事了,但改了好几个地方都没办法继续运行下去老是出错. 所以请各位仁兄给点提示,并且尽可能说得容易明白&详尽.毕竟我才学了3天,以前的汇编基础也一般般,弄起来蛮辛苦的. 先谢过各位了.
[培训]科锐逆向工程师培训第53期2025年7月8日开班!