吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 10687|回复: 20
收起左侧

[原创] 手脱Krypton 0.2 -> Yado/Lockless的壳(代码修复IAT)

[复制链接]
evilangel 发表于 2009-7-3 23:57
本帖最后由 evilangel 于 2009-7-3 23:58 编辑
看了一篇对IAT加密处理的文章,学习到达OEP后修复IAT,练下手,如果有误,还请指教。


试炼壳是Krypton The Krypter [v.0.2]这个原程序

一、查壳:

PEiD查壳显示:
Krypton 0.2 -> Yado/Lockless

二、到达OEP

首先OD载入,忽略所有异常,停在

00434000 >  8B0C24                      mov     ecx, [esp]                       ; 

kernel32.7C817027
00434003    E9 0A7C0100                 jmp     0044BC12
00434008    AD                          lods    dword ptr [esi]
00434009    42                          inc     edx
0043400A    40                          inc     eax
0043400B    BD BE9D7A04                 mov     ebp, 47A9DBE

打开内存(alt+m),在

Memory map, 条目 19
 地址=0041F000
 大小=00015000 (86016.)
 属主=KRYPTON  00400000
 区段=YADO
 包含=资源
 类型=Imag 01001002
 访问=R
 初始访问=RWE

F2下断,F9运行

7C932315    66:8B50 0C                  mov     dx, [eax+C]
7C932319    66:8955 B4                  mov     [ebp-4C], dx
7C93231D    8D70 10                     lea     esi, [eax+10]
7C932320    8975 94                     mov     [ebp-6C], esi
7C932323    8B55 0C                     mov     edx, [ebp+C]
7C932326    66:F742 02 FFFF             test    word ptr [edx+2], 0FFFF
7C93232C    75 11                       jnz     short 7C93233F

接着打开内存,在

Memory map, 条目 20
 地址=00401000
 大小=00002000 (8192.)
 属主=KRYPTON  00400000
 区段=YADO
 包含=代码
 类型=Imag 01001002
 访问=R
 初始访问=RWE

F2下断,F9运行

003A3A39    66:8138 FF15                cmp     word ptr [eax], 15FF             ; //来到这

儿
003A3A3E    75 09                       jnz     short 003A3A49
003A3A40    8378 02 00                  cmp     dword ptr [eax+2], 0
003A3A44    75 03                       jnz     short 003A3A49
003A3A46    8958 02                     mov     [eax+2], ebx
003A3A49    40                          inc     eax
003A3A4A    49                          dec     ecx
003A3A4B    85C9                        test    ecx, ecx
003A3A4D  ^ 75 EA                       jnz     short 003A3A39
003A3A4F    8B8D AFBB4100               mov     ecx, [ebp+41BBAF]
003A3A55    890C24                      mov     [esp], ecx
003A3A58    8B95 B6BB4100               mov     edx, [ebp+41BBB6]                ; 

KRYPTON.00401000
003A3A5E    FFE2                        jmp     edx                              ; //上面把

OEP的地址给edx,然后跳向OEP


到达OEP看看,MASM32 / TASM32编写的


00401000    6A 00                       push    0                                ; //OEP
00401002    E8 C1100000                 call    004020C8                         ; //ENTER回

车跟入
00401007    A3 583B4000                 mov     [403B58], eax
0040100C    6A 00                       push    0
0040100E    68 29104000                 push    00401029
00401013    6A 00                       push    0
00401015    6A 67                       push    67
00401017    FF35 583B4000               push    dword ptr [403B58]
0040101D    E8 DC100000                 call    004020FE
00401022    6A 00                       push    0
00401024    E8 45100000                 call    0040206E


三、分析IAT加密方式

在00401002    E8 C1100000                 call    004020C8   这一行回车后可以看到


0040206E  - FF25 C8D04100               jmp     [41D0C8]                         ; //可以看

