首页
社区
课程
招聘
[求助]KRYPTON0.2脱壳求助
发表于: 2007-5-8 20:07 5107

[求助]KRYPTON0.2脱壳求助

2007-5-8 20:07
5107
第一次异常:
003933A8    9C              pushfd
003933A9    804C24 01 01    or      byte ptr [esp+1], 1
003933AE    9D              popfd
003933AF    90              nop
003933B0    64:8F00         pop     dword ptr fs:[eax]               ; 0012FF98
第2次异常:
00393402    66:BE 4746      mov     si, 4647
00393406    66:BF 4D4A      mov     di, 4A4D
0039340A    CC              int3
第3次异常
0039037B    8918            mov     dword ptr [eax], ebx             ; KRYPTON.0041D400
第4次异常:
00393928    D975 F8         fstenv  (28-byte) ptr [ebp-8]
看堆栈
SE句柄=003939DD
003939DD    64:67:A1 0000   mov     eax, dword ptr fs:[0]
003939E2    8B20            mov     esp, dword ptr [eax]
003939E4    64:67:8F06 0000 pop     dword ptr fs:[0]
003939EA    E8 00000000     call    003939EF
003939EF    5D              pop     ebp
003939F0    81ED A2794000   sub     ebp, 4079A2
003939F6    80BD FB824000 F>cmp     byte ptr [ebp+4082FB], 0FF
003939FD    74 11           je      short 00393A10
003939FF    8B8D AFBB4100   mov     ecx, dword ptr [ebp+41BBAF]
00393A05    890C24          mov     dword ptr [esp], ecx
00393A08    8B95 B6BB4100   mov     edx, dword ptr [ebp+41BBB6]
00393A0E    FFE2            jmp     edx
00393A10    E8 00000000     call    00393A15
00393A15    5D              pop     ebp
00393A16    81ED C8794000   sub     ebp, 4079C8
00393A1C    B8 00104000     mov     eax, 401000
00393A21    8B8D 00834000   mov     ecx, dword ptr [ebp+408300]
00393A27    8D9D 137A4000   lea     ebx, dword ptr [ebp+407A13]
00393A2D    899D A8BB4100   mov     dword ptr [ebp+41BBA8], ebx
00393A33    8D9D A8BB4100   lea     ebx, dword ptr [ebp+41BBA8]
00393A39    66:8138 FF15    cmp     word ptr [eax], 15FF
00393A3E    75 09           jnz     short 00393A49
00393A40    8378 02 00      cmp     dword ptr [eax+2], 0
00393A44    75 03           jnz     short 00393A49
00393A46    8958 02         mov     dword ptr [eax+2], ebx
00393A49    40              inc     eax
00393A4A    49              dec     ecx
00393A4B    85C9            test    ecx, ecx
00393A4D  ^ 75 EA           jnz     short 00393A39
00393A4F    8B8D AFBB4100   mov     ecx, dword ptr [ebp+41BBAF]
00393A55    890C24          mov     dword ptr [esp], ecx
00393A58    8B95 B6BB4100   mov     edx, dword ptr [ebp+41BBB6]
00393A5E    FFE2            jmp     edx                            //到OEP

下面轮到找壳怎么处理IAT:
0040206E   $- FF25 C8D04100 jmp     dword ptr [41D0C8]
.......................................................
0040210A   $- FF25 38D14100 jmp     dword ptr [41D138]

随便跟进一个:
003701F0    8135 0B023700 6>xor     dword ptr [37020B], 344BB764
003701FA    A1 0B023700     mov     eax, dword ptr [37020B]                //正确的函数指针
003701FF    8135 0B023700 6>xor     dword ptr [37020B], 344BB764
00370209    FFE0            jmp     eax

上面的就象一个表,观察发现从0037001F开始是这样类似的结构
0037001F  81 35 3A 00 37 00 CB F0 A8 38 A1 3A 00 37 00 81  ?:.7.损??.7.
0037002F  35 3A 00 37 00 CB F0 A8 38 FF E0 69 3A 29 44 81  5:.7.损?鄆:)D
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
0037032F  37 A1 41 03 37 00 81 35 41 03 37 00 F0 E5 88 37  77.?A7.疱?
0037033F  FF E0 AA 39 59 40 81 35 60 03 37 00 69 37 F9 22  嗒9Y@?`7.i7?
0037034F  A1 60 03 37 00 81 35 60 03 37 00 69 37 F9 22 FF  7.?`7.i7?
0037035F  E0 77 06 CB 54                                   鄔薚..

