OD 实验 - 去除 NAG 窗口的几种方法

Posted sch01ar

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OD 实验 - 去除 NAG 窗口的几种方法相关的知识,希望对你有一定的参考价值。

程序:

运行

技术分享图片

弹出一个窗口,说要注册

点击确定,到主窗口

技术分享图片

关闭主窗口

技术分享图片

然后弹出提醒注册的对话框

逆向程序

用 OD 打开程序

技术分享图片

GetModuleHandleA 获取程序模块的句柄,程序在内存中的基址

内存中的一个模块代表一个可执行文件进程所需要的所有代码、数据、资源的集合

GetModuleHandleA 获取到的值放在 EAX 寄存器中

接下来的

mov dword ptr ds:[0x40311C],eax

把 EAX 的值赋给地址为 0x40311C 上

技术分享图片

即把 00400000 放到地址 0x40311C 上

接下来,cmp 指令比较 eax 和 0 的关系

技术分享图片

如果 eax 等于 0 的话,je 将跳过第一个 NAG弹窗

eax 为 0 的话,GetModuleHandleA 的返回值就为 0,GetModuleHandleA 就是没有句柄

可以把 je 改为 jmp 实现无条件跳转

技术分享图片

第一个窗口也可以用 nop 填充来跳过第一个 NAG 窗口

技术分享图片

选定区域

右键 -> 二进制 -> 用 NOP 填充

技术分享图片

一个 NOP 相当于一个字节

还有一种方法

技术分享图片

MessageBoxA 函数的第一个参数为 hOwner

hOwner 为该消息框的父窗口句柄,如果此参数为 NULL,则该消息框没有拥有父窗口

把 push 0x0 改为 push 0x1

技术分享图片

1 不可能是一个句柄的值,所以这是一个不存在的句柄,则这个 MessageBoxA 也是不存在的

也可以通过修改 PE 文件头来去除 NAG 窗口

技术分享图片

程序从地址 00401000 处开始

GetModuleHandleA 获取到的基地址为 00400000

技术分享图片

所以地址 00400000 到地址 00401000 存放程序的文件头

可以通过修改程序的初始地址来跳过 NAG 窗口

技术分享图片

点击 m,快捷键为 Alt+M,进入显示内存的窗口

技术分享图片

00400000 开始为 PE 文件头,大小为 00001000

00401000 开始为代码块,00402000 开始为数据块

双击 PE 文件头这行,查看文件头的内容

技术分享图片

第一列为地址,第二列为在内存中的指令形式,第三列为方便阅读的指令形式

例如第二行的 9000,是低地址 09 放前面,高地址 00 放后面

内存中的存放形式与现实中的读数是倒过来的

技术分享图片

这个地方是 PE 结构的开始,是双字类型

C0 为指向 PE 头的偏移地址,相对于基地址偏移,即为 00400000 的偏移,地址为 004000C0

看一下地址为 004000C0 的地方

技术分享图片

这个就是 PE 头,以 PE 的 ASCII 码开头

技术分享图片

这个地方是程序的入口地址,这里的值为 0x1000,地址即为 00401000

把入口地址修改为 MessageBoxA 之后

技术分享图片

地址为 00401024

技术分享图片

在这里按 Ctrl+G 跟随表达式

技术分享图片

输入设置程序入口地址的地址

技术分享图片

接下来修改数值

技术分享图片

把这个修改为 24,即为 1024

接下来保存文件

右键 -> 复制到可执行文件

技术分享图片

右键 -> 备份 -> 保存数据到文件

运行一下保存的程序

技术分享图片

没有弹第一个 NAG 窗口,而是直接进入主窗口

关闭主窗口,将弹出第二个 NAG 窗口

技术分享图片

 

以上是关于OD 实验 - 去除 NAG 窗口的几种方法的主要内容,如果未能解决你的问题,请参考以下文章

OD 实验(十五) - 对一个程序的逆向

OD 实验 - 对一个程序的逆向

VB程序去nag

关于iOS去除数组中重复数据的几种方法

List 去除重复数据的几种方法

去除inline-block间隙的几种方法