博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
OD 实验(十六) - 从对话框入手对程序的逆向
阅读量:2259 次
发布时间:2019-05-09

本文共 1212 字,大约阅读时间需要 4 分钟。

对话框:

对话框从类型上分为两类: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 按钮已经不能点击了,退出程序的时候也没有对话框了

转载于:https://www.cnblogs.com/sch01ar/p/9747330.html

你可能感兴趣的文章
深入理解 Defer 函数
查看>>
使用 Panic、Defer 和 Recover 处理 Go 错误
查看>>
Golang 入门笔记 - Channel
查看>>
Golang 时间操作大全
查看>>
Go 基础之 Goroutine
查看>>
快报:正式提案将泛型特性加入 Go 语言
查看>>
不要使用 Go 默认的 HTTP 客户端(在生产环境中)
查看>>
Go语言爱好者周刊:第 78 期 — 这道关于 goroutine 的题
查看>>
5 分钟内学习 Go 语言?
查看>>
Go 语言常见的坑
查看>>
Linux命令 -- lsof
查看>>
Linux信号(一)-- 信号的基本概念
查看>>
Linux信号(二)-- signal()函数
查看>>
setjmp()和longjmp()函数详解
查看>>
System V信号量-semget()、semop()和semctl()
查看>>
进程间通信--管道
查看>>
变量和常量--就要学习Go系列
查看>>
条件语句和循环语句--就要学习Go系列
查看>>
彻底学会Go指针--就要学习Go语言
查看>>
聊聊Go工作空间
查看>>