前言
ABC Cryptor(1.0)[-] 特点 : 可以找到跳到OEP之前的OPCODE, 再F8一次,就可以到达OEP.
这个脚本用来练习搜索特征码.
脱壳脚本
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
// @file ollyScriptDump_ABC Cryptor(1.0)[-].txt
// @brief ollyScript脱壳脚本 for ABC Cryptor(1.0)[-]
// @note ABC Cryptor(1.0)[-] 特点 : 可以找到跳到OEP之前的OPCODE, 再F8一次,就可以到达OEP.
/**
特征码
0046B0B2 E8 00000000 call 0046B0B7
0046B0B7 C3 retn
*/
// 脚本函数全局变量
var g_IpToOpt // 要进行操作的IP值,先赋值, 再调用函数, 相当于给入参
/** e.g.
mov g_IpToOpt, eip
call fnDispDisasmCmdByEip
*/
var g_vImageBase // ImageBase值, 用于计算ImpREC填写的OEP值
var g_vPeNameDumpTo // 脱壳后的PE名称, 不要加路径, 和被脱壳程序在同一目录
// 脚本主函数需要的变量
var vEIP // eip值
var vEP // EP值
var vESP // ESP值
var vEspValue // [ESP]的值
var vBpAddr_OEP // OEP下断地址
var vTmp
call fnScriptInit
eval ">> task begin ..."
log $RESULT
GMI eip, MODULEBASE // 得到ImageBase
mov g_vImageBase, $RESULT
eval "ImageBase = {g_vImageBase}"
log $RESULT
mov vEIP, eip
GMI eip, ENTRY // 得到EP值
mov vEP, $RESULT
eval "EP = {vEP}"
log $RESULT
cmp vEP, eip
je L_UNPACK_BEGIN
// 报错信息-此脚本必须在EP处开始运行
eval "error:rn脚本需要从EP({vEP})开始运行, 但是EIP = ({eip})rn请重新载入程序后, 再运行此脚本"
msg $RESULT
jmp L_END
L_UNPACK_BEGIN:
// findop 用来搜索一句完整的opcode
// findmem 用来搜索一个内存块数据, 比findop好用
findmem #E800000000C3#, vEP // 特征码在前, IP在后
mov vBpAddr_OEP, $RESULT
cmp vBpAddr_OEP, 0
je L_FINDOPCODE_FAILED
add vBpAddr_OEP, 5 // 在ret处下硬件执行断点
bphws vBpAddr_OEP, "x"
eob L_BP_PROC
go
L_FINDOPCODE_FAILED:
msg "没有找到壳的特征码"
jmp L_END
L_END:
eval "<< task end"
log $RESULT
ret
// 断点的回调函数
L_BP_PROC:
eval ">> L_BP_PROC"
log $RESULT
mov g_IpToOpt, eip
call fnDispDisasmCmdByEip
// 这里要向前走一步的话, 用sto或sti要执行2次
// 即使取消了EIP上的断点, 也要走2次单步才能过去
sto
sto
mov g_IpToOpt, eip
call fnDispDisasmCmdByEip
call fnDumpAndWaitIatfix
jmp L_END
ret
fnDispDisasmCmdByEip:
var _vDisasmCmd
GCI g_IpToOpt, COMMAND // 得到当前EIP的汇编命令信息, e.g. "call ebp"
mov _vDisasmCmd, $RESULT
eval "{g_IpToOpt} {_vDisasmCmd}" // 打印当前反汇编命令
log $RESULT
ret
fnScriptInit:
mov g_vPeNameDumpTo, "dumpByOllyScript.exe"
LCLR // 清除Script日志窗口内容
bc * // 清除所有F2断点
BPHWCALL // 清除所有硬断点
call fnPrintOllyScriptVersion
ret
fnPrintOllyScriptVersion:
eval "ollyScript version = {$VERSION}"
log $RESULT
ret
fnDumpAndWaitIatfix:
var _vTmp
var _vImpRecOEP // 在ImpREC中填写的OEP值
// 到达了OEP, 脱壳
an eip // 分析代码
cmt eip, "this is OEP" // 在OEP地址处加日志
// 脱壳
dpe g_vPeNameDumpTo, eip
// 脱壳完成, 提示我使用ImpREC进行IAT修复
mov _vImpRecOEP, eip
sub _vImpRecOEP, g_vImageBase
eval "脱壳完成: 请停在此处, 对[{g_vPeNameDumpTo}]进行IAT修复rn impREC's OEP = {_vImpRecOEP}"
mov _vTmp, $RESULT
log _vTmp
msg _vTmp
ret
运行效果
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
Script Log Window
Address Message
46B001 $RESULT: ollyScript version = 1.65
46B001 $RESULT: >> task begin ...
46B001 $RESULT: ImageBase = 400000
46B001 $RESULT: EP = 46B001
46B0B7 $RESULT: >> L_BP_PROC
46B0B7 $RESULT: 46B0B7 retn
4271B0 $RESULT: 4271B0 push ebp
4271B0 _vTmp: 脱壳完成: 请停在此处, 对[dumpByOllyScript.exe]进行IAT修复
impREC's OEP = 271B0
4271B0 $RESULT: << task end
最后
以上就是典雅绿草最近收集整理的关于ollyScript脱壳脚本 for ABC Cryptor(1.0)[-]的全部内容,更多相关ollyScript脱壳脚本内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复