用VB6.1开发OD插件 - OD之父协助OD逆向调试
本帖最后由 yiwai2012 于 2013-10-23 10:59 编辑注明转自梦工厂(附件内含图文说明)
一个跟踪记录OD反汇编代码的跳转指令,也就是“跳转已实现”和“跳转未实现” 的情况全部记录下来,
第一次【软件登陆用错误的账号和密码登陆】按住F7在OD上单步步入跟踪(在线程序领空按住F7即可,遇到系统API等系统CALL就按F8跳过此类CALL)。
第二次【运用正确的账号和密码登陆】也是按住F7在OD上单步步入跟踪(在线程序领空按住F7即可,遇到系统API等系统CALL就按F8跳过此类CALL)。
这2次所记录的跳转 做一个对比,就可以发现 关键的代码跳转,并且非常的精确,同时这个方法也可以分析一些youxi的BT跳转,比如chuangqiang ,在遇到障碍物的时候和没遇到障碍物的时候全部按住F7单步走一边,插件都可以通过2次单步走时候所记录的跳转情况 分析出 关键的跳转。
以上界面中的寄存器值和OD上的寄存器 同步,已挂钩OD。
--------------------若平时对16进制看不习惯,喜欢看10进制,以上插件这2中进制全部显示。
反汇编无疑是一片茫茫大海,无数的数据在这片大海中,高速的穿行,本插件将数据穿行过的代码轨迹全部记录下来,提供给调试者。方便测试和跟踪。
做插件也始终在想一个问题,人脑的传统的OD调试分析思路 假设交给 这个插件来完成的话,那我们就轻松多了,智能多了,也就是我们认为需要分析的功能插件能尽量自动分析提示我们,做到傻瓜化的OD,但是对于反汇编这种东西虽然有规律可循,但是需要联系全文(就像英语考试中的阅读理解),不过反汇编需要付出更多的时间和精力去分析,把这些分析工作交给插件自动完成,是否可行。比如说我现在 要找 一个gongjicall 内部的实现原理,是否能自动还原出他的C语言原型 和 调试的时候自动提示 变量地址的来源、偏移各种类型的数值。对于跳转的那个的地方,判断的时候一个啥变量,有啥作用的,是否能提示等 。
传统内存分析(基本框架完成了)
只要OD单步走,OD里面的寄存器就会被监视出来,并且读取寄存器上的地址5种数据类型全部显示,如果是代码地址则显示英文表示可读可执行,到时候再显示代码地址的模块名和偏移。,如果不是内存地址则显示常数。
堆栈内存分析(有待添加,堆栈就是读取ESP+偏移即可)
堆栈里面放的东西可多了,有基址、参数、常数。 我们只做跟踪分析,凡是堆栈里面涉及到了 调试者自定义设置的敏感数据以后就 发出 嘟嘟嘟的声音或者颜色高亮显示 来提示调试者已踏入可疑之地。
接下内存属性的判断,识别那些内存,是代码地址还是变量地址,如果是代码地址,还是一个实际的数字并非内存,如果是代码地址一般可以无视,如果是变量内存地址,那么久要打起十二分精神了,如果实际数更加要打起十二分精神了。
内存属性无法就是: 读、写、执行这3个基本功能的标签,凡是存放反汇编代码字节可执行的就是代码地址(位于CS代码段),凡是只读的就是常量(位于DS数据段)、凡是读写可写的就是变量(位于DS数据段),这在反汇编中也体现出来高级语言搞入门时候学的变量与常量那一章节的内容。
#define PAGE_NOACCESS 0x01 //禁止一切访问
#define PAGE_READONLY 0x02 //只读属性,就是 常量的内存地址了
#define PAGE_READWRITE 0x04 //只允许读写,就是 变量的内存地址
#define PAGE_WRITECOPY 0x08 //支持读写,不支持执行
#define PAGE_EXECUTE 0x10//只允许执行代码
#define PAGE_EXECUTE_READ 0x20 //只允许执行和读取(一般代码段上的反汇编代码地址全是这个属性)
#define PAGE_EXECUTE_READWRITE 0x40 //允许执行\读取\写入,这种往往是 人为申请的代码。用来做补丁的那种内存
#define PAGE_EXECUTE_WRITECOPY 0x80//对于该地址空间的区域,不管执行什么操作,都不会引发访问违规。如果试图在该页面上的内存中进行写入操作,就会将它自己的私有页面(受页文件的支持)拷贝赋予该进程。比如0x400000
#define PAGE_GUARD 0x100//在页面上写入一个字节时使应用程序收到一个通知(通过一个异常条件)
#define PAGE_NOCACHE 0x200 //停用已提交页面的高速缓存
下面是VB判断内存属性。。。识别内存用的。。
纯文本查看 复制代码
Private Declare Function VirtualProtect Lib "kernel32" (ByRef lpAddress As Any, ByVal dwSize As Long, ByVal flNewProtect As Long, lpflOldProtect As Long) As Long
Private Const PAGE_EXECUTE_READWRITE = &H40 '内存可读取可写
Private Const PAGE_NOACCESS = &H1 '禁止一切访问
Private Const PAGE_READONLY = &H2 '只读属性
Private Const PAGE_READWRITE = &H4 '允许读写
Private Const PAGE_WRITECOPY = &H8 '支持读写,不支持执行
Private Const PAGE_EXECUTE = &H10 '只允许执行代码
Private Const PAGE_EXECUTE_READ = &H20 '允许执行和读取
Private Const PAGE_EXECUTE_WRITECOPY = &H80 '对于该地址空间的区域,不管执行什么操作,都不会引发访问违规。如果试图在该页面上的内存中进行写入操作,就会将它自己的私有页面(受页文件的支持)拷贝赋予该进程。
Private Const PAGE_GUARD = &H100 '在页面上写入一个字节时使应用程序收到一个通知(通过一个异常条件)
Private Const PAGE_NOCACHE = &H200 '停用已提交页面的高速缓存
Private Const PAGE_WRITECOMBINE = &H400 '单个设备多次写入操作合并在一起
Private Sub Command1_Click()
Dim OldProtect As Long
Dim adrr1 As Long
adrr1 = &H400000
VirtualProtect ByVal adrr1, 4, PAGE_EXECUTE_READWRITE, OldProtect '修改内存属性
If OldProtect = -1 Then
MsgBox "是常数"
ElseIf OldProtect = PAGE_READONLY Then
MsgBox "PAGE_READONLY禁止一切访问"
ElseIf OldProtect = PAGE_READWRITE Then
MsgBox "PAGE_READWRITE只允许读和写"
ElseIf OldProtect = PAGE_WRITECOPY Then
MsgBox "PAGE_WRITECOPY--支持读写,不支持执行"
ElseIf OldProtect = PAGE_EXECUTE Then
MsgBox "PAGE_EXECUTE--只允许执行代码"
ElseIf OldProtect = PAGE_EXECUTE_READ Then
MsgBox "PAGE_EXECUTE_READ--只允许执行和读取"
ElseIf OldProtect = PAGE_EXECUTE_WRITECOPY Then
MsgBox "PAGE_EXECUTE_WRITECOPY-对于该地址空间的区域,不管执行什么操作,都不会引发访问违规。如果试图在该页面上的内存中进行写入操作"
ElseIf OldProtect = PAGE_WRITECOMBINE Then
MsgBox "PAGE_WRITECOMBINE单个设备多次写入操作合并在一起"
End If
VirtualProtect ByVal adrr1, 4, OldProtect, OldProtect
End Sub
上个图,在OD原版上测试通过。基本数据监视已经实现完成,其实想做得更加智能化,可以设置敏感数据,凡是检测到敏感数据就报警提示(颜色声音),比如说寄存器里面一旦出现人物的基址 或 人物的属性内存或人物的属性值。这些全是“证据”,为你思考 “证据链”背后的原理动机提供强有力的支持。——眼睛一扫即可一目了然,耳朵一听即可分辨真相。
1、功 能:读取寄存器和堆栈的数值1字节整数、2 字节整数、 4字节整数、4字节浮点、字符串
(除了浮点数、字符串意外,整数全部 分为10进制和16进制两种形式方式并存,让数据显示得更加的明显)
2、开发思路:VB操作汇编字节 直接 获取OD信息
3、开发原因:由于 OD 寄存器里面的数值 全是16进制的,并且有些是内存地址还是常数 会搞不清楚,如果是内存地址,我们也需要“dd内存地址 ” 这样用命令等来读取,并且读取的时候只显示一种数据类型,无法同时显示5种数据类型。如果是五种数据类型同时显示得话,这样一句一句跟踪程序就更加的方便了。数据无法从我们的眼皮底下擦肩而过。敏感的核心数据一旦出现,便会刺激你的眼球,对于理解函数CALL内部的功能起到关键的作用。简单说这个插件就是帮助我们识别敏感数据用的,数据不会被错过,因为有的时候你从寄存器上看到的是一个内存地址,但是这个内存地址里面所保存的数值就是敏感数值,而你这时候恰恰没用 OD的命令行 dd内存地址 去读取,就有可能会错过这个敏感数据,就像cj在立案的时候,证据哪怕缺少一个的话,就导致整条证据链断裂,无法立案,逆向调试也是如此,敏感数据就是证据,所有的敏感数据和代码连接在一起就是证据链,才能协助你更好的理解和分析反汇编-,比如BT功能的分析、对CALL内部的功能分析,总之在单步调试上方便查看数据,不用手动把寄存器或者堆内存地址放到内存区里面一个一个显示,效率太低了。有了这个插件以后让寄存器和堆栈 全自动显示5中数据,清清楚楚,一目了然,敏感数据不再被忽略。
不知道大家有没有感觉到OD简单内存识别功能注重破解软件验证用的,对youxi分析上的内存那块弱的一塌糊涂,没有CE一样的强大内存搜索也就算了,寄存器、堆栈内存数据也没全部同时显示5种数据的功能,这其实也可以理解因为 软件验证破解分析用到的数据类型很少OD只考虑了它用目前的OD却是可以应付了,而youxi功能用到数据类型却是5种数据类型综合在一起的,用OD目前功能需要手动读取寄存器的内存太麻烦,可见OD不注重youxi进程的分析。
--------------------------------------------------------------------------------
在做挂钩的时候 发现一个问题。DLL 模式去访问OD,内存容易报错。最后还是决定用EXE。现在主要的问题是获取OD寄存器值,有的时候行,有的时候却不行。。。问题解决中,思路已经有了,需要些一段判断语句的汇编,因为是VB有自带的优化代码,在底层不纯净,所以用汇编字节写挂钩OD,即 VBshellcode. EXE模式去访问OD的内存,这样不会报错,并且稳定。
甚至还可以分析OD的反汇编代码。
在做OD寄存器挂钩的时候,发现OD是遍历程序的所有线程,获取所有线程的寄存器数值,但是最终只显示当先线程的寄存器数值,所以之前直接挂钩导致了很多错误,其实还需要一个判断即可。即判断线程句柄。这个在OD的汇编中自带有这个语句,直接抄袭他的写法了。
OD中8个寄存器的获取
mov ebx,909090
mov ecx, 'EAX
mov , ecx
mov ecx, 'ebx
mov , ecx
mov ecx, 'ecx
mov , ecx
mov ecx, 'edx
mov , ecx
mov ecx, '
mov , ecx
mov ecx,
mov , ecx
mov ecx,
mov , ecx
mov ecx,
mov , ecx
下载地址http://pan.baidu.com/share/link?shareid=569433626&uk=235528203
怎么没人顶呢。。。 厉害!{:1_927:}
kan kan
建议楼主上图 {:17_1089:}
. 嘿嘿,正是我想要的!!... 这么神奇 看看大牛发的是什么?
支持作者!
不懂帮顶 大神..