Smoke 发表于 2011-9-27 00:09

Enigma Protector脱壳

【文章标题】: Enigma Protector脱壳
【文章作者】: Smoke
【作者邮箱】: smoke@52pojie.cn
【编写语言】: delphi7
【操作平台】: windows xp sp3
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
Enigma Protector脱壳
OllyDBG插件 PhantOm
勾住protect DRx 选项 来方便下断点
设置完毕后重新载入OllyDBG

   0041A3DA >55            push    ebp
0041A3DB    8BEC            mov   ebp, esp
0041A3DD    83C4 F0         add   esp, -10
0041A3E0    B8 00104000   mov   eax, 00401000
0041A3E5    E8 01000000   call    0041A3EB
0041A3EA    9A 83C4108B E55>call    far 5DE5:8B10C483
0041A3F1- E9 A2910900   jmp   004B3598
0041A3F6^ E0 D9         loopdne short 0041A3D1用二次断点
Ctrl+G 输入 VirtualAlloc
7C809AE1 > 8BFF mov edi, edi
7C809AE3 55 push ebp
7C809AE4 8BEC mov ebp, esp
7C809AE6 FF75 14 push dword ptr
7C809AE9 FF75 10 push dword ptr
7C809AEC FF75 0C push dword ptr
7C809AEF FF75 08 push dword ptr
7C809AF2 6A FF push -1
7C809AF4 E8 09000000 call VirtualAllocEx //F2下断 F9运行 断下之后在到数据窗口 到401000 处下硬件写入断点 找解码处
7C809AF9 5D pop ebp下面应该就是解码过程了
005502AF FC cld
005502B0 B2 80 mov dl, 80
005502B2 8A06 mov al, byte ptr
005502B4 46 inc esi
005502B5 8807 mov byte ptr , al
005502B7 47 inc edi ; UnpackMe.00401000
005502B8 00D2 add dl, dl
005502BA 75 05 jnz short 005502C1
005502BC 8A16 mov dl, byte ptr
005502BE 46 inc esi
005502BF 10D2 adc dl, dl
005502C1 ^ 73 EF jnb short 005502B2 往下拉 来到
005503C8 F3:A4 rep movs byte ptr es:, byte ptr>
005503CA 5E pop esi
005503CB ^ E9 E8FEFFFF jmp 005502B8
005503D0 5D pop ebp
005503D1 2B7D 40 sub edi, dword ptr
005503D4 897C24 1C mov dword ptr , edi
005503D8 61 popad
005503D9 5D pop ebp
005503DA C3 retn //F2下断 F9运行 发现数据窗口已经解码完了接下来就来找OEP
跟随到00401000 搜索特征码 A3??????00A1??????00A3??????0033C0A3??????0033C0A3??????00 (delphi程序的第一个call)

