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