========================================================================================
下命令:hr  0037001F
00392AE8    43              inc     ebx                           // ebx=0037001F

00392B09    47              inc     edi                          //edi=003931C8

00392B2B    833F 00         cmp     dword ptr [edi], 0           //ds:[003931C9]=40719635

00392AA1    8A0F            mov     cl, byte ptr [edi]

00392AC3    880B            mov     byte ptr [ebx], cl

00392AE8    43              inc     ebx

00392B09    47              inc     edi

00392B2B    833F 00         cmp     dword ptr [edi], 0

00392AA1    8A0F            mov     cl, byte ptr [edi]

00392AC3    880B            mov     byte ptr [ebx], cl

原来这个表是从003931C8的地址copy过来的
003931C8    8135 96714000 1>xor     dword ptr [407196], 11111111        
003931D2    A1 96714000     mov     eax, dword ptr [407196]            
003931D7    8135 96714000 1>xor     dword ptr [407196], 11111111         
003931E1    FFE0            jmp     eax                                 

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

到这里我就卡住了,也参考了论坛上关于KRYPTON的脱壳文章,自己研究了下,始终领悟不了,理解能力太差了
不知道怎么样修改代码才可以避开加密IAT
下面我就乱来了,把0037001F开始的当作一个表,现在我的想法是让程序把这个表印射到0040####这样的地址当中!
1。先给未脱壳程序增加一个区段

名称;     hhq
虚拟地址: 0004D000
虚拟大小; 00028000                //要尽量大
物理偏移: 00047800
物理大小: 00002000
标志:     E0000020

静象大小:00075000
2.
0044BDA1    FF95 0DBE4100   call    dword ptr [ebp+41BE0D]                    //申请内存
0044BDA7    8985 34BE4100   mov     dword ptr [ebp+41BE34], eax               //EAX=00370000,我改成0044D000
0044BDAD    B8 11810100     mov     eax, 18111
0044BDB2    6A 40           push    40
0044BDB4    68 00100000     push    1000
0044BDB9    50              push    eax
0044BDBA    6A 00           push    0
0044BDBC    50              push    eax
0044BDBD    8B85 0DBE4100   mov     eax, dword ptr [ebp+41BE0D]
0044BDC3    8038 CC         cmp     byte ptr [eax], 0CC
0044BDC6    0F84 81000000   je      0044BE4D
0044BDCC    58              pop     eax
0044BDCD    FF95 0DBE4100   call    dword ptr [ebp+41BE0D]                 //申请内存
0044BDD3    8BF0            mov     esi, eax                               //EAX=00390000,我改成0044F000

其余的同上,到OEP后dump,这个表是被隐射到了004#####这样的地址,
但是DUMP的程序还是有些函数的指针出错了!!!!!
太累了,弄了几天还是搞不明白,希望大虾指点下,比如怎么避开加密

脱壳的真差劲,撞墙!!

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 383
活跃值: (41)
能力值: ( LV12,RANK:530 )
在线值:
发帖
回帖
粉丝
2
http://www.pediy.com/tools/PACK/Protectors/Krypton/krypton02.zip
目标程序在这里
还忘记说OD是除了kernell32.dll内存异常打勾外,其他的都不打
对比了未脱壳的程序,发现我所说的那个表没有差异,嘿嘿
但是EAX却指不到正确的函数,看来还和某些地方有关
2007-5-8 20:17
0
雪    币: 170
活跃值: (18)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
OEP很好找,是00401000,麻烦就在IAT修复上,用最简单的办法:直接运行KRYPTON.EXE后,打开ImportREC,OEP:1000 自动查找IAT,然后获取输入表,用指针3修复即可
上传的附件:
2007-5-9 08:28
0
雪    币: 313
活跃值: (250)
能力值: ( LV9,RANK:650 )
在线值:
发帖
回帖
粉丝
4
方法的确不错,但是加壳时出错
2007-5-9 11:47
0
雪    币: 170
活跃值: (18)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
好象IAT修复的时候地址要手动指定的吧,估计问题出在这,IAT修复不完全。
2007-5-9 12:49
0
雪    币: 304
活跃值: (82)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
6
输入表很容易处理的,一般不会有大的问题
壳在到OEP后,有部分Call是进入壳动态内存的, 所以直接dump下来,有些功能执行会出错
下面是壳跳oep前的处理

