首页
社区
课程
招聘
[原创]KeyFile保护Crackme
发表于: 2020-2-10 21:22 5169

[原创]KeyFile保护Crackme

erfze 活跃值
12
2020-2-10 21:22
5169

运行程序,打开任务管理器,查看进程名称如下:

Process Monitor添加条件如下:

只监视文件相关操作,可以看到程序要读取的文件名称如下:

程序先使用CreateFile()函数来打开KeyFile文件,故通过该函数定位:

成功打开文件后下面有三处ReadFile()操作:

第一处ReadFile()操作读取1个字节到缓冲区中,笔者将其命名为StringLength。接下来判断该值是否为0,若为0,直接跳转到CloseHandle()函数处;不为0,继续下面的操作。

第二处ReadFile()操作读取StringLength个字节到缓冲区中,然后调用sub_401000()。跟进sub_401000()查看:

403288h处存放的是刚刚ReadFile()读取内容,故该函数功能是将读取内容逐字节相加,取其低8位保存于String_Char_Add(由笔者命名)中。

第三处ReadFile()读取18个字节,然后调用sub_4010C9,跟进查看。

先跟进sub_40101D函数查看其功能:

该函数功能是将上述第三处ReadFile()读取出来的18字节(笔者名之为String_Char_Xor)逐个与String_Char_Add作异或运算。

将下面的指令粗略转成C语言形式(分析时随手写成,仅为表达程序逻辑,无法运行):

注意上图红色方框中的两个向上箭头明显是Do...While的标志。

由于函数sub_401033()功能暂不清楚,故只写下if框架,等待分析完函数sub_401033()功能后再补充。

注:笔者起初没有使用IDA Pro的F5,分析并写完后方才以F5验证是否正确,但发现其不靠谱...

跟进函数sub_401033()查看,首先是一处if...else if...else代码块:

粗略转成C语言形式:

下面是一处if...else代码块:

粗略转成C语言形式:

将之前Do...While中的if补齐如下:

综合上述分析,可以总结出该程序的验证思路。

读取KeyFile文件中第一个字节,该字节存储的是Len(Name)

根据长度读取Name,将Name逐字节相加,取其低8位,存储于L8

于KeyFile文件中继续读取18个字节内容,逐个与L8作异或运算

关键在于第3步中读取的18个字节是何种意义。

将奇怪字符串以16(16是由aC_0_After_C起始位置得来)为单位分开,可以发现端倪:

.是路径,*是墙壁,C是起点,X是终点。由C沿.走到X,验证通过;其间若碰到*,验证失败。

那么,sub_401033()函数一开始的if...else if...else代码块的功能:

0:上

1:右

2:下

3:左

而下面的if...else代码块则是判断是否碰壁或者到达终点。

既然sub_401033()函数功能是移动一步并判断,那么第3步中读取的18个字节存储的应是与路径相关。那么就来走一下这个迷宫(只写出部分,后面请自行补充):

2 2 2 1 2 2 2 3 2 2 1 1...


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 2
支持
分享
最新回复 (1)
雪    币: 313
活跃值: (250)
能力值: ( LV9,RANK:650 )
在线值:
发帖
回帖
粉丝
2
迷宫走了一次
2020-2-13 20:44
0
游客
登录 | 注册 方可回帖
返回
//