• 逆向实战第一讲,寻找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看看插件是否加载

    正常加载没有问题

  • 相关阅读:
    冒泡排序
    pdo 单例类
    php 事物处理
    支付宝支付
    反向代理和负载均衡
    execl导出
    网络层
    OSI 7层 TCP/IP 4层 综合5层
    面试总结
    CMD AMD
  • 原文地址:https://www.cnblogs.com/iBinary/p/7848437.html
Copyright © 2020-2023  润新知