我是靠谱客的博主 典雅绿草,这篇文章主要介绍ollyScript脱壳脚本 for ABC Cryptor(1.0)[-],现在分享给大家,希望可以做个参考。

前言

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脱壳脚本内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(49)

评论列表共有 0 条评论

立即
投稿
返回
顶部