柿子挑软的捏,160个cm里找到一个能看得懂的逆向(029)
本人小白,初学汇编和破解,160个cm前20个里爆破了几个,后来试着逆向,因基础太差完全懵B,后来终于找到个看得懂的,感动啊发帖纪念一下。本小白一上来查找字符串,这个前辈倒是爽快,就留了几个都是关键字符串,没为难小弟。
来到字符串位置,往前看了几个跳转,发现也是验证后成功就跳到成功,失败就跳到失败,没坑。
分析如下,前面绿色线框着的是个循环,中间不停比较bl和cl的值,jnz,如果值不一样就跳到失败的地方004015C3,如果一直一样,到比较完之后就无条件跳到成功的位置 004015D9,爆破的话把这个JNZ改Nop掉就可以了。但本小白已经不满足于爆破了,试着逆向一下看能不能找出算号规律,关键就是BL和CL 的值,而上面两句MOV:
mov bl,byte ptr ds:
mov cl,byte ptr ds:
就是给BL和CL赋值,看来关键就在这段内存中了。猜测一个是存放name的运算结果,一个是存放serial的运算结果。
再往前翻,发现这两句话,说明这两个值存在栈中
mov eax,dword ptr ss:
mov edx,dword ptr ss:
再往前,又发现两个循环,读下来思路很清晰。前面把寄存器都清零,然后把ECX赋值1,进入第一个循环。
跟踪内存和堆栈发现,mov eax,就是取name字符串的地址放在eax,然后bl读这个地址的数据,也就是name的首个字节,然后bl和cl异或再放回内存,然后cl+1,所以第二个字母和02异或,如此循环直到读出是0说明字符串结束。
第二个是serial的值,和0x0a异或,和0x0b异或....,然后放回内存,这样我们输入的name和serial就被异或成一堆乱七八糟的东西。。。
下面用C语言写了个算号器:
#include <stdio.h>
void main()
{
char name = "\0";
char key="\0";
int i=0;
printf("Please input the name:\n");
scanf("%s",&name);
while(name!=0)
{
key = name ^ (i+1) ^(i+0x0a);
i++;
}
printf("the key is %s\n",key);
system("pause");
}
思路就是name异或两次得到serial,验证结果也是正确的。另外有个需要注意的点是,前面有个地方调用了GetWindowTextLengthA,然后跟5比较,不大于则直接跳到失败的地方,说明name和serial都需要大于5个字符
花名丶 发表于 2020-7-21 20:07
想请教一下楼主,学crack整体上有什么思路吗,小白(但不是伸手党)有点迷,不知应该从何学起。
最近还在 ...
我本身有C语言基础,然后最近大概看了两周的视频,是在B站看的“小甲鱼”的教程,先是8086汇编,再看点win32汇编,接着看解密系列 好像要给name和key数组添加下标吧
while(name!=0)
{
key = name ^ (i+1) ^(i+0x0a);
i++;
} 第一次crack一个作品,有点快感,虽然没什么难点,希望高手们不要觉得我灌水哈哈哈:lol 支持原创分享,加油大神{:1_921:} 膜拜大佬,大佬加油 向大佬学习!!
支持原创,楼主加油 支持支持{:1_893:}{:1_893:} 支持一下,加油!:loveliness: 羡慕啊,啥时候我也成大神呢 支持原创 加油