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 按钮已经不能点击了,退出程序的时候也没有对话框了

猜你喜欢

转载自www.cnblogs.com/sch01ar/p/9747330.html