Crackme--Afkayas2
这题需要输入正确的用户名和序列号才能通过

使用peid查下,发现是vb的程序

使用vb decompiler反编译看下,发现0x00408200的地址上的代码和Afkayas1这道题相同的算法,这里不再赘述。从这里可以当作是调试的时候第一个断点的位置。

顺着断点往下走,在0x4082e9的地方调用了一个函数,将之前根据用户输入的字符串的值转成了浮点数,然后进行了浮点数运算

后续的解题步骤就是找代码中存在浮点数运算的位置,例如:
00408318 | 0F85 A1040000 | jne afkayas.2.4087BF
0040831E | DEC1 | faddp st(1),st(0)
00408320 | DFE0 | fnstsw ax
观察ST寄存器中值的变化即可得到最终生成的序列号。
注:本题中对用户输入的字符串运算的加减乘除的值都是固定值,例如上图的0x40100c位置的值,在程序运行前查看此部分浮点数的值就能看到,这个地址属于.text段的地址

注册机代码如下:
#include <stdio.h>
#include <string.h>
int main()
{
char szBuffer[30] = {0};
printf("请输入用户名:");
scanf("%s", szBuffer);
int result = szBuffer[0] + 88888 * strlen(szBuffer);
result+=2;
result*=3;
result-=2;
result+=15;
printf("%d", result);
return 0;
}

浙公网安备 33010602011771号