来到以下地方
00405BC8 53 push ebx 第一个call
00405BC9 8BD8 mov ebx, eax
00405BCB 33C0 xor eax, eax
00405BCD A3 9CD04400 mov dword ptr , eax
00405BD2 6A 00 push 0
00405BD4 E8 FF4A0000 call 0040A6D8 第一个函数
00405BD9 A3 64F64400 mov dword ptr , eax
00405BDE A1 64F64400 mov eax, dword ptr
00405BE3 A3 A8D04400 mov dword ptr , eax
00405BE8 33C0 xor eax, eax
00405BEA A3 ACD04400 mov dword ptr , eax
00405BEF 33C0 xor eax, eax
00405BF1 A3 B0D04400 mov dword ptr , eaxALT+M在
Memory map, 条目 22
地址=00401000
大小=0004C000 (311296.)
属主=UnpackMe 00400000
区段=
包含=SFX,代码
类型=Imag 01001002
访问=R
初始访问=RWE
下内存写入断点 F9运行
删除内存断点 来到
0055026B 294C0F 01 sub dword ptr , ecx
0055026F 83C1 05 add ecx, 5
00550272 83E8 04 sub eax, 4
00550275 ^ EB D7 jmp short 0055024E
00550277 29540F 02 sub dword ptr , edx
0055027B 83C1 06 add ecx, 6
0055027E 83EA 04 sub edx, 4
00550281 83E8 05 sub eax, 5
00550284 ^ EB C8 jmp short 0055024E
00550286 61 popad
00550287 5D pop ebp
00550288 C2 0800 retn 8
0055028B 90 nop
00550281 83E8 05 sub eax, 5
00550284 ^ EB C8 jmp short 0055024E
00550286 61 popad
00550287 5D pop ebp
00550288 C2 0800 retn 8 //F2下断 F9运行继续来到
00405BC8 53 push ebx
00405BC9 8BD8 mov ebx, eax
00405BCB 33C0 xor eax, eax
00405BCD A3 9CD04400 mov dword ptr , eax
00405BD2 6A 00 push 0
00405BD4 E8 2BFFFFFF call 00405B04 //F7跟进
00405BD9 A3 64F64400 mov dword ptr , eax
00405BDE A1 64F64400 mov eax, dword ptr
00405BE3 A3 A8D04400 mov dword ptr , eax来到
00405B04 FF25 E4014500 jmp dword ptr
00405B0A 8BC0 mov eax, eax
00405B0C FF25 E0014500 jmp dword ptr
00405B12 8BC0 mov eax, eax
00405B14 FF25 DC014500 jmp dword ptr
00405B1A 8BC0 mov eax, eax
00405B1C FF25 D8014500 jmp dword ptr
发现已经解密完毕 不再是开始那样返回EIP
搜索特征码 ctrl+F
mov dword ptr ds:,ecx
把找到的特征码全部下硬件执行断点
搜索完及下完硬件点段后 直接F9
把找到的地方nop掉
0054C9EA 90 nop
0054C9EB 90 nop
0054C9EC 90 nop
0054C9ED 90 nop删掉0054C9EA硬件执行断点
0054C9F8 33C0 xor eax, eax //F2下断 F9运行
0054C9FA 5A pop edx
0054C9FB 59 pop ecx
0054C9FC 59 pop ecx

撤消0054C9EA修改后的代码 并下硬件执行断点来到OEP发现有些函数已经解密了
重新载入OllyDBG
硬件执行断点都在
F9运行 来到
0054C9EA 894C82 04 mov dword ptr , ecx
0054C9EE 47 inc edi
0054C9EF FF4D D0 dec dword ptr

先nop填充掉
0054C9EA 90 nop
0054C9EB 90 nop
0054C9EC 90 nop
0054C9ED 90 nop删除硬件断点
0054C9F8    33C0            xor   eax, eax//F2下断 F9运行
在0054C9F8断下后 撤销0054C9EA修改后的代码 重新下硬件执行断点 再F9
来到
0054BDBD 894C82 04 mov dword ptr , ecx ; UnpackMe.0054E204
0054BDC1 83C3 04 add ebx, 4
0054BDC4 66:8B3B mov di, word ptr

nop掉
0054BDBD 90 nop
0054BDBE 90 nop
0054BDBF 90 nop
0054BDC0 90 nop删除硬件断点 0054BDBD
往下拉 来到
0054BE30 83F8 FF cmp eax, -1
0054BE33 ^ 0F85 24FDFFFF jnz 0054BB5D
0054BE39 33C0 xor eax, eax //F2下断 F9运行
0054BE3B 5A pop edx断下之后取消断点 撤销修改的地方0054BDBD 并下硬件执行断点 再F9
来到
0054C9EA 894C82 04 mov dword ptr , ecx继续重复上一次操作
取消掉硬件执行断点 004EF0860054BC97
跟随到00405BC8 下个硬件执行断点 F9运行
来到
00405BC8 53 push ebx
00405BC9 8BD8 mov ebx, eax
00405BCB 33C0 xor eax, eax
00405BCD A3 9CD04400 mov dword ptr , eax
00405BD2 6A 00 push 0
00405BD4 E8 2BFFFFFF call 00405B04 ; jmp 到 kernel32.GetModuleHandleA //F7跟进
00405BD9 A3 64F64400 mov dword ptr , eax
00405BDE A1 64F64400 mov eax, dword ptr



