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

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

Delphi/BC++ 批量下断脚本

脚本代码,保存为 Delphi.osc

  1. var Addr // 局部变量
  2. mov Addr,401000 // 指定地址为401000
  3.  
  4. loop:
  5. find Addr,#740E8BD38B83????????FF93????????# // 查找特征码,并将地址放入RESULT(00401000)
  6. cmp $RESULT,0 // 如果为0则直接跳出循环
  7. je Exit
  8. add $RESULT,0A // 相加 (00401000+0A=0040100A)
  9. bp $RESULT // 下断
  10. add $RESULT,1 // 每次递增1
  11. mov Addr,$RESULT // 将地址赋给Addr
  12. jmp loop
  13. Exit:
  14. ret

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

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

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

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

VB6.0 批量下断脚本

脚本代码,保存为 VB6.osc

  1. var Addr
  2. mov Addr,401000
  3.  
  4. loop:
  5. find Addr,#816C2404??000000#
  6. cmp $RESULT,0
  7. je Exit
  8. add $RESULT,08
  9. bp $RESULT
  10. add $RESULT,1
  11. mov Addr,$RESULT
  12. jmp loop
  13. Exit:

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

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

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

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

易语言 批量下断脚本

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

  1. var Addr
  2. mov Addr,401000
  3.  
  4. loop:
  5. find Addr,#FF55FC5F5E#
  6. cmp $RESULT,0
  7. je Exit
  8. bp $RESULT
  9. add $RESULT,1
  10. mov Addr,$RESULT
  11. jmp loop
  12. Exit:
  13. 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 脚本

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

