逆向实战第一讲,寻找OllyDbg调试工具的Bug并修复

           逆向实战第一讲,寻找OllyDbg调试工具的Bug并修复

首先我们要知道这个OD的Bug是什么. 我们调试一个UNICODE的窗口,看下其窗口过程.

一丶查看OllyDbg 的Bug

1.1spy++查看窗口,确定是一个Unicode窗口

2.使用Olly附加

使用Od附加之后,点击窗口,发现获取的值是错误的.所以判断Od的Bug是针对Unicode窗口,调用了Asi版本的API

3.解决思路

此时我们解决的时候,要Od调Od了. 而出现这个Bug的原因可能是API调用失败,我们发现,它在调用获得类的回调的时候出现错误

所以可以快速定位这个API

GetClassLongA

GetClassLongW

4.定位此位置发先是否是调用错误

此时我们Od调OD,然后定位此API下断点,看看是否调用错误

发先确实是调用A版本的.所以出现错误.

二丶解决OD Bug的两种方式

1.1 API HOOK的方式

首先我们执行到返回,在次API上面我们下HOOK 钩子,跳转到我们的代码执行,然后判断其是否是Unicode窗口还是 Asi窗口,根据不同我们调用不同的函数返回即可.

此方法虽然可以解决但是有点麻烦.所以不采用

1.2 Dll劫持的方式

这个方法可以有效的劫持DLL,然后执行我们的代码

我们可以劫持一下这个DLL

首先我们找到我们的劫持工具

选择它的DLL,然后选择转发函数,而后会生成一个CPP,此时我们只需要写一个DLL,这个DLL的CPP就是这个,和原DLL名字一样

原DLL名字改为  DBGHELPOrg即可.

在代码里面写入我们的代码

1.首先在我们的转发里面定义函数

里面写上我们的代码

2. 在程序加载的时候,启动我们的代码

这里的启动会在load里面启动,所以在load里面写代码就可以了.

思路:

  

思路:
定位Call调用GetClasslongA的地方,跟进去之后会看到转发的IAT表,把里面的内容改为我们的就可以了.

我们刚才已经定位到了调用GetClassLongA的地方,那么此时我们 F7 进去可以看到转发

我们可以看到IAT表格的位置是 0050D858 ,那么把里面的地址改为我们的地址就可以了

步骤:

  1.定义一个指针指向IAT表格

  2.修改内存保护属性

  3.把IAT表格里面的内容变成我们的函数地址

  4.还原内存保护属性.

主要是中间一不,修改IAT表中的地址为我们的地址

现在我们试一试看看是否成功

成功获取.

 

2.插件修改

对于上面来说有点基础的,细心的应该可以明白,做了这一切其实简单的就是

1. 寻找API位置

2. 跳转的地方下改为我们的函数地址

3.我们的函数地址判断执行.

但是上面说起来还是比较麻烦,我们自己写一个OllyDbg的插件解决这个Bug吧.

首先使我们的插件,

开发插件所必须有的2个导出函数

ODBG_Plugindata    这个函数里面是给插件名称的所以我们需要

ODBG_Plugininit       这个函数是Od启动的时候调用的.(初始化数据)

当然肯定会有释放的,这里不写了.

写插件第一步

  建立一个DLL 工程,添加插件自带的头文件

第二步,实现插件的接口

  

第三步,拷贝我们以前的代码让插件初始化的时候去工作

 

 

遇到的问题:

  

如果提示这个问题,那么编译选项中,链接的时候假如这个 /j即可.

 

 启动OD看看插件是否加载

正常加载没有问题

posted @ 2017-11-17 02:22  iBinary  阅读(2634)  评论(3编辑  收藏  举报