飘云阁安全网

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 6725|回复: 11

[原创] Enigma Protector脱壳

[复制链接]
  • TA的每日心情

    2021-3-15 02:34
  • 签到天数: 347 天

    [LV.8]以坛为家I

    发表于 2011-9-27 00:18:56 | 显示全部楼层 |阅读模式
    【文章标题】: Enigma Protector脱壳
    【文章作者】: Smoke
    【编写语言】: 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 [ebp+14]
    7C809AE9 FF75 10 push dword ptr [ebp+10]
    7C809AEC FF75 0C push dword ptr [ebp+C]
    7C809AEF FF75 08 push dword ptr [ebp+8]
    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 [esi]
    005502B4 46 inc esi
    005502B5 8807 mov byte ptr [edi], al
    005502B7 47 inc edi ; UnpackMe.00401000
    005502B8 00D2 add dl, dl
    005502BA 75 05 jnz short 005502C1
    005502BC 8A16 mov dl, byte ptr [esi]
    005502BE 46 inc esi
    005502BF 10D2 adc dl, dl
    005502C1 ^ 73 EF jnb short 005502B2

    往下拉 来到
    005503C8 F3:A4 rep movs byte ptr es:[edi], byte ptr>
    005503CA 5E pop esi
    005503CB ^ E9 E8FEFFFF jmp 005502B8
    005503D0 5D pop ebp
    005503D1 2B7D 40 sub edi, dword ptr [ebp+40]
    005503D4 897C24 1C mov dword ptr [esp+1C], 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 [44D09C], eax
    00405BD2 6A 00 push 0
    00405BD4 E8 FF4A0000 call 0040A6D8 第一个函数
    00405BD9 A3 64F64400 mov dword ptr [44F664], eax
    00405BDE A1 64F64400 mov eax, dword ptr [44F664]
    00405BE3 A3 A8D04400 mov dword ptr [44D0A8], eax
    00405BE8 33C0 xor eax, eax
    00405BEA A3 ACD04400 mov dword ptr [44D0AC], eax
    00405BEF 33C0 xor eax, eax
    00405BF1 A3 B0D04400 mov dword ptr [44D0B0], eax

    ALT+M在
    Memory map, 条目 22
    地址=00401000
    大小=0004C000 (311296.)
    属主=UnpackMe 00400000
    区段=
    包含=SFX,代码
    类型=Imag 01001002
    访问=R
    初始访问=RWE
    下内存写入断点 F9运行
    删除内存断点 来到

    0055026B 294C0F 01 sub dword ptr [edi+ecx+1], 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 [edi+ecx+2], 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 [44D09C], eax
    00405BD2 6A 00 push 0
    00405BD4 E8 2BFFFFFF call 00405B04 //F7跟进
    00405BD9 A3 64F64400 mov dword ptr [44F664], eax
    00405BDE A1 64F64400 mov eax, dword ptr [44F664]
    00405BE3 A3 A8D04400 mov dword ptr [44D0A8], eax

    来到
    00405B04 FF25 E4014500 jmp dword ptr [4501E4]
    00405B0A 8BC0 mov eax, eax
    00405B0C FF25 E0014500 jmp dword ptr [4501E0]
    00405B12 8BC0 mov eax, eax
    00405B14 FF25 DC014500 jmp dword ptr [4501DC]
    00405B1A 8BC0 mov eax, eax
    00405B1C FF25 D8014500 jmp dword ptr [4501D8]
    发现已经解密完毕 不再是开始那样

    返回EIP
    搜索特征码 ctrl+F
    mov dword ptr ds:[edx+eax*4+4],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 [edx+eax*4+4], ecx
    0054C9EE 47 inc edi
    0054C9EF FF4D D0 dec dword ptr [ebp-30]
    先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 [edx+eax*4+4], ecx ; UnpackMe.0054E204
    0054BDC1 83C3 04 add ebx, 4
    0054BDC4 66:8B3B mov di, word ptr [ebx]
    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 [edx+eax*4+4], ecx

    继续重复上一次操作
    取消掉硬件执行断点 004EF086  0054BC97
    跟随到00405BC8 下个硬件执行断点 F9运行
    来到

    00405BC8 53 push ebx
    00405BC9 8BD8 mov ebx, eax
    00405BCB 33C0 xor eax, eax
    00405BCD A3 9CD04400 mov dword ptr [44D09C], eax
    00405BD2 6A 00 push 0
    00405BD4 E8 2BFFFFFF call 00405B04 ; jmp 到 kernel32.GetModuleHandleA //F7跟进
    00405BD9 A3 64F64400 mov dword ptr [44F664], eax
    00405BDE A1 64F64400 mov eax, dword ptr [44F664]

    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 [44F5BC], 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 [44F5BC], eax
    00405AF8 \E8 FFB7FFFF call 004012FC ; jmp 到 kernel32.GetCurrentThreadId
    00405AFD A3 30F04400 mov dword ptr [44F030], eax
    00405B02 C3 retn
    00405B03 90 nop
    00405B04 - FF25 646FC600 jmp dword ptr [C66F64] ; kernel32.GetModuleHandleA
    00405B0A 8BC0 mov eax, eax
    00405B0C - FF25 586FC600 jmp dword ptr [C66F58] ; kernel32.LocalAlloc
    00405B12 8BC0 mov eax, eax
    00405B14 - FF25 4C6FC600 jmp dword ptr [C66F4C] ; kernel32.TlsGetValue
    00405B1A 8BC0 mov eax, eax
    00405B1C - FF25 406FC600 jmp dword ptr [C66F40] ; kernel32.TlsSetValue
    看到函数已经解密了

    CPU窗口跟随到00C37CA0
    来到

    00C37C86 0000 add byte ptr [eax], al
    00C37C88 0000 add byte ptr [eax], al
    00C37C8A 0000 add byte ptr [eax], 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 [44DFB8] ; UnpackMe.0044FBB0
    00C37CA6 8B40 00 mov eax, dword ptr [eax]
    00C37CA9 E8 A23481FF call UnpackMe.0044B150
    00C37CAE 8B0D 94E04400 mov ecx, dword ptr [44E094] ; 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 [44DFB8]
    mov eax, dword ptr [eax]
    call UnpackMe.0044B150
    mov ecx, dword ptr [44E094]
    mov eax, dword ptr [44DFB8]
    mov eax, dword ptr [eax]
    mov edx, dword ptr [44C6F0]
    call UnpackMe.0044B168
    mov eax, dword ptr [44DFB8]
    mov eax, dword ptr [eax]
    call UnpackMe.0044B1E8
    call UnpackMe.00403D20
    lea eax, dword ptr [eax]

    返回到eip
    00405BC8 53 push ebx
    00405BC9 8BD8 mov ebx, eax
    00405BCB 33C0 xor eax, eax
    00405BCD A3 9CD04400 mov dword ptr [44D09C], eax
    00405BD2 6A 00 push 0
    00405BD4 E8 2BFFFFFF call 00405B04 ; jmp 到 kernel32.GetModuleHandleA
    00405BD9 A3 64F64400 mov dword ptr [44F664], eax
    00405BDE A1 64F64400 mov eax, dword ptr [44F664]

    搜索 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:[eax]
    0044C89E 64:8920 mov dword ptr fs:[eax], 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 [44DFB8]
    mov eax, dword ptr [eax]
    call UnpackMe.0044B150
    mov ecx, dword ptr [44E094]
    mov eax, dword ptr [44DFB8]
    mov eax, dword ptr [eax]
    mov edx, dword ptr [44C6F0]
    call UnpackMe.0044B168
    mov eax, dword ptr [44DFB8]
    mov eax, dword ptr [eax]
    call UnpackMe.0044B1E8
    call UnpackMe.00403D20
    lea eax, dword ptr [eax]
    粘贴完毕后为
    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 [44DFB8]
    0044CAAD 8B00 mov eax, dword ptr [eax]
    0044CAAF E8 9CE6FFFF call 0044B150
    0044CAB4 8B0D 94E04400 mov ecx, dword ptr [44E094] ; UnpackMe.0044FBD0
    0044CABA A1 B8DF4400 mov eax, dword ptr [44DFB8]
    0044CABF 8B00 mov eax, dword ptr [eax]
    0044CAC1 8B15 F0C64400 mov edx, dword ptr [44C6F0] ; UnpackMe.0044C73C
    0044CAC7 E8 9CE6FFFF call 0044B168
    0044CACC A1 B8DF4400 mov eax, dword ptr [44DFB8]
    0044CAD1 8B00 mov eax, dword ptr [eax]
    0044CAD3 E8 10E7FFFF call 0044B1E8
    0044CAD8 E8 4372FBFF call 00403D20
    0044CADD 8D00 lea eax, dword ptr [eax]
    0044CADF 90 nop

    然后即可DUMP
    使用LordPE 选取进程 修正镜像大小 完整转存
    再ImportREC 选取进程 oep为 4CA98 RVA为85AEA0 大小为2050
    剪切到无效指针 修复转存
    脱壳后为Borland Delphi 6.0 - 7.0
    正常运行!
    --------------------------------------------------------------------------------
    【版权声明】: 本文原创于Smoke, 转载请注明作者并保持文章的完整, 谢谢!
  • TA的每日心情
    奋斗
    2016-9-27 11:02
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    发表于 2012-1-30 09:23:33 | 显示全部楼层
    能上个视频看就不用看那么长~\(≧▽≦)/~啦啦啦
  • TA的每日心情
    擦汗
    7 天前
  • 签到天数: 698 天

    [LV.9]以坛为家II

    发表于 2015-1-7 15:40:30 | 显示全部楼层
    要有配合楼主能把视频搞出来的的话,就更完美了
  • TA的每日心情
    开心
    2020-10-22 17:56
  • 签到天数: 20 天

    [LV.4]偶尔看看III

    发表于 2015-7-21 09:03:30 | 显示全部楼层
    不错,学习下

    该用户从未签到

    发表于 2015-7-24 11:28:43 | 显示全部楼层
    不错,学习下
  • TA的每日心情
    擦汗
    7 天前
  • 签到天数: 698 天

    [LV.9]以坛为家II

    发表于 2015-8-31 22:31:33 | 显示全部楼层
    要是能做出视频教程来有多好啊,大神
  • TA的每日心情
    奋斗
    2017-4-28 14:04
  • 签到天数: 26 天

    [LV.4]偶尔看看III

    发表于 2015-11-15 07:35:41 | 显示全部楼层
    学习了,谢谢分享

    该用户从未签到

    发表于 2015-11-17 13:49:13 | 显示全部楼层
    帮我破一个把
  • TA的每日心情
    慵懒
    2018-8-21 15:07
  • 签到天数: 4 天

    [LV.2]偶尔看看I

    发表于 2018-8-15 11:22:18 | 显示全部楼层
    跟看天书一样!!!大神的世界,小白不懂!!!!
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2019-5-29 17:25:00 | 显示全部楼层
    能帮我脱个壳不 4.0的 付费
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    小黑屋|手机版|Archiver|粤公网安备 44010602010026号|飘云阁安全网 ( 粤ICP备15107817号-2 )

    Powered by Discuz! Copyright © 2001-2022, Tencent Cloud.

    快速回复 返回顶部 返回列表