
OD调试4--去除NAG窗口
nag本意是烦人的意思,nag窗口是软件设计者用来时不时提醒用户购买正版的警告窗口。软件设计者可能认为当用户忍受不了试用版中的这些烦人的窗口时,就会考虑购买正式版本。
一般nag在程序启动或退出的时候弹出来,或者在程序运行的某个时刻突然蹦出来吓你一跳。
今天的任务是用不同的几种方法来去除烦人的NAG窗口。一般情况下,一个注册后的软件,他是不会弹出NAG窗口的。所以,一般在程序启动的时候,他会有一段代码检查改程序是否已经被注册,我们可以先把这个程序的注册破解掉,NAG窗口即会自动消失。
- 试验软件:RegisterMe.exe
- 把程序跑一遍之后我们发现程序有两个NAG,一个是在程序界面启动前出现,另一个是在程序关闭后出现的。如下图
→
→
→
所有函数/过程调用之后的返回值都存放在EAX里
1字=2字节(1 word = 2 byte) 1字节=8位(1 byte =8 bit)
打开OD载入该文件,跳过第一个提示框的4种方法:
(1)je处汇编为jmp,如下
(2)选中-鼠标右键-二进制-用nop填充
(3)将push 0改为push 1(因为1是一个不存在的句柄,从而导致下面的messagebox也不存在。也就是句柄无意义,子进程就消失)
(4)修改程序入口点
点击M进入内存分布图—找到PE文件头—双击进入—找到AddressOfEntryPoint—对应内存中的地址为4000E8—回到cpu中—在数据模块中ctrl+g填入4000E8,将其本来的入口点值1000修改为1024.
回到cpu窗口中,再数据部分Ctrl+G跟随地址00400E8,如下图
对此处进行修改,00改为24.这样,程序的入口位置就由1000变为1024,就跳过了第一个NAG弹出窗口messagebox。
再处理之后的另一个NAG弹出窗口,可以使用nop汇编掉,也可以将push 0改为push 1进行修改。
PE结构:
为什么需要了解PE结构?
大家想象一下,某天在班上,我突然想知道小花同学今天穿什么颜色的裤子,要怎么办呢?点名让小花同学站起来?不行,因为老师在上课呢。那我就只好掏出班级里的座位名单,然后找到小花的名字,看是在第几行第几列就找到了,然后在看她的裤子是什么颜色,对啵?其实如果把PE结构比作我们刚才提到的班级,那么座位名单就是PE文件头啦~
- PE(PortableExecutable)可执行文件结构是一样规范,发明这个主要用来指导系统如何执行你所设计的程序。
- 编译器已经为你将代码按照PE结构的形式编译链接为可执行文件,这过程只是它默默的完成,所以我们没有察觉。但是我们现在学习的是逆向,所以连一条毛我们都不能放过。
- PE文件结构有一个非常优势的地方就是它在硬盘上的存储结构跟载入内存时候的存储结构是一样的。
- 所以,只要你了解如何在PE文件结构里边找出某样你想要的东西,那么当这个文件映射到内存后,你也可以很容易的找到它(因为OD是动态调试,程序需要先载入内存嘛)。
- 内存中的一个模块代表一个可执行文件进程所需要的所有代码、数据、资源的集合。
- PE文件结构:
- DOS header
- DOS stub
- PE File Header
- Image Optional Header
- Section Table
- Data Directories
- Sections
- 本质上,最下边的节区(有些人也叫区块)是运行一个程序真正需要的内容。
- 上边所有的“头”都仅仅是帮助Windows加载器定位和寻找下边的节区的内容。
- 在PE文件头中,这节课我们需要知道的是如何找到AddressOfEntryPoint(程序入口地址)即可。
小结:
- GetModuleHandleA这个API函数用于获取程序的ImageBase(基址)
- 这个程序的MessageBox的OwnerHandle(父窗口句柄)为0(NULL),我们可以将这个值改为一个不存在的值,例如1,这样它就找不到,就不会被显示出来。
- 名词注释:
– VA(VirtualAddress,虚拟地址)
– RVA(RelativeVirtualAddress,相对虚拟地址)
– EP(EntryPoint,程序入口点)