本章节我们将学习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 //结束脚本的运行

X86逆向15:OD脚本的编写技巧的更多相关文章

  1. Gatling脚本编写技巧篇(二)

    脚本示例: import io.gatling.core.Predef._ import io.gatling.http.Predef._ import scala.concurrent.durati ...

  2. OD脚本指令集

    声明: 1.本指令集搜集自各论坛.博客,欢迎补充讨论 OD脚本指令集 在后面的文档中, “源操作数” 和 “目的操作数”表示以下含义: - 十六进制常数,既没有前缀也没有后缀. (例如:是00FF, ...

  3. 14条最佳JS代码编写技巧

    http://gaohaixian.blog.163.com/blog/static/123260105201142645458315/写任何编程代码,不同的开发者都会有不同的见解.但参考一下总是好的 ...

  4. 一键系统优化15项脚本,适用于Centos6.x

    #!/bin/sh ################################################ #Author:nulige # qqinfo:1034611705 # Date ...

  5. [改善Java代码]易变业务使用脚本语言编写

    建议16: 易变业务使用脚本语言编写 Java世界一直在遭受着异种语言的入侵,比如PHP.Ruby.Groovy.JavaScript等,这些“入侵者”都有一个共同特征:全是同一类语言—脚本语言,它们 ...

  6. Tsung脚本中使用动态参数(一)---直接在脚本里编写Erlang代码

    杀死一个程序猿,只要改三次需求.同理,杀死一个接口自动化测试人员,只要改三次接口数据处理方式.我目前的状态,改了一次接口数据处理方式,有一种胸闷的感觉. 因为改需求,所以,要改脚本.T_T.所以,才有 ...

  7. 010 Editor 8.0.1 之 逆向分析及注册机编写

    前言一.工具及软件介绍二.逆向分析2.1.找到提示错误注册弹窗2.2.分析跳转处代码2.3.=2D 函数分析2.3.1.获取注册码处分析2.3.2.3处分支分析2.3.2.1.9C情况2.3.2.2. ...

  8. Loadrunner的Socket脚本关联小技巧

    Socket脚本关联小技巧 我们在socket脚本调试的时候经常会遇到很多问题,比如:socket包中繁杂的二进制编码,socket数据如何进行截取,如何对socket数据包进行参数化等等,以下几点内 ...

  9. selenium从入门到应用 - 2,简单线性脚本的编写

    本系列所有代码 https://github.com/zhangting85/simpleWebtest 本文将介绍一个Java+TestNG+Maven+Selenium的web自动化测试脚本环境下 ...

随机推荐

  1. JavaWeb_(Hibernate框架)Hibernate论坛项目中一对多案例

    基于SSH论坛小型项目 传送门 用户和发帖进行举例 一对多关系:一个用户可以发表多个帖子 一对一关系:一个帖子属于一个用户发布 创建数据库用户user表 CREATE TABLE `hforum`.` ...

  2. HDU 5705 Clock(2016杭电女生专场1004)——角度追及问题

    题意是给出一个当前的时间和角度a,问从现在开始的下一个时针和分针形成角度a的时间是多少,时间向下取整. 分析:时针3600s走30°,故120s走1°,分针3600s走360°,故10s走1°,那么每 ...

  3. 内部排序总结之----插入类排序(插入和Shell)

    一.直接插入排序 直接插入排序(straight insertion sort)的做法是: 每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序. 第一趟比较前两个数,然后把第二 ...

  4. HTTP之Cookie和Session

    1. Cookie 1.1 为什么需要 Cookie? HTTP 协议是一种无状态的协议,也就是说,当前的 HTTP 请求与以前的 HTTP 请求没有任何联系.显然,这种无状态的情形在某些时候将让用户 ...

  5. CentOS7 上搭建 CDH(6.3.0)

    这里以四台节点搭建 IP HostName OS 192.168.8.5 h5(主) CentOS 7.5 192.168.8.6 h6(从) CentOS 7.5 192.168.8.7 h7(从) ...

  6. 解决 无法启动此程序,因为计算机中丢失opencv_world341.dll。请尝试重新安装改程序已解决此问题

    在运行OpenCV程序时报错:“无法启动此程序,因为计算机中丢失opencv_world341.dll.请尝试重新安装改程序已解决此问题”. 解决方法 我的bin目录是 D:\opencv\build ...

  7. linux下如何基于已有容器创建image并运行?

    1. 通过docker ps命令先找到容器id,示例如下,123456789012就是我们要找的 jello@~$ docker ps CONTAINER ID IMAGE COMMAND CREAT ...

  8. 带你体验Android自定义圆形刻度罗盘 仪表盘 实现指针动态改变

    带你体验Android自定义圆形刻度罗盘 仪表盘 实现指针动态改变 转 https://blog.csdn.net/qq_30993595/article/details/78915115   近期有 ...

  9. MediaPlayer 播放视频的方法

    MediaPlayer mediaPlayer = new MediaPlayer(); mediaPlayer.reset();//重置为初始状态 mediaPlayer.setAudioStrea ...

  10. Oracle 对某张表中的某一列进行取余,将结果集分为多个集合

    比如分为 5个集合,那么就用某一列和5 取余 ,分别可以取  余数为 0.1.2.3.4 的结果集,那么就把集合分为5个小的集合了 1.取余数为 0 的集合 select * from (select ...