首页
社区
课程
招聘
Alex Protector V1.0 脱壳――alexprot.exe 主程序
发表于: 2004-10-17 23:56 10064

Alex Protector V1.0 脱壳――alexprot.exe 主程序

fly 活跃值
85
2004-10-17 23:56
10064

.            
           
            
下载页面:  http://bbs.pediy.com/showthread.php?s=&threadid=5850
软件大小:  52 KB  
软件简介:  Protector for exe files with cool import protection  
            
【作者声明】:只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
            
【调试环境】:WinXP、Ollydbg V1.10、PEiD、LordPE、ImportREC
            
―――――――――――――――――――――――――――――――――
【脱壳过程】:
         
         
Alex Protector V1.0是今天在exetools论坛发布的壳。
这个壳的花指令和输入表跳转地址加密有些麻烦。
今年涌现不少新壳,不知道这个Alex Protector以后会如何变态。
―――――――――――――――――――――――――――――――――
一、搞定输入表跳转地址加密
            
            
设置Ollydbg忽略除了“内存访问异常”之外的所有其它异常选项。老规矩:用IsDebug V1.4插件去掉Ollydbg的调试器标志。

00438000     60                pushad
//进入OD后暂停在这
00438001     E8 00000000       call alexprot.00438006
00438006     5D                pop ebp
00438007     81ED 06104000     sub ebp,alexprot.00401006
0043800D     E8 24000000       call alexprot.00438036
00438012     EB 01             jmp short alexprot.00438015

Shift+F9运行,暂停在内存访问异常处。
003B13C2     3300              xor eax,dword ptr ds:[eax]
//内存访问异常处
003B13C4     83C4 04           add esp,4
003B13C7     FFE3              jmp ebx

Shift+F9运行,会在003B13C2处中断3次。

Alt+M 打开内存察看窗口,在00401000段“设置内存写入断点”。
Shift+F9,中断在003B0C05处。中断后取消内存断点。
看看寄存器值,你会发现这里就是壳写入加密跳转地址的地方!
我在这里Patch,使壳写入程序中的地址作为输入表的跳转地址,这样就可以Dump下来了。

003B0C04     61                popad
003B0C05     8901              mov dword ptr ds:[ecx],eax
//中断在这里  
//修改为:JMP 003BB000  ★
003B0C07     83C7 04           add edi,4
003B0C0A     FECB              dec bl
003B0C0C     58                pop eax
003B0C0D     80FB 00           cmp bl,0
003B0C10     0F87 42FFFFFF     ja 003B0B58
003B0C16     803F C3           cmp byte ptr ds:[edi],0C3
003B0C19     0F84 A1FDFFFF     je 003B09C0
003B0C1F     833F 00           cmp dword ptr ds:[edi],0
003B0C22     0F84 DE000000     je 003B0D06
//输入表处理完毕则跳转
003B0C28     E9 8AFDFFFF       jmp 003B09B7
003B0C2D     47                inc edi
003B0C2E     8B1F              mov ebx,dword ptr ds:[edi]
003B0C30     53                push ebx
003B0C31     60                pushad
003B0C32     EB 03             jmp short 003B0C37

――――――――――――――――――――――――
在下面找点空白处(003BB000)写入Patch代码:

003BB000     53                  push ebx
003BB001     56                  push esi
003BB002     3E:8B9C24 08FFFFFF  mov ebx,dword ptr ds:[esp-F8]; USER32.77D10000
//[esp-F8]处保存的是处理DLL的基址 ★
003BB00A     3B1D 00C03B00       cmp ebx,dword ptr ds:[3BC000]; USER32.77D10000
//提前在[3BC000]处写入当前处理DLL的基址 ★
003BB010     74 0D               je short 003BB01F
//比较处理的DLL是否相同 ★
003BB012     891D 00C03B00       mov dword ptr ds:[3BC000],ebx
//保存新的DLL基址 ★
003BB018     8305 08C03B00 04    add dword ptr ds:[3BC008],4
//不同则跳转地址+4,方便修复输入表 ★
003BB01F     8B1D 08C03B00     mov ebx,dword ptr ds:[3BC008]  ; alexprot.00429000
//提前在[3BC008]处写入准备放跳转地址的地址,呵呵,有点拗口了 ★
//我选择的是程序的第4个区段,写入00429000
003BB025     3E:8BB424 58FFFFFF  mov esi,dword ptr ds:[esp-A8]; USER32.TranslateMessage
//[esp-A8]处保存的是正确的函数 ★
003BB02D     8933                mov dword ptr ds:[ebx],esi
//函数写入修改的地址
003BB02F     8919                mov dword ptr ds:[ecx],ebx
//[ecx]是程序中的呼叫地址,写入修改后的跳转地址 ★
003BB031     8305 08C03B00 04    add dword ptr ds:[3BC008],4
//跳转地址+4
003BB038     5E                  pop esi
003BB039     5B                  pop ebx
//恢复堆栈
003BB03A     83C7 04             add edi,4
//003B0C07处代码挪到这里执行
003BB03D     E9 C85BFFFF         jmp 003B0C0A
//跳回去继续流程

