加密与解密4--KeyFile保护

原理

这是一种利用文件来注册软件的保护方式,KeyFile一般是一个小文件,包含纯文本信息或者不可显示字符的二进制文件。其内容是一些加密或未加密的数据,其中可能有用户名,注册码等信息。这种文件一般放在安装目录或者系统目录下面,每次启动软件时就从中读取数据,然后利用某种算法处理,看结果是否为正确的注册文件。

保护

软件作者可以采用稍微大点的注册文件,其中可以加入一些垃圾信息来干扰破解者,或者对文件的合法性检查分成几部分,分散在不同的模块中进行判断。采用的算法也要尽量复杂,让注册文件中的数据和关键代码联系起来,让软件无法被暴力破解。

与KeyFile相关的API函数

API函数 用于注册文件时的主要作用
FindFirstFileA 确定注册文件是否存在
CreateFileA,_lopen 确定文件是否存在,打开文件获取其句柄
GetFileSize,GetFileSizeEx 确定文件大小
GetFileAttributesA,GetFileAttributesExA 获得注册文件属性
SetFilePointer,SetFilePointerEx 移动文件指针
ReadFile 读取文件内容

拆解KeyFile保护的例子

思路

  1. 用Process Monitor等工具监视软件对文件的操作,以找到KeyFile的文件名
  2. 伪造一个KeyFile文件,用16进制工具编辑和修改KeyFile
  3. 在调试器里用CreateFileA函数设断,查看其打开的文件名指针,并记下返回的句柄
  4. 用ReadFile函数设断,分析传递给ReadFile函数的文件句柄和缓冲区地址。文件句柄一般和第三部相同,缓冲区地址一般为重要数据的存放位置,对缓冲区中存放的字节设内存断点,监视读取的KeyFile内容

OD分析过程

在这里插入图片描述

  1. 对CreateFileA函数下断点,通过OD可以看出文件读取函数读取文件是KWAZYWEB.bit
    在这里插入图片描述
  2. 第一次读取文件的代码,只读取了一个字节,存放在4034FA的地址空间中,值为7
    在这里插入图片描述在这里插入图片描述
  3. 第二次读取数据,很明显这次读取的字节是7,可以猜想第二次读取数据的大小是由第一次决定的,这次取出的数据放到403288这个地址
    在这里插入图片描述
  4. 第二次读取完毕后,进行一些数学操作,7次相加的结果为303,低位放到4034FB中,数值为3
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  5. 进行第三次读取数据,这次读取数据的长度为18(10进制),读取数据放到4034E8,在关闭数据读取之前有一个调用4010c9的函数,这个函数应该是核心验证函数,前两次读取,第一次是读取用户名的长度,第二次是读取用户名,第三次用应该就是通过用户名计算得出的验证码在这里插入图片描述
  6. 进入4010C9函数,发现有一个奇怪的字符串,我们在内存中查看他,对于我这种初心者来说,一开始肯定不知道这是什么,就当做经验慢慢累积吧,这是一个典型的吃豆子游戏,C代表吃豆子的东西,*代表墙壁一碰到就失败返回,.代表豆子,就是要吃掉它,X代表目的地,通过移动最终吃到X就算成功
    在这里插入图片描述
    在这里插入图片描述
  7. 进入40101D函数,功能就是将前面算出的3与第三次取出的数据进行异或
    在这里插入图片描述
  8. 继续进行处理,将每个字节都转换成4进制
    在这里插入图片描述
  9. 进入401033函数,首先看到4个分支,在上面内存中我们可以看到内存中地址与地址之间差10h,所以分支分别为0,值-10h(上移);1,值+1(右移);2,值+10h(下移);3,值-1(左移)
    在这里插入图片描述
  10. 判断了每个字节怎么移动就进入下面流程,403184存的就是最开始C的位置,在40106E处的代码就是将移动后的位置去做判断
    在这里插入图片描述
  11. 吃到了豆子就说明路是对的,就继续往下走,前往4010B3处
    在这里插入图片描述
  12. 一次处理结束,就来看看循环进度,外循环18次,内循环4次,一共48次操作
    在这里插入图片描述
  13. 所以我们得将那个图上四个一组的组合写出来
    分别是:2221 2223 2211 0100 1110 0333 0300 1111 1211 0112 1112 2332 3303 3222 3221 1100 1111 2233
    上面都是四进制的数,转化成16进制 A9 AB A5 10 54 3F 30 55 65 16 56 BE F3 EA E9 50 55 AF分别与当时异或得到的低8位0x03相异或就得到:AA A8 A6 13 57 3C 33 56 66 15 55 BD F0 E9 EA 53 56 AC。
    至此整个KeyFile结构就出来了:07+cuitzlh+AA A8 A6 13 57 3C 33 56 66 15 55 BD F0 E9 EA 53 56 AC
    第一部分07是名字的个数,第二部分用户名的ASCII,第三部分是异或得到的验证码,用16进制工具写入注册文件就行了
    在这里插入图片描述
    然后再次运行程序
    在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/z1041259928/article/details/87933524