新CrackMe160之072 - Lesco_crackme01
汇编写的程序,直接OD载入,拉到最后可以看到算法代码00401467处,单步分析算法
code[i] = ((i * len) + 0x17) ^ 0xF ^ user[i]
注册机(keygen.c):
#include <stdio.h>
#include <string.h>
int main() {
char user[21] = {0};
char code[21] = {0};
printf("用户名: ");
fgets(user, sizeof(user), stdin);
printf("系列号: ");
int i, len = strlen(user) - 1;
user[len] = 0;
for(i=0; i<=len; i++){
code[i] = (((i+1)*len) + 0x17) ^ 0xF;
printf("%d", code[i] );
}
getchar();
return 0;
}
运行示例:
用户名: 12345
系列号: 194641366358
输入测试还是失败, 好奇怪, 明明程序都进入成功弹框分支了
00401511 |. 6A 00 push 0x0 ; /Style = MB_OK|MB_APPLMODAL
00401513 |. 68 76304000 push asm_cm01.00403076 ; |Title = "Lesco's first assembler crackme"
00401518 |. 68 96304000 push asm_cm01.00403096 ; |Text = "Congrats, u did it!!!"
0040151D |. 6A 00 push 0x0 ; |hOwner = NULL
0040151F |. E8 7A000000 call <jmp.&user32.MessageBoxA> ; \MessageBoxA
最终还执行了0040151F这行了,还是不行,问题出在这里,运行到这行时,F7进入发现跳了三次后,程序又跳回到0040103D处了,是不是上面这个弹框程序被作者重写了呢?
往下看又是一段算法,直接上注册机:
#include <stdio.h>
#include <string.h>
int main() {
char user[21] = {0};
int code,dx;
printf("用户名: ");
fgets(user, sizeof(user), stdin);
printf("系列号: ");
int i, len = strlen(user) - 1;
user[len] = 0;
code = *((int *)user) & 0xFFFF;
code = (code ^ 0xE32F) & 0xFFFF;
code = (code * code) & 0xFFFF;
code = (code ^ 0xAB6C) & 0xFFFF;
for(i=0; i<len; i++){
dx = (user[i] * (code & 0xFF) * ((code >> 8) & 0xFF)) & 0xFFFF;
dx = (((dx ^ 0x45EB) >> 2) * 2) & 0xFFFF;
printf((i+1)%2 == 1 ? "%x" : "%X", dx);
}
getchar();
return 0;
}
运行示例:
用户名: asm_cm01
系列号: 484465E470043BA41ee470043f46B44
使用的工具连接(工具有点多有点大,可以先下OD,其它的后面慢慢下) 点击前往下载
下面是我的OD的界面布局,我觉得这4个是最常用的界面,其它的我基本上没用到~


浙公网安备 33010602011771号