新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个是最常用的界面,其它的我基本上没用到~
OD界面布局

posted @ 2024-12-30 14:28  hankerstudio  阅读(23)  评论(0)    收藏  举报