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]