――――――――――――――――――――――――
修改完以上部分后在003B0D06处下断,Shift+F9中断下来,输入表处理完毕了。

003B0D06     E8 97060000       call 003B13A2
//这里下断
003B0D0B     8D9D 31254000     lea ebx,dword ptr ss:[ebp+40253>
003B0D11     60                pushad
003B0D12     EB 03             jmp short 003B0D17

此时[3BC008]处是004290D8,这就是结束的地址了。
Size=004290D8-00429000=D8
OK,第一部分处理完毕。

―――――――――――――――――――――――――――――――――
二、OEP、Dump

Shift+F9运行,来到最后一次内存异常处。当然,这步可以省略。

003B13C2     3300              xor eax,dword ptr ds:[eax]
//最后一次内存异常
003B13C4     83C4 04           add esp,4
003B13C7     FFE3              jmp ebx

Alt+M 打开内存察看窗口,在00401000段“设置内存访问断点”。
Shift+F9 中断在00406B07处!

00406B05     0000              add byte ptr ds:[eax],al
00406B07     E8 4E2B0000       call alexprot.0040965A         ; jmp to kernel32.GetModuleHandleA
//中断在这里
00406B0C     A3 1CC64000       mov dword ptr ds:[40C61C],eax
00406B11     E8 382B0000       call alexprot.0040964E         ; jmp to kernel32.GetCommandLineA
00406B16     E8 872B0000       call alexprot.004096A2         ; jmp to comctl32.InitCommonControls

看看堆栈:
0012FFA0   00000000

根据汇编语言编译程序的特点和堆栈,补上Stolen Code:
00406B05     6A 00             push 0
//用LordPE纠正ImageSize后完全DUMP这个进程

运行ImportREC,选择这个进程。把OEP改为00006B05,RVA=00029000、Size=000000D8,获取输入表。
FixDump,正常运行!  
               
            
―――――――――――――――――――――――――――――――――   
                                
         ,     _/
        /| _.-~/            \_     ,        青春都一晌
       ( /~   /              \~-._ |\
       `\\  _/                \   ~\ )          忍把浮名
   _-~~~-.)  )__/;;,.          \_  //'
  /'_,\   --~   \ ~~~-  ,;;\___(  (.-~~~-.        换了破解轻狂
`~ _( ,_..--\ (     ,;'' /    ~--   /._`\
  /~~//'   /' `~\         ) /--.._, )_  `~
  "  `~"  "      `"      /~'`\    `\\~~\   
                         "     "   "~'  ""
   
              UnPacked By :  fly
               2004-10-17 23:00


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 7
支持
分享
最新回复 (21)
雪    币: 10619
活跃值: (2314)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
哈哈  不错先顶
2004-10-18 00:18
0
雪    币: 228
活跃值: (165)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
动作真快哦~

我看不习惯那些花指令,找了几个特征.
------------
MENU                = 10 Alex Protector

ActivePatList10        =_Alex1,_Alex2,_Alex3,

[CODE_Alex1]

S = EB03EB03??EBFBE801000000??83C404
R = 90909090909090909090909090909090

[CODE_Alex2]

S = EB05??F00FC7C8
R = 90909090909090

[CODE_Alex3]

S = 85D275D661
R = ????9090??

然后就干干静静了!那个单步跟踪的检查也顺便NOP掉了!

看了一下返回OEP的那些代码,真是晕!绝对的垃圾串代码的后面可以看见被吃掉的那个
push 0
=====================================================
//code

003F07EF    6A 00           PUSH    0
//push 0
003F07F1    65:81E7 70E3980>AND     EDI, 398E370                     ; Superfluous prefix
003F07F8    65:87FF         XCHG    EDI, EDI                         ; Superfluous prefix
003F07FB    F2:             PREFIX REPNE:                            ; Superfluous prefix
003F07FC    F2:             PREFIX REPNE:                            ; Superfluous prefix
003F07FD    33FE            XOR     EDI, ESI
.....
.....
//看这里的地址,就知道省略了多少代码了!
.....
.....
003F0C50    85F7            TEST    EDI, ESI
003F0C52    F7C7 1CDC4C87   TEST    EDI, 874CDC1C
003F0C58    81E7 43C67893   AND     EDI, 9378C643
003F0C5E  - E9 A45E0100     JMP     00406B07                         ; alexprot.00406B07
//jmp oep

//:code
===========================================
已经省略了很多很多了!
2004-10-18 07:05
0
雪    币: 301
活跃值: (300)
能力值: ( LV9,RANK:290 )
在线值:
发帖
回帖
粉丝
4
感谢,支持
2004-10-18 09:07
0
雪    币: 392
活跃值: (909)
能力值: ( LV9,RANK:690 )
在线值:
发帖
回帖
粉丝
5
支持;)
2004-10-18 09:18
0
雪    币: 212
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
无法运行,脱后的程序杀毒软件报警为有病毒:D
2004-10-18 09:50
0
雪    币: 383
活跃值: (786)
能力值: ( LV12,RANK:730 )
在线值:
发帖
回帖
粉丝
7
OK,简单游戏:)
2004-10-18 11:38
0
雪    币: 266
活跃值: (269)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
8
支持:D
2004-10-18 12:07
0
雪    币: 266
活跃值: (269)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
9
忘了UC号,晕
2004-10-18 12:13
0
雪    币: 898
活跃值: (4039)
能力值: ( LV9,RANK:3410 )
在线值:
发帖
回帖
粉丝
10
请收mail
UC号在mail中
2004-10-18 12:40
0
雪    币: 898
活跃值: (4039)
能力值: ( LV9,RANK:3410 )
在线值:
发帖
回帖
粉丝
11
最初由 鹅蛋壳 发布
无法运行,脱后的程序杀毒软件报警为有病毒:D


UnPacked-Alex Protector V1.0

try
http://bbs.pediy.com/upload/file/2004/10/UnPacked.rar_864.rar
2004-10-18 12:43
0
雪    币: 319
活跃值: (2459)
能力值: ( LV12,RANK:980 )
在线值:
发帖
回帖
粉丝
12
003BB002     3E:8B9C24 08FFFFFF  mov ebx,dword ptr ds:[esp-F8]; USER32.77D10000
//[esp-F8]处保存的是处理DLL的基址 ★

请问FLY,你是怎么判断[esp-F8]处保存的是处理DLL的基址的?
2004-10-18 12:54
0
雪    币: 116
活跃值: (220)
能力值: ( LV12,RANK:370 )
在线值:
发帖
回帖
粉丝
13
收到。。。多谢fly
2004-10-18 12:55
0
雪    币: 898
活跃值: (4039)
能力值: ( LV9,RANK:3410 )
在线值:
发帖
回帖
粉丝
14
最初由 csjwaman 发布
003BB002 3E:8B9C24 08FFFFFF mov ebx,dword ptr ds:[esp-F8]; USER32.77D10000
//[esp-F8]处保存的是处理DLL的基址 ★

请问FLY,你是怎么判断[esp-F8]处保存的是处理DLL的基址的?


GetModuleHandleA
看看堆栈
2004-10-18 12:58
0
雪    币: 319
活跃值: (2459)
能力值: ( LV12,RANK:980 )
在线值:
发帖
回帖
粉丝
15
谢谢FLY回答。
2004-10-18 13:03
0
雪    币: 258
活跃值: (230)
能力值: ( LV12,RANK:770 )
在线值:
发帖
回帖
粉丝
16
支持!!!!
混个脸熟 :D
2004-10-18 15:36
0
雪    币: 212
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
学习!
2004-10-18 17:28
0
雪    币: 229
活跃值: (143)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
18
学习中~!
2004-10-18 21:27
0
雪    币: 319
活跃值: (2459)
能力值: ( LV12,RANK:980 )
在线值:
发帖
回帖
粉丝
19
003BB00A     3B1D 00C03B00       cmp ebx,dword ptr ds:[3BC000]; USER32.77D10000
//提前在[3BC000]处写入当前处理DLL的基址 ★

请问FLY,以上是比较代码,“提前在[3BC000]处写入当前处理DLL的基址”如何理解?
2004-10-19 09:50
0
雪    币: 898
活跃值: (4039)
能力值: ( LV9,RANK:3410 )
在线值:
发帖
回帖
粉丝
20
比较之前,在转存[3BC000]处写入第一次处理dll的基址
如这个是USER32.DLL的基址77D10000
2004-10-19 13:03
0
雪    币: 155
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
收下。慢慢看
2004-10-19 13:27
0
雪    币: 319
活跃值: (2459)
能力值: ( LV12,RANK:980 )
在线值:
发帖
回帖
粉丝
22
最初由 fly 发布
比较之前,在转存[3BC000]处写入第一次处理dll的基址
如这个是USER32.DLL的基址77D10000


谢谢!
2004-10-19 14:21
0
游客
登录 | 注册 方可回帖
返回
//