X86逆向教程15:OD脚本的编写技巧

本章节我们将学习OD脚本的使用与编写技巧,脚本有啥用呢?脚本的用处非常的大,比如我们要对按钮事件进行批量下断点,此时使用自动化脚本将大大减小我们的工作量,再比如有些比较简单的压缩壳需要脱壳,此时我们也可以写出属于自己的脱壳脚本,以后遇到了对应的壳就可以使用对应脚本快速的搞定,好了废话不多说,开始进入今天的正题吧。

------------------------------------------------------------
本章难度:★☆☆☆☆☆☆☆☆☆
课程课件:CM_15.zip
------------------------------------------------------------

Delphi/BC++ 批量下断脚本

脚本代码,保存为 Delphi.osc

var Addr                      // 局部变量
mov Addr,401000               // 指定地址为401000

loop:
	find Addr,#740E8BD38B83????????FF93????????#     // 查找特征码,并将地址放入RESULT(00401000)
	cmp $RESULT,0                                    // 如果为0则直接跳出循环
	je Exit
	add $RESULT,0A                                   // 相加 (00401000+0A=0040100A)
	bp $RESULT                                       // 下断
	add $RESULT,1                                    // 每次递增1
	mov Addr,$RESULT                                 // 将地址赋给Addr
jmp loop
Exit:
ret

 

1.OD直接载入CM课件中的【Project1.exe】这是一个Delphi写的测试程序,此时我们运行这个程序,会看到有三个按钮。

 

2.回到OD反汇编窗口,点击【右键】,运行脚本打开,选择我们上方保存下来的脚本文件。

 

3.选择好脚本以后,我们点击重新载入程序,然后按下【Alt +B】会看到所有的断点已经下好了,这个程序很小所以就这么几个。

 

4.运行程序点击,弹窗按钮,程序会断下,直接【F7】进入CALL的内部就能看到按钮的核心代码了。

 

VB6.0 批量下断脚本

脚本代码,保存为 VB6.osc

var Addr
mov Addr,401000

loop:
	find Addr,#816C2404??000000#
	cmp $RESULT,0
	je Exit
	add $RESULT,08
	bp $RESULT
	add $RESULT,1
	mov Addr,$RESULT
jmp loop
Exit:

 

1.OD直接载入CM课件中的【VB6.exe】这是一个VB写的测试程序,我们运行这个程序。

 

2.回到OD反汇编窗口,点击【右键】,运行脚本打开,选择我们上方保存下来的脚本文件。

 

3.选择好脚本以后,我们点击重新载入程序,然后按下【Alt +B】会看到所有的断点已经下好了,这个程序很小所以就这么几个。

 

4.运行程序点击,弹窗按钮,程序会断下,直接【F8】进入CALL的内部就能看到按钮的核心代码了。

 

易语言 批量下断脚本

脚本代码,保存为 易语言.osc

var Addr
mov Addr,401000

loop:
	find Addr,#FF55FC5F5E#
	cmp $RESULT,0
	je Exit
	bp $RESULT
	add $RESULT,1
	mov Addr,$RESULT
jmp loop
Exit:
ret

 

1.OD直接载入CM课件中的【易语言.exe】这是一个易语言写的测试程序,我们运行这个程序。

 

2.回到OD反汇编窗口,点击【右键】,运行脚本打开,选择我们上方保存下来的脚本文件。

 

3.选择好脚本以后,我们点击重新载入程序,然后按下【Alt +B】会看到所有的断点已经下好了,这个程序很小所以就这么几个。

 

4.运行程序点击,弹窗按钮,程序会断下,直接【F7】进入CALL的内部就能看到按钮的核心代码了。

 

VC++6.0/MFC 手动下断点

VC6的特征比较特殊,这里我们只能手动下断了

1.OD直接载入CM课件中的【VC++.exe】这是一个易语言写的测试程序,我们运行这个程序。

 

2.按下【Ctrl +F】按钮,输入命令【sub eax,0a】,会搜索到如下代码,我们选中【sub eax,0a】的下面一条指令处回车。

 

3.程序会跳转到如下位置,我们在跳转后的【00416043】处下断点,VC6只有这一处。

 

4.回到程序,我们点击【注册按钮】然后程序会断在CALL的位置上,我们直接【F7】进入到CALL的内部,然后在按下两次【F8】

