zoukankan      html  css  js  c++  java
  • OD 实验(十一)

    程序:

    点击安装程序

    这是一个拼图程序

    点击 Options -> Flash Sizes

    程序会提示是未注册版本

    点击一些选项的时候会提示该程序只给注册的用户

    点击 Register

    随便输入一个密码,然后点击 OK

    密码错误

    用 PEiD 看一下该程序使用的是什么编译器

    Microsoft Visual C++ 7.0

    逆向:

    用 OD 打开程序

    首先先查找一下关键字

    右键 -> 查找 -> 所有参考文本字串

    拉到最顶端,右键 -> 查找文本

    双击跟进该字符串所在的地方

    这里有个 je 跳转指令,如果跳转实现的话就会显示 unregistered

    那就让 je 不实现跳转

    那 je 跳转指令改为 nop

    保存程序

    运行程序

    点击 Options -> Flash Sizes,没有再显示 unregistered

    但是点击其它选项还是会弹出提示框

    继续看一下程序

    je 跳转指令上的 mov 指令把 esp+0x4 处的值赋给 al

    在 mov 指令处下一个断点,重新跑一下程序

    esp+0x4 的地址为 0012E19C,值为 0,所以 al 的值也为 0

    上图所示,mov 指令本地调用来自 004047D3 和 00404880,跟上去看看

    右键

    先跟 004047D3

    下一个断点

    按 Enter 键回到 mov 指令处

    接下来跟 00404880

    在此处也下一个断点

    重新载入程序跑一下

    程序先停在该处

    可以把 00404880 的断点删除

    按 Alt+B 查看断点,按 Delete 进行删除

    因为 004047D3 处的 call 指令先对 mov 指令进行操作

    上面有个 push 指令

    push 指令把 eax 推入栈中

    而 0012E19C 决定了 al 的值

    所以此处的 eax 决定 0012E19C,0012E19C 决定 al

    而 eax 的值取决于它上面的那条 call 指令

    因为函数的返回值存放在 eax 中

    在此处的 call 指令处下一个断点

    重新跑一下程序

    按 F7 步入该 call 指令,看看该 call 指令任何返回 eax 的值

    按 F8 往下走

    这里有个循环,每执行一次循环

    EAX 上的 ASCII 值就会少一个字符

    当字符全减完之后,它就会往下走

    此时寄存器 eax 的值为 9

    因为 <No Pass> 为 9 个字符

    cmp 指令把密码位数和 4 进行比较

    如果密码位数大于 4 的话,将执行 jnb 跳转

    如果密码位数小于 4 的话,执行 xor 指令,把 al 的值变为 0

    先跟着 jnb 跳转看看情况

    这里有个 call 指令,它有 3 个参数,分别是 push 的那三个参数

    步过 call 指令继续往下走

    test 指令比较 eax 的值,如果 eax 的值不为 0 的话,将执行 jnz 跳转;如果 eax 的值为 0 的话,将不执行 jnz 跳转

    跳转将跳到 xor 指令处

    xor 指令将 al 清 0,pop 将 esi 出栈,然后返回,al 部分为 0,程序还是会提示注册不成功

    所以改一下 xor 指令就好了

    保存文件,运行一下

    被限制的功能都能用了

  • 相关阅读:
    linux常用命令
    linux下redis配置
    Git使用命令
    linux学习笔记
    NOPI读取Excel2003、Excel2007或更高级的兼容性问题
    netcore开发常用命令
    netcore3.0 dotnet ef执行报错
    vscode配置nuget常见问题
    PDMReader结合PowerDesigner导出word格式数据字典
    微信网页授权开发遇到问题
  • 原文地址:https://www.cnblogs.com/sch01ar/p/9668403.html
Copyright © 2011-2022 走看看