到被加密了
00402074  - FF25 CCD04100               jmp     [41D0CC]
0040207A  - FF25 D0D04100               jmp     [41D0D0]
00402080  - FF25 D4D04100               jmp     [41D0D4]
00402086  - FF25 D8D04100               jmp     [41D0D8]
0040208C  - FF25 DCD04100               jmp     [41D0DC]
00402092  - FF25 E0D04100               jmp     [41D0E0]
00402098  - FF25 E4D04100               jmp     [41D0E4]
0040209E  - FF25 E8D04100               jmp     [41D0E8]
004020A4  - FF25 ECD04100               jmp     [41D0EC]
004020AA  - FF25 F0D04100               jmp     [41D0F0]
004020B0  - FF25 F4D04100               jmp     [41D0F4]
004020B6  - FF25 F8D04100               jmp     [41D0F8]
004020BC  - FF25 FCD04100               jmp     [41D0FC]
004020C2  - FF25 00D14100               jmp     [41D100]
004020C8  - FF25 04D14100               jmp     [41D104]                         ; //enter到

这行
004020CE  - FF25 0CD14100               jmp     [41D10C]
004020D4  - FF25 10D14100               jmp     [41D110]
004020DA  - FF25 14D14100               jmp     [41D114]
004020E0  - FF25 18D14100               jmp     [41D118]
004020E6  - FF25 1CD14100               jmp     [41D11C]
004020EC  - FF25 20D14100               jmp     [41D120]
004020F2  - FF25 24D14100               jmp     [41D124]
004020F8  - FF25 28D14100               jmp     [41D128]
004020FE  - FF25 2CD14100               jmp     [41D12C]
00402104  - FF25 30D14100               jmp     [41D130]
0040210A  - FF25 38D14100               jmp     [41D138]

在数据窗口可以看到

0041D0C8  0038001F
0041D0CC  0038003E
0041D0D0  0038005D
0041D0D4  0038007C
0041D0D8  0038009B
0041D0DC  003800BA
0041D0E0  003800D9
0041D0E4  003800F8
0041D0E8  00380117
0041D0EC  00380136
0041D0F0  00380155
0041D0F4  00380174
0041D0F8  00380193
0041D0FC  003801B2
0041D100  003801D1
0041D104  003801F0
0041D108  00000000
0041D10C  0038020F
0041D110  0038022E
0041D114  0038024D
0041D118  0038026C
0041D11C  0038028B
0041D120  003802AA
0041D124  003802C9
0041D128  003802E8
0041D12C  00380307
0041D130  00380326
0041D134  00000000
0041D138  00380345
0041D13C  00000000


通过enter回车进入几个jmp[],可以看到加密方式有两种,

一种是:

00380193    8135 AE013800 D933C233      xor     dword ptr [3801AE], 33C233D9
0038019D    A1 AE013800                 mov     eax, [3801AE]
003801A2    8135 AE013800 D933C233      xor     dword ptr [3801AE], 33C233D9
003801AC    FFE0                        jmp     eax


另一种是:

0038009B    8105 B6003800 A>add     dword ptr [3800B6], 4C6DF1A1
003800A5    A1 B6003800     mov     eax, [3800B6]
003800AA    812D B6003800 A>sub     dword ptr [3800B6], 4C6DF1A1
003800B4    FFE0            jmp     eax

通过分析,对于这个壳,大概得出结论,如果[xxxxxxxx],xxxxxxxx后面的立即数大于40000000的话,就

进行add运算,否则就运行xor运算,也可以通过[xxxxxxxx]的值来判断,这个就不说了。


四、写代码,修复IAT,脱壳

下面找个空白的地方写代码,我找到的是0040236B


0040263B    B8 C8D04100     mov     eax, 0041D0C8                    ; //加密IAT起始地址给

eax
00402640    8B10            mov     edx, [eax]                       ; //eax存放的地址给edx
00402642    83FA 00         cmp     edx, 0                           ; //判断是否为零
00402645    74 18           je      short 0040265F                   ; //为零的话只想下一个

eax
00402647    83C2 02         add     edx, 2                           ; //edx+2,到指向[]中的

地址的地方
0040264A    8B0A            mov     ecx, [edx]                       ; //将这个地址给ecx
0040264C    8B09            mov     ecx, [ecx]                       ; //该地址存放的值给ecx
0040264E    83C2 04         add     edx, 4                           ; //edx+4,得到只想立即