00405AD6 /EB 20 jmp short 00405AF8
00405AD8 |E8 9FB7FFFF call 0040127C ; jmp 到 kernel32.GetThreadLocale
00405ADD |E8 86FEFFFF call 00405968
00405AE2 |A3 BCF54400 mov dword ptr , eax
00405AE7 |EB 0F jmp short 00405AF8
00405AE9 |E8 8EB7FFFF call 0040127C ; jmp 到 kernel32.GetThreadLocale
00405AEE |E8 75FEFFFF call 00405968
00405AF3 |A3 BCF54400 mov dword ptr , eax
00405AF8 \E8 FFB7FFFF call 004012FC ; jmp 到 kernel32.GetCurrentThreadId
00405AFD A3 30F04400 mov dword ptr , eax
00405B02 C3 retn
00405B03 90 nop
00405B04 - FF25 646FC600 jmp dword ptr ; kernel32.GetModuleHandleA
00405B0A 8BC0 mov eax, eax
00405B0C - FF25 586FC600 jmp dword ptr ; kernel32.LocalAlloc
00405B12 8BC0 mov eax, eax
00405B14 - FF25 4C6FC600 jmp dword ptr ; kernel32.TlsGetValue
00405B1A 8BC0 mov eax, eax
00405B1C - FF25 406FC600 jmp dword ptr ; kernel32.TlsSetValue

看到函数已经解密了CPU窗口跟随到00C37CA0
来到
00C37C86 0000 add byte ptr , al
00C37C88 0000 add byte ptr , al
00C37C8A 0000 add byte ptr , al
00C37C8C BA 00000055 mov edx, 55000000
00C37C91 8BEC mov ebp, esp
00C37C93 83C4 F0 add esp, -10
00C37C96 B8 B8C84400 mov eax, 44C8B8
00C37C9B E8 28DF7CFF call UnpackMe.00405BC8
00C37CA0 8B05 B8DF4400 mov eax, dword ptr ; UnpackMe.0044FBB0
00C37CA6 8B40 00 mov eax, dword ptr
00C37CA9 E8 A23481FF call UnpackMe.0044B150
00C37CAE 8B0D 94E04400 mov ecx, dword ptr ; UnpackMe.0044FBD0

00C37C8C BA 00000055 mov edx, 55000000 //nop掉

00C37C90 90 nop //撤销修改代码复制保存
push ebp
mov ebp, esp
add esp, -10
mov eax, 44C8B8
call UnpackMe.00405BC8
mov eax, dword ptr
mov eax, dword ptr
call UnpackMe.0044B150
mov ecx, dword ptr
mov eax, dword ptr
mov eax, dword ptr
mov edx, dword ptr
call UnpackMe.0044B168
mov eax, dword ptr
mov eax, dword ptr
call UnpackMe.0044B1E8
call UnpackMe.00403D20
lea eax, dword ptr 返回到eip
00405BC8 53 push ebx
00405BC9 8BD8 mov ebx, eax
00405BCB 33C0 xor eax, eax
00405BCD A3 9CD04400 mov dword ptr , eax
00405BD2 6A 00 push 0
00405BD4 E8 2BFFFFFF call 00405B04 ; jmp 到 kernel32.GetModuleHandleA
00405BD9 A3 64F64400 mov dword ptr , eax
00405BDE A1 64F64400 mov eax, dword ptr 搜索 558BEC33C05568??????0064FF3064892033C05A595964891068??????00C3E9 (OEP特征码)
来到
0044C890 55 push ebp
0044C891 8BEC mov ebp, esp
0044C893 33C0 xor eax, eax
0044C895 55 push ebp
0044C896 68 AFC84400 push 0044C8AF
0044C89B 64:FF30 push dword ptr fs:
0044C89E 64:8920 mov dword ptr fs:, esp

