第5章:演示版保护技术——菜单功能限制、KeyFile保护
菜单功能限制
相关函数:EnableMenuItem()
hMenu : 菜单句柄
uIDEnableItem : 欲允许或禁止的一个菜单条目的标识符。
如果在wEnable参数中设置了MF_BYCOMMAND标志,这个参数就代表欲改变菜单条目的命令ID。如设置的是MF_BYPOSITION,则这个参数代表菜单条目在菜单中的位置(第一个条目肯定是零)
wEnable : 对于这个函数,只能指定下述常数:MF_BYCOMMAND,MF_BYPOSITION,MF_ENABLED(允许,0),MF_DISABLED(禁止,2)以及 MF_GRAYED(灰化,1)
在程序中看一下:
和之前类似,注意第四个参数:
当 eax == 110 时,会跳转到 EnableMenuItem()的执行流程:
只需要将参数改为 0 即可。程序开始执行时运行一次,后面不会多次运行到该流程。
KeyFile 保护
KeyFile 文件一般比较小,包含的内容也多种多样,注册文件放入指定文件夹,经过检验即可正确使用程序。
① 加密或者未加密的数据
② 文件格式自定义
③ 加入垃圾信息
④ 将注册文件中的数据和关键代码与软件中的数据和代码挂钩
相关 API :
拆解 KeyFile 保护的一般思路:
到程序中看一下:
首先需要进入到对应的代码段中,可以使用消息断点 ButtonUp 进行捕获,经过多次运行找到进入代码段的函数:
在第二次 Call ecx 且 ecx == 4012CF 时 ,会进入关键代码段,此时:
当然也可以直接对 CreateFileA 下断点。下面分析算法:
三个 ReadFile 分别将文件中的数据( 5,pediy,12个字节的数据 )依次读取在三个不同的地址中。而 401000 地址处的代码将 pediy 加起来,取最后两字节保存起来。
具体算法如下:
首先对 xor 后的 12 字节依次进行操作。每个字节都会经历 6/4/2/0 四次移位操作,结果 and 3 之后得到一个 0-3 之间的数字。根据得到的数据对地图进行操作。
若碰到 * 则会退出,只有碰到 X 才会正常弹出窗口。