一个哥们给的文件,让我练习:
查壳工具查出是仙剑的壳,第二层ASPack的壳。:
先找OEP :载入文件
004E2060 > 55 PUSH EBP
004E2061 8BEC MOV EBP,ESP
004E2063 6A FF PUSH -1
004E2065 68 3E1E4000 PUSH 1.00401E3E
004E206A 68 521E4000 PUSH 1.00401E52
004E206F 64:A1 00000000 MOV EAX,DWORD PTR FS:[0]
004E2075 50 PUSH EAX
004E2076 64:8925 0000000>MOV DWORD PTR FS:[0],ESP
004E207D 83EC 44 SUB ESP,44
004E2080 53 PUSH EBX
004E2081 56 PUSH ESI
-------------------//仙剑伪装c++
不忽略内存异常,用最后一次异常法:
看堆栈:
0012FF50 0012FF80 指向下一个 SEH 记录的指针
0012FF54 00DA68B7 SE处理程序
0012FF58 00000000
在00DA68B7下内存访问断点shift+F9
00DA68B7 57 PUSH EDI //断在这里
00DA68B8 50 PUSH EAX
00DA68B9 13FD ADC EDI,EBP
00DA68BB 8B7C24 14 MOV EDI,DWORD PTR SS:[ESP+14]
00DA68BF 83E0 00 AND EAX,0
00DA68C2 50 PUSH EAX
00DA68C3 26:EB 02 JMP SHORT 00DA68C8 ; 多余的前缀
打开内存窗口在代码段 00401000下断点:然后一路F8:
004C2068 8A0439 MOV AL,BYTE PTR DS:[ECX+EDI] //断在这里
004C206B C0C8 04 ROR AL,4
004C206E 34 1B XOR AL,1B
004C2070 880439 MOV BYTE PTR DS:[ECX+EDI],AL
004C2073 41 INC ECX
004C2074 3BCA CMP ECX,EDX
004C2076 ^ 72 F0 JB SHORT 1.004C2068
004C2078 58 POP EAX
004C2079 83C0 08 ADD EAX,8
004C207C ^ EB D5 JMP SHORT 1.004C2053
004C207E 61 POPAD // 在这F2 然后F9运行,断下
004C207F - E9 152CFBFF JMP 1.00474C99 //OEP
到达OEP:
00474C99 55 PUSH EBP //oep好像加了花指令,不过深度扫描可以
00474C9A 8BEC MOV EBP,ESP //查出:Borland Delphi 6.0 - 7.0写的
00474C9C 90 NOP
00474C9D 90 NOP
00474C9E 90 NOP
00474C9F 52 PUSH EDX
00474CA0 5A POP EDX
00474CA1 7F 66 JG SHORT 1.00474D09
00474CA3 7E 64 JLE SHORT 1.00474D09
00474CA5 0000 ADD BYTE PTR DS:[EAX],AL
进call找函数:
004A8264 7C81CB12 kernel32.ExitProcess //发现 被加密了
004A8268 01190000
004A826C 011A0000
004A8270 011B0000
004A8274 011C0000
004A8278 7C810C2E kernel32.SetFilePointer
004A827C 011D0000
004A8280 011E0000
004A8284 7C801812 kernel32.ReadFile
004A8288 7C812AA9 kernel32.RaiseException
004A828C 011F0000
004A8290 01200000
重新载入找加密点:
命令窗口输入 dd 4a8264 然后下内存断点shift+F9几次 :断下 可以看出开始写入第一个函数了~
00D9CACB 8902 MOV DWORD PTR DS:[EDX],EAX ; kernel32.ExitProcess
00D9CACD EB 01 JMP SHORT 00D9CAD0
00D9CACF - E9 8B450C83 JMP 83E6105F
00D9CAD4 00045F ADD BYTE PTR DS:[EDI+EBX*2],AL
00D9CAD7 5E POP ESI
00D9CAD8 5B POP EBX
F8单步
00D9CB68 AC LODS BYTE PTR DS:[ESI] //此开始处循环出来
00D9CB69 80F8 00 CMP AL,0
00D9CB6C ^ 74 E0 JE SHORT 00D9CB4E
00D9CB6E 80F8 01 CMP AL,1
00D9CB71 75 06 JNZ SHORT 00D9CB79
00D9CB73 8345 F4 04 ADD DWORD PTR SS:[EBP-C],4
00D9CB77 ^ EB EF JMP SHORT 00D9CB68
00D9CB79 53 PUSH EBX
00D9CB7A 56 PUSH ESI
00D9CB7B 53 PUSH EBX
00D9CB7C 8D5D F4 LEA EBX,DWORD PTR SS:[EBP-C]
00D9CB7F 53 PUSH EBX
00D9CB80 80F8 05 CMP AL,5
00D9CB83 74 06 JE SHORT 00D9CB8B
00D9CB85 0FB60E MOVZX ECX,BYTE PTR DS:[ESI]
00D9CB88 41 INC ECX
00D9CB89 EB 05 JMP SHORT 00D9CB90
00D9CB8B B9 04000000 MOV ECX,4
00D9CB90 01CE ADD ESI,ECX
00D9CB92 FF75 F0 PUSH DWORD PTR SS:[EBP-10]
00D9CB95 E8 36FEFFFF CALL 00D9C9D0 //关键CALL 里面出来指针是否加密,跟进
00D9CB9A 5B POP EBX ; 00DD5D80
00D9CB9B ^ EB CB JMP SHORT 00D9CB68
---------------------------------------
00D9C9E5 33DB XOR EBX,EBX //ebx清零
00D9C9E7 8A18 MOV BL,BYTE PTR DS:[EAX]
00D9C9E9 8D85 FCFEFFFF LEA EAX,DWORD PTR SS:[EBP-104]
00D9C9EF 33C9 XOR ECX,ECX
00D9C9F1 BA 00010000 MOV EDX,100
00D9C9F6 E8 A95EFEFF CALL 00D828A4
00D9C9FB EB 01 JMP SHORT 00D9C9FE //call后此处EBx=6则不加密
00D9C9FE 8BC3 MOV EAX,EBX
00D9CA00 83E8 02 SUB EAX,2
00D9CA03 74 13 JE SHORT 00D9CA18 //发现此处不跳下个JE也不跳JB跳则不加密
00D9CA05 48 DEC EAX
00D9CA06 74 6F JE SHORT 00D9CA77
00D9CA08 83C0 FE ADD EAX,-2
00D9CA0B 83E8 02 SUB EAX,2
00D9CA0E 72 67 JB SHORT 00D9CA77
00D9CA10 E9 BB000000 JMP 00D9CAD0
00D9CA15 EB 01 JMP SHORT 00D9CA18
-------------------------
手动修改后发现只能读取几个函数, 其他都写入0000000
试过好多方法,CALL都跟进。 还是没发现怎么跳过函数 加密 : 希望 高手指点~~谢谢。
本人菜鸟刚学脱壳,这是第一次写文章没表达清楚之处望见谅
[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法