2.脱 UPX 脚本

  1. // 脱 UPX 脚本
  2.  
  3. var addr // 定义一个变量addr
  4. sto // 单步,也就是F8
  5. mov addr,esp // 把此处ESP的地址给变量addr
  6. bphws addr,"r" // 下硬件读取断点,也就是硬件访问断点
  7. run // 运行,也就是F9
  8. BPHWC addr // 取消断点
  9. sto // 单步,也就是F8
  10. find eip,#83EC80# // 查找特征加密语句
  11. bp $RESULT // 对返回的地址处F2下断
  12. run // 运行到该处
  13. sto // 单步F8两次
  14. sto
  15.  
  16. cmt eip,"这里就是OEP" // 脱壳完成
  17. ret // 结束脚本

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

  1. MoleBox v2.X 脱壳脚本
  2.  
  3. var addr //定义一个变量,用来放ESP的值
  4. sto
  5. sto//单步2次
  6. mov addr,esp //把ESP的值,放变量addr中
  7. bphws addr,"r" //下硬件访问断点
  8.  
  9. /*接着来处理IAT*/
  10.  
  11. gpa "VirtualProtect","kernel32.dll"//查找特征API,并把查找到的地址放RESULT中
  12. bp $RESULT //对找到的地址处,下F2断点,也就是BP
  13. run//运行
  14. bc $RESULT //取消断点
  15. rtu//ALT+F9返回
  16.  
  17. /*返回后,找特征加密语句,处理IAT的加密*/
  18.  
  19. find eip,#8901#//查找特征加密语句
  20. bp $RESULT //对返回的地址处F2下断
  21. run//运行到该处
  22. bc $RESULT //取消断点
  23. repl eip, #8901#, #9090#, 10 //把加密语句NOP掉,即替换为9090
  24.  
  25. /*下面就去OEP了*/
  26.  
  27. run//由于刚才已经下好了硬件断点,现在只要运行即可
  28. bphwc addr //取消断点
  29. sto
  30. sto//单步走2次
  31. sti//F7跟进,就来到了OEP了
  32. cmt eip,"这里就是OEP!"//在EIP处,也就是现在OD停留了位置加注释
  33. ret//结束脚本
  1. var GetModuleHandleA
  2. var VirtualAlloc
  3. var CreateThread
  4. var OEP //定义4个变量
  5.  
  6. MSGYN "请取消所以的断点,忽略所有异常,并添加C000001D..C000001E到异常中!"//提示运行脚本前的一些信息
  7. cmp $RESULT, 0//比较是否点"否"或"取消"
  8. je end//如果点"否"或"取消",就来到end处
  9.  
  10. /*做些准备工作,找到所要下的各函数的地址*/
  11.  
  12. gpa "GetModuleHandleA", "kernel32.dll"//找特征API函数GetModuleHandleA
  13. mov GetModuleHandleA, $RESULT //把找到的地址放变量GetModuleHandleA中
  14. add GetModuleHandleA,5//GetModuleHandleA=GetModuleHandleA+5
  15. gpa "VirtualAlloc", "kernel32.dll"//找特征APIVirtualAlloc
  16. mov VirtualAlloc, $RESULT //把找到的地址放变量VtrtualAlloc中
  17. gpa "CreateThread", "kernel32.dll"//找特征APICreateThread
  18. mov CreateThread, $RESULT //把找到的地址放变量CreateThread中
  19.  
  20. /*下断点GetModuleHandleA+5,找合适的时机返回*/
  21.  
  22. bphws GetModuleHandleA, "x" //在GetModuleHandleA+5处,下硬件执行断点
  23.  
  24. label1: //标签label1
  25. esto//SHIFT+F9
  26. cmp eax,VirtualAlloc//比较EAX的值是否为VirtualAlloc
  27. jne label1//不是的话,来到标签label1,继续SHIFT+F9
  28. esto//再SHIFT+F9,来到最佳的返回时机
  29. bphwc GetModuleHandleA//取消此硬件断点
  30. rtu //ALT+F9返回
  31.  
  32. /*找magic jump,并修改*/
  33.  
  34. find eip, #0F84????????#//查找magic jump的特征码,"?"为通配符
  35. bp $RESULT//找到的地址处下断
  36. esto//SHIFT+F9
  37. bc $RESULT//取消断点
  38. repl eip, #0F84????????#, #90E9????????#, 10//修改magic jump,即改为"90E9"。由于字节数不同,故NOP填充
  39.  
  40. /*寻找OEP*/
  41.  
  42. bp CreateThread //下断点bp CreateThread
  43. run //运行
  44. bc CreateThread //取消断点
  45. rtu //ALT+F9返回
  46. rtr //执行到返回,相当与CTRL+F9
  47. sti //F7
  48.  
  49. /*例子中的特征代码:
  50. 00B4F6F32BCAsub ecx,edx
  51. 00B4F6F5FFD1call ecx
  52. 00B4F6F7EB 20 jmp short 00B4F719
  53. */
  54.  
  55. find eip, #2B??FF??8?#//找特征代码
  56. mov OEP, $RESULT//把返回的值放变量OEP中
  57. add OEP, 2//OEP=OEP+2,很明显找到地址的后2个字节就是
  58. bp OEP//下断点
  59. run //运行
  60. bc OEP//取消断点
  61. sti //F7进去,就是OEP了
  62. cmt eip,"这里就是OEP!" //在EIP处,也就是现在OD停留了位置加注释
  63. ret //结束脚本
  64.  
  65. end:
  66. msg "您取消了脚本的运行!"//提示没有运行脚本
  67. 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. pl/sql Developer连接oracle远程数据库

    1.下载地址:PLSQL Developer 12.1正式版64位(含中文语言包.注册码).rar   https://download.csdn.net/download/bokewangyu/11 ...

  2. HTML 行内-块级-行块级

    行内元素 相邻元素可以在一行显示直到一行排不下才进行换行. 不可设置宽高.对齐等属性,宽度随内容变化. padding和margin的设置中,水平方向(padding-left...)有效果,垂直方向 ...

  3. IDEA + tomcat 远程调试(JPDA)

    一.修改 tomcat 配置,启动远程调试 Linux(bin\catalina.sh) # 将 localhost 改为 0.0.0.0 if [ -z "$JPDA_ADDRESS&qu ...

  4. 关于jenkins

    启动不了时可更改端口 java -jar jenkins.war –httpPort=8090

  5. react数据渲染

    现在需要在页面上显示一本书的章节,章节内容存放到一个数组里面: const lessons = [ { title: 'Lesson 1: title', description: 'Lesson 1 ...

  6. quartz 定时器时间表达式

    按顺序依次为 秒(~) 分钟(~) 小时(~) 天(月)(~,但是你需要考虑你月的天数) 月(~) 天(星期)(~ =SUN 或 SUN,MON,TUE,WED,THU,FRI,SAT) .年份(-) ...

  7. 2.基于AOP自定义注解Annotation的实现

    上一篇中分析了AOP的实现原理, 总结为: 判断对象是否需要被代理?@Aspect注解的实现是根据切入点表达式 代理之后需要做什么,就是那些通知,本质上是实现了MethodInterceptor的拦截 ...

  8. Mac OS为UltraEdit在Terminal中添加快捷使用命令

    一,什么是UltraEdit 我觉得是个程序员,撸代码的都知道UrlEdit是什么.我们在会使用Linux,在Linux中有个很出名的编辑器gedit,使得我们在终端中输入gedit xxx.便可进入 ...

  9. shift and add算法相关

    1.超分辨率 非均匀插值 Farsiu S, Robinson D, Milanfar P. Robust shift and add approach to superresolution[J]. ...

  10. 连接局域网mysql数据库

    1.先确认mysql服务端端口在防火墙是否开放外网连接(添加): windows防火墙 >高级设置 >入站规则 >新建规则 >选择端口 >添加端口 >后面直接下一步 ...