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

    对话框:

    对话框从类型上分为两类:modal 对话框和 modeless 对话框,就是模态对话框和非模态对话框,也有叫成模式和非模式

    模态对话框不允许用户在不同窗口间进行切换,非模态对话框允许用户在不同窗口间进行切换

    两者形成区别的原理是模态对话框由 windows 为它内建一个消息循环,而非模态对话框的消息则是通过用户程序中的消息循环派送的

    创建模态对话框是由调用 DialogBoxParam 函数实现的,而创建非模态对话框是调用 CreatDialogParam 函数实现

    程序:

    点击 SETUP.EXE 进行安装

    按默认步骤安装

    这是主界面

    点击 File -> Register 是进行注册的地方

    关闭程序

    它会弹出该对话框,该对话框是模态对话框

    如果直接按退出会显示该帮助文档

    只有点击 I Will Register Soon 才会退出程序

    用 eXeScope 载入程序

    选择 资源 -> 对话框 -> 103,是程序要退出时候的对话框

    103 为 MFC 下的 lpTemplateName 对话框模板

    逆向:

    用 OD 载入程序

    右键 -> 查找 -> 所有命令

    查找 push 0x67,67 为 103 的十六进制

    调用模态对话框 DialogBoxParam 的时候会将它的参数入栈,103 也是它的第一个参数

    双击,来到它的位置

    在该代码块开头下一个断点

    跑一下程序

    点击退出程序之后,没有弹出对话框,直接停在该断点处

    如果函数 A 调用函数 B 的话,函数 A 会被 push 入栈,当函数 B 执行完之后返回到函数 A 的时候,函数 A 会被 pop 出栈

    看一下栈窗口

    返回到 004023C0 来自 00401220

    右键 -> 反汇编窗口中跟随

    来到了该地址

    上面那个 call 就是调用刚才那个过程

    上面有个 jnz 跳转指令,如果 eax 是一个非零值,它就会进行跳转,跳转就能跳过那个 call 指令

    在 test 指令上面的 call 指令处下一个断点

    重新跑一下程序

    点击关闭程序的按钮之后停在该断点处

    按 F7 步入

    只有几条指令之后就执行 retn,没有条件跳转,可能程序一运行就直接在这里检查是否注册

    在该过程开头下一个断点

    重新跑一下程序

    一打开程序,就停在该断点处,说明这个过程就是检查是否注册

    如果该过程返回非零值就会跳过程序最后的那个对话框

    接下来修改指令

    如果修改将上面这条指令改为 mov eax, 0x1 的话,会覆盖掉后面的那条指令

    所以把这两条对 eax 的值有影响的指令做修改,改为 mov eax, 0x1

    选择这两行指令,右键 -> 汇编,进行修改

     改完之后保存程序,运行

    Register 按钮已经不能点击了,退出程序的时候也没有对话框了

  • 相关阅读:
    C#关键字operator
    .NET中各种相等
    Delphi开发能力自我评测
    Delphi7程序调用C#写的DLL解决办法
    两种类的声明方法
    delphi中 formclose的事件 action:=cafree form:=nil分别是什么意思?
    Delphi的对象注销方法Destroy和free的区别
    Delphi过程函数传递参数的几种方式
    Delphi语句、过程函数
    Delphi用Sender参数实现代码重用
  • 原文地址:https://www.cnblogs.com/sch01ar/p/9747330.html
Copyright © 2011-2022 走看看