003B3A39    66:8138 FF15       cmp     word ptr [eax], 15FF    //比较是否是call
003B3A3E    75 09              jnz     short 003B3A49
003B3A40    8378 02 00         cmp     dword ptr [eax+2], 0    //比较是否是call [0]
003B3A44    75 03              jnz     short 003B3A49
003B3A46    8958 02            mov     dword ptr [eax+2], ebx //此时ebx == 003C7BF5
003B3A49    40                 inc     eax
003B3A4A    49                 dec     ecx
003B3A4B    85C9               test    ecx, ecx
003B3A4D  ^ 75 EA              jnz     short 003B3A39            //循环
003B3A4F    8B8D AFBB4100      mov     ecx, dword ptr [ebp+41BBAF]
003B3A55    890C24             mov     dword ptr [esp], ecx
003B3A58    8B95 B6BB4100      mov     edx, dword ptr [ebp+41BBB6]   //取出oep地址
003B3A5E    FFE2               jmp     edx                            //edx = 401000 跳OEP

到OEP后,代码中有很多处都是这样的:
00401928    6A 00              push    0
0040192A    68 483B4000        push    00403B48
0040192F    FF35 543B4000      push    dword ptr [403B54]
00401935    FF35 3C3B4000      push    dword ptr [403B3C]
0040193B    FF35 603B4000      push    dword ptr [403B60]
00401941    E8 3A070000        call    00402080
00401946    FF15 F57B3C00      call    dword ptr [3C7BF5]   :[003C7BF5]=003B3A60
0040194C    FF15 F57B3C00      call    dword ptr [3C7BF5]   :[003C7BF5]=003B3A60

所以应该自己写段代码处理一下子~~~~~
我写段到OEP的脚本吧,修复这种call的就不会了~~~~

#log
//KRYPTON0.2 主程序
//msg "忽略所有异常"
var oep
var codebase
var packerbase
var iidstart
var iidsize
gpa "VirtualAlloc","kernel32.dll"
cmp $RESULT,0
je err
find $RESULT,#C2??00#
cmp $RESULT,0
je err
bp $RESULT
esto
esto
bc $RESULT
mov packerbase,eax
go packerbase

//正式进入壳代码
find eip,#8B188B7E10#
cmp $RESULT,0
je err
bp $RESULT
esto
bc $RESULT
mov codebase,edx

find eip,#83BD????????007413#
cmp $RESULT,0
je err
add $RESULT,7
bp $RESULT
esto
bc $RESULT
mov [eip],#EB#    //不让它破坏函数名
mov iidstart,esi

bpwm packerbase,1
esto
bpmc

mov iidsize,esi
sub iidsize,iidstart
add iidsize,14    //还要一个空白iid收尾
sub iidstart,codebase

find eip,#FFE2#
cmp $RESULT,0
je err
add $RESULT,1
//在第二个jmp edx处跳OEP
find $RESULT,#FFE2#
cmp $RESULT,0
je err
bp $RESULT
esto
bc $RESULT
sti
mov oep,eip
sub oep,codebase
log oep
log iidstart
log iidsize
cmt eip,"OEP,直接dump,查看日志窗口,根据其中提示用loadpe修改dump下的文件"
ret
err:
msg "error"
ret
2007-5-9 14:56
0
雪    币: 383
活跃值: (41)
能力值: ( LV12,RANK:530 )
在线值:
发帖
回帖
粉丝
7
to yzjsdn:


不想用工具,觉得手动才可以学到东西,呵呵

to skylly
你说的很清楚呀,我自己领悟一下,都喜欢用脚本了,555,还没学会呢..DUMP后的程序确实有很多call壳中的代码的,
真想不到!

我觉得有些EAX指不到正确函数的原因应该是缺少模块什么的,比如EAX指向kernel32.dll中的函数就没有问题,这大概是每个函数都有kernel32.dll模块的原因吧~!如果EAX指向USER32.DLL中的函数,就出错了

00402131 >    68 14214000   push    00402114                         ;  ASCII "User32.dll"
00402136      E8 3CFC3F7C   call    kernel32.LoadLibraryA
0040213B      68 20214000   push    00402120                         ;  ASCII "comdlg32.dll"
00402140      E8 32FC3F7C   call    kernel32.LoadLibraryA
00402145    ^ E9 B6EEFFFF   jmp     00401000

这样似乎就可以了!
3Q everybody
2007-5-9 17:17
0
游客
登录 | 注册 方可回帖
返回
//