最后就是VC++的按钮事件核心代码。

 

几个常用的脱壳脚本

我们使用CM_14.zip里面加过壳的案例。

1.脱 Aspack 脚本

// 脱 Aspack 壳的脚本
findop eip,#61#         // 查找popad
bphws $RESULT,"x"       // 返回查找到的地址,下硬件执行断点 
run                     // 运行
bphws $RESULT           // 取消硬件断点
sto                     // 单步F8
sto
sto
sto
cmt eip,"已经找到了"    // 添加注释
ret

 

2.脱 UPX 脚本

// 脱 UPX 脚本

var addr              // 定义一个变量addr 
sto                   // 单步,也就是F8 
mov addr,esp          // 把此处ESP的地址给变量addr 
bphws addr,"r"        // 下硬件读取断点,也就是硬件访问断点 
run                   // 运行,也就是F9 
BPHWC addr            // 取消断点 
sto                   // 单步,也就是F8 
find eip,#83EC80#     // 查找特征加密语句
bp $RESULT            // 对返回的地址处F2下断
run                   // 运行到该处
sto                   // 单步F8两次
sto

cmt eip,"这里就是OEP" // 脱壳完成
ret                   // 结束脚本

 

3.下方的两个脚本为转载脚本,一个是脱MoleBox另一个是脱穿山甲

MoleBox v2.X 脱壳脚本

var addr //定义一个变量,用来放ESP的值
sto
sto//单步2次
mov addr,esp //把ESP的值,放变量addr中
bphws addr,"r" //下硬件访问断点

/*接着来处理IAT*/ 

gpa "VirtualProtect","kernel32.dll"//查找特征API,并把查找到的地址放RESULT中
bp $RESULT //对找到的地址处,下F2断点,也就是BP
run//运行
bc $RESULT //取消断点
rtu//ALT+F9返回


/*返回后,找特征加密语句,处理IAT的加密*/

find eip,#8901#//查找特征加密语句
bp $RESULT //对返回的地址处F2下断
run//运行到该处
bc $RESULT //取消断点
repl eip, #8901#, #9090#, 10 //把加密语句NOP掉,即替换为9090

/*下面就去OEP了*/ 

run//由于刚才已经下好了硬件断点,现在只要运行即可
bphwc addr //取消断点
sto
sto//单步走2次
sti//F7跟进,就来到了OEP了
cmt eip,"这里就是OEP!"//在EIP处,也就是现在OD停留了位置加注释
ret//结束脚本
var GetModuleHandleA
var VirtualAlloc
var CreateThread 
var OEP //定义4个变量

MSGYN "请取消所以的断点,忽略所有异常,并添加C000001D..C000001E到异常中!"//提示运行脚本前的一些信息
cmp $RESULT, 0//比较是否点"否"或"取消"
je end//如果点"否"或"取消",就来到end处

/*做些准备工作,找到所要下的各函数的地址*/

gpa "GetModuleHandleA", "kernel32.dll"//找特征API函数GetModuleHandleA
mov GetModuleHandleA, $RESULT //把找到的地址放变量GetModuleHandleA中
add GetModuleHandleA,5//GetModuleHandleA=GetModuleHandleA+5
gpa "VirtualAlloc", "kernel32.dll"//找特征APIVirtualAlloc
mov VirtualAlloc, $RESULT //把找到的地址放变量VtrtualAlloc中
gpa "CreateThread", "kernel32.dll"//找特征APICreateThread
mov CreateThread, $RESULT //把找到的地址放变量CreateThread中 

/*下断点GetModuleHandleA+5,找合适的时机返回*/

bphws GetModuleHandleA, "x" //在GetModuleHandleA+5处,下硬件执行断点

label1: //标签label1
esto//SHIFT+F9
cmp eax,VirtualAlloc//比较EAX的值是否为VirtualAlloc 
jne label1//不是的话,来到标签label1,继续SHIFT+F9
esto//再SHIFT+F9,来到最佳的返回时机
bphwc GetModuleHandleA//取消此硬件断点
rtu //ALT+F9返回

/*找magic jump,并修改*/

find eip, #0F84????????#//查找magic jump的特征码,"?"为通配符
bp $RESULT//找到的地址处下断
esto//SHIFT+F9
bc $RESULT//取消断点
repl eip, #0F84????????#, #90E9????????#, 10//修改magic jump,即改为"90E9"。由于字节数不同,故NOP填充


