howmoney 发表于 2020-7-21 17:46

柿子挑软的捏,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个字符

howmoney 发表于 2020-7-23 10:24

花名丶 发表于 2020-7-21 20:07
想请教一下楼主,学crack整体上有什么思路吗,小白(但不是伸手党)有点迷,不知应该从何学起。
最近还在 ...

我本身有C语言基础,然后最近大概看了两周的视频,是在B站看的“小甲鱼”的教程,先是8086汇编,再看点win32汇编,接着看解密系列

wslingba 发表于 2020-7-22 14:38

好像要给name和key数组添加下标吧
while(name!=0)
    {
      key = name ^ (i+1) ^(i+0x0a);
      i++;
    }

howmoney 发表于 2020-7-21 17:49

第一次crack一个作品,有点快感,虽然没什么难点,希望高手们不要觉得我灌水哈哈哈:lol

zdnyp 发表于 2020-7-21 17:57

支持原创分享,加油大神{:1_921:}

tyosei 发表于 2020-7-21 17:59

膜拜大佬,大佬加油

smileys 发表于 2020-7-21 18:01

向大佬学习!!

ml3389 发表于 2020-7-21 18:02


支持原创,楼主加油

xiao9798 发表于 2020-7-21 18:03

支持支持{:1_893:}{:1_893:}

useeseeu 发表于 2020-7-21 18:05

支持一下,加油!:loveliness:

yxqnba 发表于 2020-7-21 18:08

羡慕啊,啥时候我也成大神呢

m-10306 发表于 2020-7-21 18:10

支持原创 加油
页: [1] 2 3 4 5 6
查看完整版本: 柿子挑软的捏,160个cm里找到一个能看得懂的逆向(029)