• OD 实验(十三)


    程序:

    运行程序

    点击 Start,它就会进行对系统的扫描

    点击 About -> Enter Registration Code

    随便输入一下内容,点击 OK,会弹出该弹窗

    用 PEiD 看一下

    该程序是用 Microsoft Visual C++ 6.0 写的

    逆向:

     用 OD 载入程序

    右键 -> 查找 -> 所有模块间的调用

    键盘直接敲 getwindowtext

    找到几个 GetWindowTextA,A 为 ASCII 码,W 为 Unicode

    右键 -> 在每个调用到 GetWindowTextA 上设置断点

    程序调用到 GetWindowTextA 的地方都会被下断点

    一共下了 3 个断点

    另一个方法:

    按 Ctrl+N

    也是键盘直接敲 getwindowtext

    右键 -> 在每个参考上设置断点

    设置完断点之后跑一下程序

    OD 停在该断点处,此时程序的界面都还没出来,这不是我们想要的 GetWindowTextA

    把该断点去掉,按 F9 继续运行程序

    又停在了 GetWindowTextA 处,此时什么都还没输入,所以这个也不是我们要的 GetWindowTextA

    把断点去掉,按 F9 继续往下跑

    界面出来了,按 About,输入注册码

    点击 OK

    程序停在了这个 GetWindowTextA 处

    看一下栈的窗口

    这三个为 GetWindowTextA 函数的三个参数

    GetWindowTextA 的三个参数:

    hWnd 为指向包含文本的窗口或控件的句柄

    lpString 为指定将接收文本的缓冲区的指针。如果字符串和缓冲区一样长或更长,则该字符串将被截断,并以一个空字符结尾

    nMaxCount 为指定拷贝到缓冲区内的字符的最大数目,其中包含空字符。如果文本超过这个限制,则它会被截断

    hWnd 是获取 Edit 控件,父句柄为 000C05CE,,Buffer 的 值 00C04770 就是字符串存放的地址,这里 nMaxCount 的值为 4

    按 F8 往下走

    走到这里,EAX 的值为 4,因为刚才输入的 test 为 4 个字节

    接下来的 je 跳转指令是对该字符串是否为空进行判断

    之后的那条 je 跳转是判断输入的注册码是否为空

    F8 继续往下走

    这里有个跳转,如果 al 不等于 0 的话将会进行跳转

    跳到该处,之后就是提示成功

    此时的 al 为 0,不能直接跳转

    影响 al 的值可能是上面这条 call 指令

    可能在这个 call 中进行验证

    下面还有一个一模一样的三条指令,可能是双重验证

    F7 步入该 call 指令

    看一下该函数的所有返回指令

    这条 retn 指令之前有个 mov 指令,把 1 赋给 al,就是让 al 不等于 0

    第二个 retn 指令之前有个 xor 指令,把 al 清零,也就是让 al 等于 0

    所以我们要在第一个 retn 指令处返回

    按 F8 往下走

     

    这里有个已实现的跳转

    如果跳转的话,就跳过了那个成功的 retn,之后就是失败的那个 retn

    所以不能让它跳转

    修改 SF 让其不跳转

    继续 F8 往下

    又有一个已实现的跳转

    如果执行跳转的话,将刚好跳过成功的 retn

    所以也不能跳,将 ZF 置 1

    继续往下

    这个 jnz 跳转也是跳到相同的位置,将 ZF 置 1,不跳转

    继续往下走

    第三个 jnz 跟前面两个一样,ZF 置 1 不跳转

    继续往下

     之后还有一个 jnz 跳转指令,跟上面三个情况一样,ZF 置 1,不进行跳转

    继续往下走

    之后就是成功的 retn 的语句了

    出来之后,al 的值就为 1 了

    跳转已实现,将进行跳转

    跳转到成功之前的位置

    进行跳转,往下走

    提示注册成功

    点击“确定”

    但是这里却显示许可证没有被注册

    回到 OD,右键 -> 查找 -> 所有参考字符串

    找到该字符串

    双击来到它所在的地方

    该处是由上面那个 je 跳转指令进行跳转的,而 je 是否跳转取决于上面那个 al 的值,而 al 的值是它上面那个 call 语句决定的

    在 call 处下一个断点,然后跑一下程序

    点击程序的 About,程序会停在该断点处

    F7 步入该函数

    先看一下 retn

    该函数只有一个 retn 返回

    按 F8 往下走

    这里将输入的注册码入栈,此时的 al 为 0,jnz 也就不进行跳转,会继续往下走,执行后面的 xor bl, bl 语句将 bl 清零

    如果执行跳转的话,bl 的值就为 1

    最终 al 的值取决于 bl 的值,所以要让 bl 的值为 0,也就是让上面那个 jnz 执行跳转

    也可以直接将 mov al, bl 进行修改,确保 al 的值为非零

  • 相关阅读:
    DataTables中自增序号的实现
    MVC中调用模态框之后导致JS失效
    teamviewer13破解版
    屏幕录制专家破解版
    Navicat Premium 12 (内含破解补丁)
    Navicat新建连接出现10060 "Unknown error" 错误
    Windows添加永久路由
    VMware虚拟机下Linux网络配置——桥接模式
    文件基本属性
    ifconfig: command not found
  • 原文地址:https://www.cnblogs.com/sch01ar/p/9738915.html
Copyright © 2020-2023  润新知