wgz001 发表于 2009-4-21 07:10

KRYPTON脱壳BY CCDebuger


一、OEP:

不忽略所有异常,用异常计数器插件先第一步计数,程序运行起来后CTR+F2重新载入程序,用异常计数器选第二步:带我到 OEP,当程序暂停时,ALT+M 打开内存,在代码段上按 F2 设断点,再回到反汇编窗口,按 SHIF+F9,断下来的时候往下看一下:

004E3A58    8B95 B6BB4100   MOV EDX,DWORD PTR SS:
004E3A5E    FFE2            JMP EDX                                  ; 跳到 OEP
004E3A60    51            PUSH ECX
004E3A61    836C24 04 06    SUB DWORD PTR SS:,6

那个 JMP EDX 就是跳到 OEP 的。在这条命令上设断,F9,再按 F8,就到 OEP 了:

00401000    6A 00         PUSH 0                                 ; OEP
00401002    E8 C1100000   CALL 004020C8
00401007    A3 583B4000   MOV DWORD PTR DS:,EAX
--------------------------------------------------------------------------------------------------
二、输入表:
到 OEP 后,右键选择“分析->从模块中删除分析”,随便找个 API 调用看看,可以知道输入表加密了:

004020C8- FF25 04D14100   JMP DWORD PTR DS:                ; 输入表被加密了
004020CE- FF25 0CD14100   JMP DWORD PTR DS:
004020D4- FF25 10D14100   JMP DWORD PTR DS:
004020DA- FF25 14D14100   JMP DWORD PTR DS:
--------------------------------------------------------------------------------------------------
现在 CTR+F2 重新载入程序,为方便调试,忽略所有异常。定位到数据窗口,CTR+G 转到我们前面看到的地址 41D104,设内存写入断点。一直按 F9,当断下来看到如下代码时就看到处理输入表的部分了:
--------------------------------------------------------------------------------------------------
004E311F    8907            MOV DWORD PTR DS:,EAX               ; 获取的函数地址送到输入表中的相关位置。如果前面没NOP,这里会加密
004E3121    EB 45         JMP SHORT 004E3168
004E3123    DF69 4E         FILD QWORD PTR DS:
004E3126    58            POP EAX
--------------------------------------------------------------------------------------------------
删除内存断点,一路 F8 跟跟看:

