新160个crackMe算法分析-43-riijj_crackme.exe
这个程序的做法还是第一次见
文件中给了一个pf1.dll
在做这个CrackMe之前需要注意一点,win11环境下od加载后会出现异常,导致程序无法运行,解决办法就是换一个低版本的系统,我用的是XP可以正常运行
我们把能够获得的信息收集一下
程序无壳,由Microsoft Visual C++ 6.0编写

我们打开程序,可以获取到,这个程序的用户名需要4-15个之间,序列号没说,随便输入,点击Register,并没有错误提示,所以字符串搜索的方式可能就不太行了。

其实这个题没有思路只需要告诉你,验证在动态链接库里面,就可以开始做了
我们可以直接通过LoadLibraryA和GetProcAddress确定导入函数的地址。
如果我们一开始并没有想到验证在动态链接库里面
我们查找字符串会发现有一个很奇怪的字符串happytime

我们交叉引用去查看相关的位置

出现了加载动态链接库的两个相关函数,但是我们并不知道加载了哪一个dll,我们接着看,LoadLibrary的参数里面就有加载dll的字符串,也就是LibFileName,IDA已经给我们细心的标注了,我们回车进去之后发现他是一个字符串数组,并没有直观得看到我们想看到得dll字符串,很简单静态看不了,我们就在动态看不了,或者直接在IDA里面向上找,看看这个字符串数组被什么修改了

这里我搞错了一个地方

在里边的参数是完整的路径,我猜测前面可能有获取路径的处理,然后保存到这个字符串数组。
经过这里的分析我们也可以直到导入函数的地址也就是函数GetProcAddress的返回值 eax = 0x10001010
我们可以在导入函数的位置下断点,然后观察堆栈,看看这个函数处理了什么参数
我们f9之后程序变成了可以输入用户名和序列号的状态,我们随便输入一点,按下注册之后程序就断下了

观察堆栈参数

有我们输入的相关字符串
所以我们可以猜测这里面进行算法的验证,接下来就可以开始验证我们的想法了,经过分析,我们可以确定这里其实进行了相关验证已经字符串的比较
关键跳转和正确的处理信息

注册机的编写
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string>
char strName[20];
char string1[300] = {0x00, 0x00, 0x00, 0x00, 0xFF };
char string2[200] = "fytugjhkuijonlbpvqmcnxbvzdaeqrwtryetdgfkgphonuivmdbxfanqydexzwztqnkcfkvcpvlbmhotyiufdkdnjxuzyqhfsta";
char strKey[50];
int main()
{
printf("输入用户名: ");
scanf("%s", strName);
strcat(string1, string2);
int tmp = 0;
for (int i = 0; i < strlen(strName); i++)
{
strKey[tmp] = string1[strName[i] % 0x62];
strKey[tmp + 1] = string1[(strName[i] % 0x62) + 1];
tmp += 2;
}
printf("%s\n", strKey);
return 0;
}
验证

总结:这题最有趣的点就是把验证塞进了Dll,是我先前并没有接触的方式以及知识,也算是学习了一个新的思路,New知识+1,这题的算法部分其实很一般,并没有涉及很难很麻烦的算法,逐步分析就可以啦,慢慢的看,然后配合OD,就写出来,没有写相关的算法分析才不是因为我懒呢,思路已经给出来了,接下来完全可以尝试独立解决了。
未完待待续...
在拜读大佬的博客 https://www.kn0sky.com/?p=242 和相关视频评论
发现的一些未解决的疑问
1.dll应该是PE格式,但是此出的dll

并不是标准的PE格式
2.为什么在win11环境下会有异常出现,是否涉及反调试

浙公网安备 33010602011771号