数的地址
00402651    8B12            mov     edx, [edx]                       ; //立即数给edx本身
00402653    81FA 00000040   cmp     edx, 40000000                    ; //判断立即数是否大于

40000000
00402659    77 10           ja      short 0040266B                   ; //大于则执行相加
0040265B    33CA            xor     ecx, edx                         ; //否着执行xor运算
0040265D    8908            mov     [eax], ecx                       ; //然后把值存放到[eax]

中
0040265F    83C0 04         add     eax, 4                           ; //eax+4
00402662    3D 3CD14100     cmp     eax, 0041D13C                    ; //比较是否到达IAT终止

地址
00402667  ^ 72 D7           jb      short 00402640                   ; //不是的话继续执行
00402669    90              nop
0040266A    90              nop
0040266B    03CA            add     ecx, edx                         ; //执行add运算
0040266D  ^ EB EE           jmp     short 0040265D                   ; //跳回执行存放函数地

址到[eax]中


二进制代码

B8 C8 D0 41 00 8B 10 83 FA 00 74 18 83 C2 02 8B 0A 8B 09 83 C2 04 8B 12 81 FA 00 00 00 40 77 

10
33 CA 89 08 83 C0 04 3D 3C D1 41 00 72 D7 90 90 03 CA EB EE


在0040263B这行右键---新建EIP,然后在00402669这行F2下断,F9运行,这样IAT都处理完毕
修复后的数据窗口可以看到

0041D0C8  7C81CAC2  kernel32.ExitProcess
0041D0CC  7C8092F1  kernel32.GetTickCount
0041D0D0  7C810BDE  kernel32.SetFilePointer
0041D0D4  7C801812  kernel32.ReadFile
0041D0D8  7C82869E  kernel32.CopyFileA
0041D0DC  7C810AC7  kernel32.GetFileSize
0041D0E0  7C80236B  kernel32.CreateProcessA
0041D0E4  7C809B97  kernel32.CloseHandle
0041D0E8  7C812F6D  kernel32.GetCommandLineA
0041D0EC  7C832026  kernel32.SetEndOfFile
0041D0F0  7C801A28  kernel32.CreateFileA
0041D0F4  7C835E6F  kernel32.MoveFileA
0041D0F8  7C809AA1  kernel32.VirtualAlloc
0041D0FC  7C809B34  kernel32.VirtualFree
0041D100  7C810DD7  kernel32.WriteFile
0041D104  7C80B6F1  kernel32.GetModuleHandleA
0041D108  00000000
0041D10C  77D2F3B7  USER32.SendMessageA
0041D110  77D211F1  USER32.PostQuitMessage
0041D114  77D1DBD4  USER32.MoveWindow
0041D118  77D50702  USER32.MessageBoxA
0041D11C  77D21304  USER32.LoadIconA
0041D120  77D1B6C4  USER32.GetWindowRect
0041D124  77D247FE  USER32.GetDlgItem
0041D128  77D1E5D2  USER32.GetDesktopWindow
0041D12C  77D3B12C  USER32.DialogBoxParamA
0041D130  77D2F55B  USER32.SetWindowTextA
0041D134  00000000
0041D138  7632311E  COMDLG32.GetOpenFileNameA
0041D13C  00000000

再回到OEP--->00401000,右键---新建EIP,然后就可以脱壳了,ImpREC修复时全部有效。
PEiD查得:MASM32 / TASM32
                            
                                                      evilangel
                                                      2009-7-3 23:39 

KRYPTON.rar

77.19 KB, 下载次数: 48, 下载积分: 吾爱币 -1 CB

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

ximo 发表于 2009-7-4 10:58
不错。
什么也不是 发表于 2009-7-4 12:15
小糊涂虫 发表于 2009-7-4 12:55
lal978112 发表于 2009-7-4 12:57
强啊!学习
lbmx8 发表于 2009-7-5 23:40
学习了,谢谢分享.......
A-new 发表于 2009-7-6 09:12
占位学习
挂挂 发表于 2009-7-6 09:26
学习了!!!!
月光下de床 发表于 2009-7-6 18:34
果然强!!!再次学习了:)
云水禅心 发表于 2009-7-7 11:21
学习下,好文章
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-1-12 01:34

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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