【脱壳文件】自己写的一个加载DLL的DD(Delphi写的)
【下载地址】见附件
【加壳方式】ASProtect 2.3 SKE Build 03.19 Beta 除了Protect Original EntryPoint全部选项
【作 者】h_f22
【作者声明】水平很菜 请高手们多指教
【调试环境】WinXPSP2、OllyDBD110、LordPE、ImportREC
【脱壳过程】见下
一、前言
关于Aspr的文章论坛里面已经不少,各位大虾也都基本上把它研究透了。写此文的目的只在于自己学习
和给跟我有相同问题的人一点提示。
Aspr变得越来越强,从没有stolen code到在OEP处偷一点,再到OEP处偷一堆,现在他终于在别处也开始偷了.等一下我们将看到在这个版本的Aspr中出现了一个的stolen code(不是stolen OEP),虽然他只偷了一个函数,也很容易找回来,但是这只是Beta版,正式版的时候又会是什么样呢?也许Aspr要变成超级猛壳了。
加壳用的Aspr2.3时在工具区下载的。程序是自己用Delphi写的一个加载DLL的小工具。
二、加壳方式
除了Protect Original EntryPoint(就是stolen OEP)以外的全部选项,虽然没选这个选项,Aspr却在别的地方偷了一点儿。
三、过程
1、找到OEP和IAT
这个过程很简单。首先用OD加载目标程序,忽略除了INT3以外的全部异常,F9运行,停在第二个异常处,在内存映像中找到程序的代码段,下内存访问断点F2,运行,即停在OEP。
0045AF16 00 db 00
0045AF17 00 db 00
0045AF18 14AD4500 dd Project1.0045AD14
0045AF1C . 55 push ebp //OEP ; Project1.00400000
0045AF1D . 8BEC mov ebp, esp
0045AF1F . 83C4 F0 add esp, -10
0045AF22 . B8 3CAD4500 mov eax, 0045AD3C
0045AF27 . E8 E0B1FAFF call 0040610C
0045AF2C . A1 F4C04500 mov eax, [45C0F4]
0045AF31 . 8B00 mov eax, [eax]
0045AF33 . E8 08E3FFFF call 00459240
0045AF38 . 8B0D D8C14500 mov ecx, [45C1D8] ; Project1.0045DC04
0045AF3E . A1 F4C04500 mov eax, [45C0F4]
0045AF43 . 8B00 mov eax, [eax]
0045AF45 . 8B15 B4A84500 mov edx, [45A8B4] ; Project1.0045A900
004011FD . 626A 65 bound ebp, [edx+65]
00401200 . 63748B C0 arpl [ebx+ecx*4-40], si
00401204 $ E8 F7ED1501 call 01560000 //Advance Import protection的处理函数
00401209 14 db 14
0040120A 8BC0 mov eax, eax
0040120C .- FF25 ACE14500 jmp [45E1AC] //45E1AC就是IAT的某个地址了
00401212 . 8BC0 mov eax, eax
00401214 .- FF25 A8E14500 jmp [45E1A8] ; ntdll.RtlUnwind
0040121A . 8BC0 mov eax, eax
0040121C $- FF25 A4E14500 jmp [45E1A4] ; kernel32.UnhandledExceptionFilter
00401222 . 8BC0 mov eax, eax
00401224 . E8 D7ED1501 call 01560000
00401229 . E4 8B in al, 8B
0040122B . C0FF 25 sar bh, 25
0040122E ? C4E1 les esp, ecx ; 非法使用寄存器
00401230 ? 45 inc ebp
00401231 ? 008B C0FF259C add [ebx+9C25FFC0], cl
00401237 ? E1 45 loopde short 0040127E
00401239 ? 008B C0E8BFED add [ebx+EDBFE8C0], cl
0040123F ? 15 012E8BC0 adc eax, C08B2E01
0045E0EC C0 E6 05 00 00 00 00 00 00 00 00 00 00 00 00 00 梨.............
0045E0FC 3A FF 05 00 E4 E6 05 00 00 00 00 00 00 00 00 00 :?.滏.........
0045E10C 00 00 00 00 48 01 06 00 44 E7 05 00 00 00 00 00 ....H.D?.....
0045E11C 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0045E12C 8A 18 93 7C ED 10 92 7C 05 10 92 7C A1 9F 80 7C ???????
0045E13C 14 9B 80 7C 81 9A 80 7C 5D 99 80 7C BD 99 80 7C ?|??]?|??
0045E14C AB 14 81 7C EA 28 C0 8B 94 97 80 7C 7B 97 80 7C ??????{?|
0045E15C 59 B8 80 7C C7 A0 80 7C AD 9C 80 7C F6 3D B4 E4 Y?|沁????翠
0045E16C 11 03 81 7C 73 F4 93 DC B0 C0 EB 01 4D 11 47 F7 ?s?馨离MG
00E3872E F3:A5 rep movs dword ptr es:[edi], dword >
00E38730 66:A5 movs word ptr es:[edi], word ptr [es>
00E38732 5E pop esi
00E38733 EB 0A jmp short 00E3873F
00E38735 68 C089E300 push 0E389C0 ; ASCII "85",CR,LF
00E3873A E8 C5CEFDFF call 00E15604
00E3873F A1 78B9E300 mov eax, [E3B978]
00E38744 8B00 mov eax, [eax]
00E38746 E8 410FFFFF call 00E2968C //F4到这里后F7步进
00E3874B 84C0 test al, al
00E3874D 75 0A jnz short 00E38759
00E3874F 68 C089E300 push 0E389C0 ; ASCII "85",CR,LF
00E38754 E8 ABCEFDFF call 00E15604
00E38759 A1 40BAE300 mov eax, [E3BA40]
00E3875E 8B40 04 mov eax, [eax+4]
00E38761 50 push eax
00E38762 56 push esi
00E38763 E8 3033FEFF call 00E1BA98
00E2979A /75 0A jnz short 00E297A6
00E2979C |68 F497E200 push 0E297F4 ; ASCII "180",CR,LF
00E297A1 |E8 5EBEFEFF call 00E15604
00E297A6 \834424 08 04 add dword ptr [esp+8], 4
00E297AB 47 inc edi
00E297AC EB 1A jmp short 00E297C8
00E297AE 83C7 02 add edi, 2
00E297B1 8BC7 mov eax, edi
00E297B3 50 push eax
00E297B4 55 push ebp
00E297B5 8D4424 10 lea eax, [esp+10]
00E297B9 50 push eax
00E297BA 56 push esi
00E297BB E8 6CFCFFFF call 00E2942C //F4到这里F7步入
00E297C0 0FB707 movzx eax, word ptr [edi]
00E297C3 83C0 02 add eax, 2
00E297C6 03F8 add edi, eax
00E297C8 8A1F mov bl, [edi]
00E297CA 47 inc edi
00E297CB 3A5E 34 cmp bl, [esi+34]
00E297CE ^ 0F85 77FFFFFF jnz 00E2974B
00E297D4 8BDF mov ebx, edi
00E297D6 8B03 mov eax, [ebx]
00E297D8 85C0 test eax, eax
00E297DA ^ 0F85 0AFFFFFF jnz 00E296EA
00E297E0 8A0424 mov al, [esp]
00E297E3 83C4 0C add esp, 0C
00E297E6 5D pop ebp
00E297E7 5F pop edi
00E297E8 5E pop esi
00E297E9 5B pop ebx
00E297EA C3 retn
00E29447 83E8 02 sub eax, 2
00E2944A 0FB630 movzx esi, byte ptr [eax]
00E2944D 8B45 10 mov eax, [ebp+10]
00E29450 83E8 02 sub eax, 2
00E29453 0FB600 movzx eax, byte ptr [eax]
00E29456 3B43 2C cmp eax, [ebx+2C]
00E29459 76 06 jbe short 00E29461
00E2945B 8943 2C mov [ebx+2C], eax
00E2945E EB 01 jmp short 00E29461
00E29460 6933 C08A433B imul esi, [ebx], 3B438AC0
00E29466 3BF0 cmp esi, eax //在这里下硬件断点
00E29468 75 5E jnz short 00E294C8 //这里改成jmp 01550000 跳到Patch代码中去
00E2946A EB 01 jmp short 00E2946D
00E2946C C7 ??? ; 未知命令
00E2946D 66:8B02 mov ax, [edx]
00E29470 66:8945 FA mov [ebp-6], ax
00E29474 83C2 02 add edx, 2
00E29477 8955 FC mov [ebp-4], edx
01550000 - 0F84 67948DFF je 00E2946D //第一种
01550006 81FE 82000000 cmp esi, 82
0155000C 0F84 0C000000 je 0155001E//第三种
01550012 81FE CF000000 cmp esi, 0CF
01550018 0F85 0A000000 jnz 01550028//不是前三种
0155001E BE CF000000 mov esi, 0CF
01550023 - E9 A0948DFF jmp 00E294C8
01550028 CC int3 //如果出现不是前三种情况会停在这里
01550029 ^ EB F3 jmp short 0155001E
0155002B 90 nop
8A 18 93 7C ED 10 92 7C 05 10 92 7C A1 9F 80 7C 14 9B 80 7C 81 9A 80 7C 5D 99 80 7C BD 99 80 7C
AB 14 81 7C 37 97 80 7C 94 97 80 7C 7B 97 80 7C 59 B8 80 7C C7 A0 80 7C AD 9C 80 7C E0 C6 80 7C
11 03 81 7C D3 2F 88 7C 05 A4 80 7C EE 1E 80 7C 28 AC 80 7C 29 B5 80 7C 57 B3 80 7C 7E D4 80 7C
8D 2C 81 7C 66 AA 80 7C 59 35 81 7C D7 EF 80 7C A2 CA 81 7C 9F 0F 81 7C 8A 2B 86 7C 40 7A 95 7C
E1 EA 81 7C A9 2C 81 7C 00 00 00 00 B3 11 D3 77 E8 0F D2 77 EA 04 D5 77 90 0F D2 77 00 00 00 00
83 78 DA 77 1B 76 DA 77 F0 6B DA 77 00 00 00 00 50 48 0F 77 9D C9 11 77 59 4B 0F 77 00 00 00 00
。。。。。。。
00FB0000 E8 00 00 00 00 5B 83 EB 05 8B 93 00 01 00 00 80 ?...[??...?
00FB0010 3A E8 0F 85 94 00 00 00 8B 42 01 03 C2 83 C0 05 :??...???
00FB0020 3B 83 18 01 00 00 0F 85 80 00 00 00 90 90 90 90 ;?..?...??
00FB0030 90 90 90 90 90 90 90 90 60 89 A3 08 01 00 00 FF ????`?..?
00FB0040 E2 E8 00 00 00 00 5B 83 EB 46 89 83 0C 01 00 00 忤....[?F?...
00FB0050 8B A3 08 01 00 00 61 8B 8B 10 01 00 00 8B 83 0C ?..a?..?.
00FB0060 01 00 00 39 01 0F 85 0D 00 00 00 66 C7 02 FF 25 ..9?...f??
00FB0070 89 4A 02 E9 34 00 00 00 83 C1 04 3B 8B 14 01 00 ??...?;?.
00FB0080 00 0F 82 DC FF FF FF FF 83 1C 01 00 00 90 90 90 .????..?
00FB0090 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 ????????
00FB00A0 90 90 90 90 90 90 90 90 90 90 90 90 42 3B 93 04 ??????B;?
00FB00B0 01 00 00 0F 82 56 FF FF FF EB FE 00 00 00 00 00 ..????....
00FB00C0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00FB00D0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00FB00E0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00FB00F0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00FB0100 00 10 40 00 FC AF 45 00 44 FF 12 00 1E 31 32 76 .@.?E.D?.12v
00FB0110 2C E1 45 00 44 E7 45 00 00 00 56 01 01 00 00 00 ,崤.D缗...V...
00FB0000 E8 00000000 call 00FB0005
00FB0005 5B pop ebx
00FB0006 83EB 05 sub ebx, 5 //用ebx取得代码所在地址 ebx是变量的基址
00FB0009 8B93 00010000 mov edx, [ebx+100]
00FB000F 803A E8 cmp byte ptr [edx], 0E8
00FB0012 0F85 94000000 jnz 00FB00AC //查找call xxxxxxx
00FB0018 8B42 01 mov eax, [edx+1]
00FB001B 03C2 add eax, edx
00FB001D 83C0 05 add eax, 5 //计算出call去哪里
00FB0020 3B83 18010000 cmp eax, [ebx+118] //比较一下是不是去AIP的call
00FB0026 0F85 80000000 jnz 00FB00AC //不是就继续找
00FB002C 90 nop //是就处理
00FB002D 90 nop
00FB002E 90 nop
00FB002F 90 nop
00FB0030 90 nop
00FB0031 90 nop
00FB0032 90 nop
00FB0033 90 nop
00FB0034 90 nop
00FB0035 90 nop
00FB0036 90 nop
00FB0037 90 nop
00FB0038 60 pushad
00FB0039 89A3 08010000 mov [ebx+108], esp //保存现场
00FB003F FFE2 jmp edx //去AIP的call
00FB0041 E8 00000000 call 00FB0046 //中断返回
00FB0046 5B pop ebx
00FB0047 83EB 46 sub ebx, 46 //重新取回变量基址
00FB004A 8983 0C010000 mov [ebx+10C], eax //保存解码出的API函数地址 这里如果是Aspr2.1的要把eax改成edx
00FB0050 8BA3 08010000 mov esp, [ebx+108]
00FB0056 61 popad //恢复现场
00FB0057 8B8B 10010000 mov ecx, [ebx+110] //在IAT中查到该API函数地址所在
00FB005D 8B83 0C010000 mov eax, [ebx+10C]
00FB0063 3901 cmp [ecx], eax
00FB0065 0F85 0D000000 jnz 00FB0078 //是否找到
00FB006B 66:C702 FF25 mov word ptr [edx], 25FF //找到就处理 这里要注意 一般Delphi都是jmp [xxxxx]就是 25FF
00FB0070 894A 02 mov [edx+2], ecx //不过也不完全一定,适当的时候要自己改成15FF
00FB0073 E9 34000000 jmp 00FB00AC //找到就继续下一个
00FB0078 83C1 04 add ecx, 4
00FB007B 3B8B 14010000 cmp ecx, [ebx+114] //是否IAT结束
00FB0081 ^ 0F82 DCFFFFFF jb 00FB0063
00FB0087 FF83 1C010000 inc dword ptr [ebx+11C] //结束说明没有找到 未找到API个数记录 变量+1
00FB008D 90 nop
00FB008E 90 nop
00FB008F 90 nop
00FB0090 90 nop
00FB0091 90 nop
00FB0092 90 nop
00FB0093 90 nop
00FB0094 90 nop
00FB0095 90 nop
00FB0096 90 nop
00FB0097 90 nop
00FB0098 90 nop
00FB0099 90 nop
00FB009A 90 nop
00FB009B 90 nop
00FB009C 90 nop
00FB009D 90 nop
00FB009E 90 nop
00FB009F 90 nop
00FB00A0 90 nop
00FB00A1 90 nop
00FB00A2 90 nop
00FB00A3 90 nop
00FB00A4 90 nop
00FB00A5 90 nop
00FB00A6 90 nop
00FB00A7 90 nop
00FB00A8 90 nop
00FB00A9 90 nop
00FB00AA 90 nop
00FB00AB 90 nop
00FB00AC 42 inc edx
00FB00AD 3B93 04010000 cmp edx, [ebx+104]
00FB00B3 ^ 0F82 56FFFFFF jb 00FB000F //代码段结束?
00FB00B9 - EB FE jmp short 00FB00B9 //原地等待
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课