/*寻找OEP*/

bp CreateThread //下断点bp CreateThread
run //运行
bc CreateThread //取消断点
rtu //ALT+F9返回
rtr //执行到返回,相当与CTRL+F9
sti //F7

/*例子中的特征代码:
00B4F6F32BCAsub ecx,edx
00B4F6F5FFD1call ecx
00B4F6F7EB 20 jmp short 00B4F719
*/


find eip, #2B??FF??8?#//找特征代码
mov OEP, $RESULT//把返回的值放变量OEP中
add OEP, 2//OEP=OEP+2,很明显找到地址的后2个字节就是
bp OEP//下断点
run //运行
bc OEP//取消断点
sti //F7进去,就是OEP了
cmt eip,"这里就是OEP!" //在EIP处,也就是现在OD停留了位置加注释
ret //结束脚本

end:
msg "您取消了脚本的运行!"//提示没有运行脚本
ret //结束脚本的运行

转载于:https://www.cnblogs.com/LyShark/p/11197005.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
版本 2 Copy Exception Exception Debug Event unionData GlobalSize Exception Exception 判断开始 Exception pExceptionRecord ExceptionCode = 十六到十 #Exception BreakPoint " int3断点 ExceptCount = ExceptCount + 1 是否单步 = 真 Exception BreakPoint 判断 Exception pExceptionRecord ExceptionCode = 十六到十 #Exception Single Step " 处于被单步调试状态 Exception Single Step 判断 Exception pExceptionRecord ExceptionCode = 十六到十 #Exception Access Violation " 读写内存冲突 加入调试信息 “读写内存冲突” 判断 Exception pExceptionRecord ExceptionCode = 十六到十 #Exception IN Page Error " 存取未存在的内存页 加入调试信息 “存取未存在的内存页” 判断 Exception pExceptionRecord ExceptionCode = 十六到十 #Exception Illegal InStruction " 执行非法指令 加入调试信息 “执行非法指令” 判断 Exception pExceptionRecord ExceptionCode = 十六到十 #Exception Stack OverFlow " 线程堆栈溢出 越界 加入调试信息 “线程堆栈溢出 越界” 判断 Exception pExceptionRecord ExceptionCode = 十六到十 #Exception NoContinueAble Exception " 不可持续异常 加入调试信息 “不可持续异常” "> 版本 2 Copy Exception Exception Debug Event unionData GlobalSize Exception Exception 判断开始 Exception pExceptionRecord ExceptionCode = 十六到十 #Exception BreakPoint " int3断点 ExceptCount = ExceptCount + 1 是否单步 = 真 Exception BreakPoint [更多]
"Linux-x86_64 error: 28: no space left on device"是指在Linux操作系统中,出现了磁盘空间不足的错误。这种错误通常发生在硬盘或分区的可用空间已经耗尽,无法继续写入数据或创建新文件。 当系统磁盘空间不足时,可能会导致一些严重的问题,例如无法正常运行软件或操作系统等。因此,我们需要采取一些措施来解决这个问题。 首先,我们可以使用`df -h`命令来查看磁盘空间的利用情况。它会显示出所有磁盘分区的使用情况以及剩余空间。 如果我们发现有一些大文件或文件夹占用了大量的磁盘空间,我们可以使用`du -sh <文件名或文件夹名>`命令来查找占用空间最多的文件或文件夹。 一种常见的解决方法是删除一些不再需要的文件或文件夹,以释放磁盘空间。可以使用`rm`命令删除单个文件,或使用`rm -r`命令删除整个文件夹。 另外,我们也可以考虑使用一些工具来压缩已有的文件或文件夹,以节省磁盘空间。例如,可以使用zip或tar命令将文件打包成压缩文件,然后删除原始文件。 如果上述方法无法解决问题,可能需要对磁盘进行扩容。这可以通过添加新的硬盘或扩展现有的分区来实现。具体的步骤可以根据不同的情况而定,可以参考一些相关的教程或咨询专业人士的建议。 总之,当出现"Linux-x86_64 error: 28: no space left on device"错误时,我们应该首先查看磁盘空间的使用情况,然后删除不需要的文件或压缩已有文件,并在必要时扩展磁盘的容量,以解决这个问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值