004E2812    8B95 2C784000   MOV EDX,DWORD PTR SS:      ; 处理输入表
004E2818    8B06            MOV EAX,DWORD PTR DS:
004E281A    0BC0            OR EAX,EAX
004E281C    75 03         JNZ SHORT 004E2821
004E281E    8B46 10         MOV EAX,DWORD PTR DS:
004E2821    03C2            ADD EAX,EDX                              ; 基址+输入表函数RVA
004E2823    0385 1C784000   ADD EAX,DWORD PTR SS:
004E2829    8B18            MOV EBX,DWORD PTR DS:
004E282B    8B7E 10         MOV EDI,DWORD PTR DS:
004E282E    03FA            ADD EDI,EDX
004E2830    03BD 1C784000   ADD EDI,DWORD PTR SS:
004E2836    85DB            TEST EBX,EBX
004E2838    0F84 B9090000   JE 004E31F7
004E283E    F7C3 00000011   TEST EBX,11000000
004E2844    75 2A         JNZ SHORT 004E2870
004E2846    F7C3 00000080   TEST EBX,80000000
004E284C    75 22         JNZ SHORT 004E2870
004E284E    03DA            ADD EBX,EDX
004E2850    83C3 02         ADD EBX,2
004E2853    813B 46617461   CMP DWORD PTR DS:,61746146
004E2859    75 0D         JNZ SHORT 004E2868
004E285B    817B 04 6C45786>CMP DWORD PTR DS:,6978456C
004E2862    0F84 8F090000   JE 004E31F7
004E2868    899D 6F714000   MOV DWORD PTR SS:,EBX
004E286E    EB 17         JMP SHORT 004E2887
004E2870    90            NOP
004E2871    90            NOP
004E2872    81EB 00000011   SUB EBX,11000000
004E2878    C1CB 03         ROR EBX,3
004E287B    C785 6F714000 0>MOV DWORD PTR SS:,0
004E2885   /EB 11         JMP SHORT 004E2898
004E2887   |90            NOP
004E2888   |90            NOP
004E2889   |C00B 02         ROR BYTE PTR DS:,2
004E288C   |43            INC EBX
004E288D   |803B 00         CMP BYTE PTR DS:,0
004E2890^|75 F5         JNZ SHORT 004E2887
004E2892   |8B9D 6F714000   MOV EBX,DWORD PTR SS:
004E2898   \90            NOP
004E2899    81E3 FFFFFF0F   AND EBX,0FFFFFFF
004E289F    53            PUSH EBX
004E28A0    FFB5 18784000   PUSH DWORD PTR SS:
004E28A6    FF95 50BE4100   CALL DWORD PTR SS:
004E28AC    83BD 6F714000 0>CMP DWORD PTR SS:,0
004E28B3    74 13         JE SHORT 004E28C8
004E28B5    8B8D 6F714000   MOV ECX,DWORD PTR SS:      ; 解码后的输入表函数ASCII字串
004E28BB    90            NOP
004E28BC    90            NOP
004E28BD    90            NOP
004E28BE    D221            SHL BYTE PTR DS:,CL               ; 继续加密原来的函数ASCII字串
004E28C0    3001            XOR BYTE PTR DS:,AL
004E28C2    41            INC ECX
004E28C3    8039 00         CMP BYTE PTR DS:,0
004E28C6^ 75 F3         JNZ SHORT 004E28BB
004E28C8    0BC0            OR EAX,EAX
004E28CA^ 0F84 CADFFFFF   JE 004E089A
004E28D0    EB 44         JMP SHORT 004E2916
--------------------------------------------------------------------------------------------------
004E29AF    8985 96714000   MOV DWORD PTR SS:,EAX      ; 保存获取的输入表函数地址
004E29B5    EB 45         JMP SHORT 004E29FC
004E29B7    DF69 4E         FILD QWORD PTR DS:
004E29BA    58            POP EAX
--------------------------------------------------------------------------------------------------
004E30D5    8B85 A6714000   MOV EAX,DWORD PTR SS:      ; 加密输入表的,NOP掉
004E30DB    EB 38         JMP SHORT 004E3115
004E30DD    DF69 4E         FILD QWORD PTR DS:
004E30E0    58            POP EAX
--------------------------------------------------------------------------------------------------
三、脱壳脚本:

/*
Script written by CCDebuger
Script   : Krypton 0.2 Unpack
版本   : v0.1
日期   : 17-04-2009
调试环境 : OllyDbg 1.1, ODBGScript 1.65, WINXP, WIN2000
调试选项 : 设置 OllyDbg 忽略所有异常选项
工具 : OllyDbg, ODBGScript 1.65
感谢 : Oleh Yuschuk - author of OllyDbg
       SHaG - author of OllyScript
       hnhuqiong - author of ODbgScript
*/
var temp

cmp $VERSION, "1.65"
jb errorver
bc
bphwcall
dbh
findop eip, #FFE6#
mov temp, $RESULT
bp temp
esto
bc
sto
find eip, #8B95????????8B060BC0#
mov temp, $RESULT
bp temp
esto
bc
find eip, #8B85????????EB#
mov temp, $RESULT
add temp, 6
/*查找以下命令:
004E30D5    8B85 A6714000   MOV EAX,DWORD PTR SS:      ; 加密输入表的,NOP掉
*/
find temp, #8B85????????EB#
mov temp, $RESULT
mov , #909090909090#
/*查找以下命令:
004E3A5E    FFE2            JMP EDX                                  ; 跳到 OEP
004E3A60    51            PUSH ECX
*/
find temp, #FFE251#
mov temp, $RESULT
bphws temp, "x"
esto
bphwc
sto
cmt eip, "已到 OEP,请用 ImportREC 重建输入表"
ret

errorver:
msg "运行此脚本需要 ODbgScript 1.65 或更高的版本,您的版本过低,请更新 ODbgScript 后再试。"
页: [1]
查看完整版本: KRYPTON脱壳BY CCDebuger