【破文标题】ASProtect 2.1x SKE之木马克星5.50 build 2403 脱壳分析
【破文作者】lchhome
【作者邮箱】lchhome@163.com
【作者主页】http://lchhome.ys168.com
【破解工具】OD、Imp
【破解平台】WinXP
【软件名称】木马克星5.50 build 2403
【软件大小】1.07MB
【原版下载】
【保护方式】ASProtect 2.1x SKE -> Alexey Solodovnikov
【软件简介】
【破解声明】仅供学习
------------------------------------------------------------------------
脱Aspr的步骤如下:
1、找到IAT处理所在,并设法避开其加密;
2、寻觅oep,并对所有对壳的调用进行处理;
3、dump后直接修复stolen code;
要得到IAT表,先要得到一些数据:
1、它把jmp xxxxxxxx变成CAll xxxxxxxx形式;
2、IAT的大致地方在何处;
3、IAT是否加密。
分析好了,就按部就班吧!
一、OD不忽略内存访问异常,其余全忽略,隐藏OD,载入程序:
<ModuleEn> 68 01806400 PUSH iparmor.00648001 停在这里,F9运行
00401005 E8 01000000 CALL iparmor.0040100B
0040100A C3 RETN
按Shift+F9运行到最后一次异常:
012EFAA5 C700 EFCA5C85 MOV DWORD PTR DS:[EAX],855CCAEF 中断在这里
012EFAAB 67:64:8F06 0000 POP DWORD PTR FS:[0]
012EFAB1 83C4 04 ADD ESP,4
012EFAB4 83E8 AF SUB EAX,-51
按Alt+M,在00401000 CODE段下F2断点,Shift+F9运行:
005A4524 55 PUSH EBP 这就是OEP处
005A4525 8BEC MOV EBP,ESP
005A4527 B9 04000000 MOV ECX,4
005A452C 6A 00 PUSH 0
005A452E 6A 00 PUSH 0
005A4530 49 DEC ECX
005A4531 ^ 75 F9 JNZ SHORT iparmor.005A452C
好的,按Ctrl+B,搜索一下FF 25,会找到:
004012AC - FF25 5CC35C00 JMP DWORD PTR DS:[5CC35C] ; kernel32.CreateFileA
004012B2 8BC0 MOV EAX,EAX
004012B4 E8 47ED1201 CALL 01530000 这里可看出,它把jmp xxxxxxxx变成CAll 01530000形式
在命令行下 dd 5cc35c,在数据区可看到:
005CC2A8 9460A627
005CC2AC 7C93188A ntdll.RtlDeleteCriticalSection
005CC2B0 7C9210ED ntdll.RtlLeaveCriticalSection
005CC2B4 7C921005 ntdll.RtlEnterCriticalSection
005CC2B8 7C809FA1 kernel32.InitializeCriticalSection
005CC2BC 7C809B14 kernel32.VirtualFree
005CC2C0 7C809A81 kernel32.VirtualAlloc
005CC2C4 7C80995D kernel32.LocalFree
005CC2C8 7C8099BD kernel32.LocalAlloc
005CC2CC 7C809794 kernel32.InterlockedDecrement
005CC2D0 7C80977B kernel32.InterlockedIncrement
005CC2D4 7C80B859 kernel32.VirtualQuery
005CC2D8 7C80A0C7 kernel32.WideCharToMultiByte
005CC2DC B5693000 可知IAT已加密,不加密的IAT函数之间是用00000000隔开的
005CC2E0 7C809CAD kernel32.MultiByteToWideChar
005CC348 7C81EAE1 kernel32.RaiseException
005CC34C 5993DFD3
005CC350 15231CEE
005CC354 1D38E0DE
从上面可以看IAT已加密!OK!这里得到了这几个数据后,重来吧!Ctrl+F2重载后,在数据区,去5CC200跟随:
005CC200 88354C5A 注意变化
005CC204 5D166687
005CC208 A25C556C
005CC20C D6DB7D5E
005CC210 3936FF34
005CC214 ACED3A65
按Shift+F9继续运行N次后,
005CC200 4CABE4CE 已变了 ,第一次变化
005CC204 CEA68995
005CC208 75D1396B
005CC20C 8CBC3B56
005CC210 111443CC
005CC214 727A3D19
005CC218 B99BA8C2
继续运行
005CC200 001CF8FC 变成这样,第二次变化
005CC204 001CCCC0
005CC208 00000000
005CC20C 00000000
005CC210 00000000
005CC214 001CF914
再按Shift+F9一次:
012EEA55 C601 B6 MOV BYTE PTR DS:[ECX],0B6 停在这里
012EEA58 6323 ARPL WORD PTR DS:[EBX],SP
012EEA5A DEAA B86B9C6B FISUBR WORD PTR DS:[EDX+6B9C6BB8]
右键点搜索字符参考,找“85”,来到:
012EEBF6 /EB 0A JMP SHORT 012EEC02
012EEBF8 |68 E8F42E01 PUSH 12EF4E8 ; ASCII "85" 这是ASProtect 2.1x一个特有标志
012EEBFD |E8 2A62FEFF CALL 012D4E2C
012EEC02 \A1 1C372F01 MOV EAX,DWORD PTR DS:[12F371C]
012EEC07 8B00 MOV EAX,DWORD PTR DS:[EAX]
012EEC09 E8 0A8CFFFF CALL 012E7818
012EEC0E 84C0 TEST AL,AL
012EEC10 75 0A JNZ SHORT 012EEC1C
012EEC12 68 E8F42E01 PUSH 12EF4E8 ; ASCII "85"
012EEC17 E8 1062FEFF CALL 012D4E2C
在012EEC09句下F2断点,Shift+F9运行,中断在此,然后F7跟进,然后按滚动条往下找到:
012E795A E8 59FCFFFF CALL 012E75B8 这个CALL是进行IAT处理,F4,然后F7跟进
012E795F 0FB707 MOVZX EAX,WORD PTR DS:[EDI]
012E7962 83C0 02 ADD EAX,2
012E7965 03F8 ADD EDI,EAX
012E7967 8A1F MOV BL,BYTE PTR DS:[EDI]
012E7969 47 INC EDI
012E796A 3A5E 34 CMP BL,BYTE PTR DS:[ESI+34]
012E796D ^ 0F85 77FFFFFF JNZ 012E78EA 每个DLL的函数是否处理
012E7973 8BDF MOV EBX,EDI
012E7975 8B03 MOV EAX,DWORD PTR DS:[EBX]
012E7977 85C0 TEST EAX,EAX
012E7979 ^ 0F85 0AFFFFFF JNZ 012E7889 比较DLL是否处理完
012E797F 8A0424 MOV AL,BYTE PTR SS:[ESP]
012E7982 83C4 0C ADD ESP,0C
012E7985 5D POP EBP
012E7986 5F POP EDI
012E7987 5E POP ESI
012E7988 5B POP EBX
012E7989 C3 RETN
跟进后,找到:
012E75EA /EB 01 JMP SHORT 012E75ED
012E75EC |6933 C08A433B IMUL ESI,DWORD PTR DS:[EBX],3B438AC0
012E75F2 3BF0 CMP ESI,EAX 这里下F2中断后,然后 F9运行
012E75F4 75 5E JNZ SHORT 012E7654 这里要修改
012E75F6 EB 01 JMP SHORT 012E75F9
在012E75F2句下断运行,注意数据区,可以看出ESI有17、42、AA三个值,其中17、AA不加密,只有42加密,把42
改为AA即可,好!在012E75F4句修改,先用HideOD申请一个内存空间,我的是01640000,把012E75F4改为:
012E75F4 - E9 078A3500 JMP 01640000 然后下F2断点,F7跟进,
再把修改代码写进去:
01640000 - 0F84 F375CAFF JE 012E75F9 下F2断点,F9运行
01640006 81FE AA000000 CMP ESI,0AA
0164000C - 0F84 4276CAFF JE 012E7654
01640012 BE AA000000 MOV ESI,0AA
01640017 - E9 3876CAFF JMP 012E7654
在数据区去5CC2A4跟随,看看,就可以很明显的看出IAT的原先面目,它的起始地址:5CC2A4,结束地址:5CCD54
大小:AB0,得到了IAT表后,撤消所有原先的修改,恢复原状后,在012E75F4句新建EIP,按Shift+F9运行,来到
最后一次异常:
012EFAA5 C700 EFCA5C85 MOV DWORD PTR DS:[EAX],855CCAEF
012EFAAB 67:64:8F06 0000 POP DWORD PTR FS:[0]
012EFAB1 83C4 04 ADD ESP,4
012EFAB4 83E8 AF SUB EAX,-51
滚动条往下找:
012EFBFA E8 B5D0FFFF CALL 012ECCB4 下断,F7跟进,
012EFBFF 83C4 2C ADD ESP,2C
012EFC02 5D POP EBP
012EFC03 5F POP EDI
012EFC04 5E POP ESI
012EFC05 5B POP EBX
012EFC06 C3 RETN
然后按F7往下走到:
012ECDAF 2BF1 SUB ESI,ECX
012ECDB1 56 PUSH ESI
012ECDB2 BE F2E34800 MOV ESI,48E3F2
012ECDB7 BE EA774A00 MOV ESI,4A77EA
012ECDBC C3 RETN 来到这里,但是返回到壳中的OEP,
下04010000 CODE段内存断点可以到达真OEP,再返回到012ECDBC句,搜索一下89,45,F0,B8,00,07,00,00 到达这里:
012E7188 8945 F0 MOV DWORD PTR SS:[EBP-10],EAX
012E718B B8 00070000 MOV EAX,700
012E7190 E8 B7B3FDFF CALL 012C254C 这里要修改
012E7195 8945 E4 MOV DWORD PTR SS:[EBP-1C],EAX
012E7198 C645 EF 00 MOV BYTE PTR SS:[EBP-11],0
就用刚才申请的内存空间01640000,012E7190句修改为:
012E7190 - E9 A28E3500 JMP 01640037
然后写下如何代码:
01640000 BA 00104000 MOV EDX,4010000 写好代码后,在这下F2断点,F9运行一下
01640005 803A E8 CMP BYTE PTR DS:[EDX],0E8
01640008 75 12 JNZ SHORT 0164001C
0164000A 8B42 01 MOV EAX,DWORD PTR DS:[EDX+1]
0164000D 03C2 ADD EAX,EDX
0164000F 83C0 05 ADD EAX,5
01640012 3D 00005301 CMP EAX,1530000
01640017 75 03 JNZ SHORT 0164001C
01640019 EB 0C JMP SHORT 01640027
0164001B 90 NOP
0164001C 42 INC EDX
0164001D 81FA 00505A00 CMP EDX,5A5000
01640023 ^ 72 E0 JB SHORT 01640005
01640025 - EB FE JMP SHORT 01640025
01640027 8915 00015801 MOV DWORD PTR DS:[1640100],EDX
0164002D 60 PUSHAD
0164002E FFE2 JMP EDX
01640030 90 NOP
01640031 90 NOP
01640032 90 NOP
01640033 90 NOP
01640034 90 NOP
01640035 90 NOP
01640036 90 NOP
01640037 60 PUSHAD
01640038 B8 A8C25C00 MOV EAX,5CC2A8
0164003D 90 NOP
0164003E 3910 CMP DWORD PTR DS:[EAX],EDX
01640040 75 20 JNZ SHORT 01640062
01640042 8B0D 00015801 MOV ECX,DWORD PTR DS:[1640100]
01640048 C701 FF250000 MOV DWORD PTR DS:[ECX],25FF
0164004E 8941 02 MOV DWORD PTR DS:[ECX+2],EAX
01640051 61 POPAD
01640052 90 NOP
01640053 8B15 00015801 MOV EDX,DWORD PTR DS:[1640100]
01640059 90 NOP
0164005A 90 NOP
0164005B 90 NOP
0164005C ^ EB BE JMP SHORT 0164001C
0164005E 90 NOP
0164005F 90 NOP
01640060 90 NOP
01640061 90 NOP
01640062 83C0 04 ADD EAX,4
01640065 3D 50CD5C00 CMP EAX,5CCD50
0164006A ^ 7E D2 JLE SHORT 0164003E
0164006C ^ EB E3 JMP SHORT 01640051
0164006E 90 NOP
0164006F 90 NOP
然后到OEP处,用OD插件脱壳,再用Imp修复,填上OEP=1A4524,点IAT自动搜索,获得输入信息,全部为有效指针
,修复抓取文件。
运行脱壳文件,发现它不能正常运行,晕!
用OD载入修复后的文件,按F9运行,程序出现异常,看堆栈区:
0013F984 0040E110 返回到 dumped_.0040E110 来自 dumped_.0040A824 ,右键反汇编中跟随
0013F988 00000007
0013F98C 0013F9B0
0040E10B |. E8 14C7FFFF CALL dumped_.0040A824 是这个CALL出错,跟进
0040E110 |. 8BD8 MOV EBX,EAX 停在这
0040A824 - E9 D7571601 JMP 01570000 来到这,它又跳回壳去了,要改!这里来个狸猫换太子
随便找个retn就行了,按Ctrl+F,输入“retn",找到004012A7句,OK!把它改了,改成:
0040A824 ^\E9 7E6AFFFF JMP dumped_.004012A7
保存文件!再运行,一切OK了!
------------------------------------------------------------------------
------------------------------------------------------------------------
【版权声明】属于lchhome所有,支持正版!
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课