nag本意是烦人的意思,nag窗口是软件设计者用来时不时提醒用户购买正版的警告窗口。
软件设计者可能认为当用户忍受不了试用版中的这些烦人的窗口时,就会考虑购买正式版本。
PE文件结构
为什么需要了解PE文件结构?
大家想象一下,某天在班上,小甲鱼突然想知道黑夜童鞋今天穿什么颜色的裤子,要怎么办呢?点名让黑夜童鞋站起来?不行,因为苍老师在上课呢。那小甲鱼就只好掏出班级里的座位名单,然后找到黑夜的名字,看是在第几行第几列就找到了,然后在看他的裤子是什么颜色,对啵?
其实如果把PE结构比作我们刚才提到的班级,那么座位名单就是PE文件头啦~
PE(PortableExecutable)可执行文件结构是一样规范,发明这个主要用来指导系统如何执行你所设计的程序。
可能有鱼油会说我TM不用十分钟可以写个小马,怎么不见得需要用到这个PE文件结构?
其实不然,因为编译器已经为你将代码按照PE结构的形式编译链接为可执行文件,这过程只是它默默的完成,所以我们没有察觉。
但是我们现在学习的是逆向,所以连一条毛我们都不能放过。
PE文件结构有一个非常优势的地方就是它在硬盘上的存储结构跟载入内存时候的存储结构是一样的。
所以,只要你了解如何在PE文件结构里边找出某样你想要的东西,那么当这个文件映射到内存后,你也可以很容易的找到它(因为OD是动态调试,程序需要先载入内存嘛)。
内存中的一个模块代表一个可执行文件进程所需要的所有代码、数据、资源的集合。
PE文件结构:
DOSheader
DOSstub
PEFile Header
ImageOptional Header
SectionTable
DataDirectories
Sections
PE文件结构
这个社会太复杂了,许多东西都蒙蔽了我们的双眼,而真相有时候确是如此简单╭(╯3╰)╮。
本质上,最下边的节区(有些人也叫区块)是运行一个程序真正需要的内容。
上边所有的“头”都仅仅是帮助Windows加载器定位和寻找下边的节区的内容。
在PE文件头中,这节课我们需要知道的是如何找到AddressOfEntryPoint即可,更多详细内容可以看下小甲鱼的《解密系列》系统篇|PE结构。
小结
GetModuleHandleA这个API函数用于获取程序的ImageBase(基址)
这个程序的MessageBox的OwnerHandle(父窗口句柄)为0(NULL),我们可以将这个值改为一个不存在的值,例如1,这样它就找不到老豆,就不会被显示出来。
名词注释:
VA(VirtualAddress,虚拟地址)
RVA(RelativeVirtualAddress,相对虚拟地址)
EP(EntryPoint,程序入口点)