继续搜索90C84400

0044CA93 90 nop
0044CA94 90 nop
0044CA95 90 nop
0044CA96 90 nop
0044CA97 90 nop
0044CA98 51 push ecx //新建EIP
0044CA99 06 push es
0044CA9A 7A 12 jpe short 0044CAAE
0044CA9C 5C pop esp
0044CA9D 42 inc edx

复制刚才保存的代码
push ebp
mov ebp, esp
add esp, -10
mov eax, 44C8B8
call UnpackMe.00405BC8
mov eax, dword ptr
mov eax, dword ptr
call UnpackMe.0044B150
mov ecx, dword ptr
mov eax, dword ptr
mov eax, dword ptr
mov edx, dword ptr
call UnpackMe.0044B168
mov eax, dword ptr
mov eax, dword ptr
call UnpackMe.0044B1E8
call UnpackMe.00403D20
lea eax, dword ptr

粘贴完毕后为
0044CA98 55 push ebp
0044CA99 8BEC mov ebp, esp
0044CA9B 83C4 F0 add esp, -10
0044CA9E B8 B8C84400 mov eax, 0044C8B8
0044CAA3 E8 2091FBFF call 00405BC8
0044CAA8 A1 B8DF4400 mov eax, dword ptr
0044CAAD 8B00 mov eax, dword ptr
0044CAAF E8 9CE6FFFF call 0044B150
0044CAB4 8B0D 94E04400 mov ecx, dword ptr ; UnpackMe.0044FBD0
0044CABA A1 B8DF4400 mov eax, dword ptr
0044CABF 8B00 mov eax, dword ptr
0044CAC1 8B15 F0C64400 mov edx, dword ptr ; UnpackMe.0044C73C
0044CAC7 E8 9CE6FFFF call 0044B168
0044CACC A1 B8DF4400 mov eax, dword ptr
0044CAD1 8B00 mov eax, dword ptr
0044CAD3 E8 10E7FFFF call 0044B1E8
0044CAD8 E8 4372FBFF call 00403D20
0044CADD 8D00 lea eax, dword ptr
0044CADF 90 nop
然后即可DUMP
使用LordPE 选取进程 修正镜像大小 完整转存
再ImportREC 选取进程 oep为 4CA98 RVA为85AEA0 大小为2050
剪切到无效指针 修复转存
脱壳后为Borland Delphi 6.0 - 7.0
正常运行!
--------------------------------------------------------------------------------
【版权声明】: 本文原创于Smoke, 转载请注明作者并保持文章的完整, 谢谢!




















wuyasos 发表于 2011-9-27 08:35

sm   我也来支持你...有点深奥.......

ie765 发表于 2011-9-27 00:42

本帖最后由 ie765 于 2011-9-27 00:43 编辑

学习 谢谢 分享哦。。

VIP_吾爱、小欣 发表于 2011-9-27 00:15

前排支持,学习了。
觉得写的很详细了。顶下

mirs 发表于 2011-9-27 00:33

{:1_908:}学习下,感谢楼主分享

落幕CC 发表于 2011-9-27 08:40

好贴,谢谢楼主了

闭幕 发表于 2011-9-27 13:06

脱文看不懂,悲剧!!!!!!!!

zhi5231 发表于 2011-9-27 13:19

{:1_900:}哇考~果然很黄很暴力!

my1229 发表于 2011-9-27 13:44

支持楼主的原创教程。

Shiny 发表于 2011-9-27 14:01

来顶smoke大大的精品文章
页: [1] 2 3 4 5
查看完整版本: Enigma Protector脱壳