新CrackMe160之100 - E - crackme

PEiD查看是C++的,但看图标就知道是易语言写的, OD载入程序,F9运行,搜索界面没有相关关键词,所以使用暂停法,按注册弹出错误信息,按暂停
在堆栈界面定位到0040A28D,上面就是算法了,在代码界面看到了成功等关键词,在方法入口0040A0BD下断点,开始单步分析算法
1). 0040A348 由机器码得到第1个值
2). 0040A424 由机器码得到第2个值
3). 0040A500 由机器码得到第3个值
4). 0040A5DC 由机器码得到第4个值
5). 0040A0ED 对比第1个值
6). 0040A13F 对比第2个值
7). 0040A191 对比第3个值
8). 0040A1E3 对比第4个值
跟踪分析可知上面每个算法都要进入call 0040A6CB这个方法, 进入可知,这个方法应该是iat表,具体调用哪个方法由入参ebx+[100EA87C],决定,
我电脑的code是-192205685
1). code ^ 0x4B4EB28 = 0xF03FC7A3 = -264255581 => 2642
2). code ^ 0x22F16632 = 0xD67A4AB9 = -696628551 => 6966
3). code ^ 0x2CF062E0 = 0xD87B4E6B = -663007637 => 6630
4). code ^ 0x6C21D6B = 0xF24931E0 = -230084128 => 2300
可得系列号为: 2642 - 6966 - 6630 - 2300
每个电脑的机器代码不一样,自行代入用计算器算一下就可出来结果了,不想自己动手算的,就直接用注册机吧

#include <stdio.h>
#include <string.h>

int fun0040A6CB(int code, int arg);

int main() {
	int code = 0, num;
	printf("机器码: ");
	scanf("%d", &code); getchar(); //消耗掉多输入的\n 
	printf("注册码: ");
	num = fun0040A6CB(code, 0x4B4EB28); printf("%04d ", num);
	num = fun0040A6CB(code, 0x22F16632); printf("%04d ", num);
	num = fun0040A6CB(code, 0x2CF062E0); printf("%04d ", num);
	num = fun0040A6CB(code, 0x6C21D6B); printf("%04d ", num);
	getchar();
	return 0;
}

int fun0040A6CB(int code, int arg){
	char str[32] = {0};
	char *endstr;
	int rlt = 0;
	rlt = code ^ arg;
	if(rlt < 0) rlt *= -1;
	sprintf(str,"%04d",rlt); //最少得4位不足补0 
	str[4] = 0;
	rlt = strtol(str, &endstr, 10);
	return rlt;
}

运行结果示例:无
每个人的机器码不一样

 
 
本节高手录制的视频,点击前往查看

 
 
 
使用的工具连接(工具有点多有点大,可以先下OD,其它的后面慢慢下) 点击前往下载

下面是我的OD的界面布局,我觉得这4个是最常用的界面,其它的我基本上没用到~
OD界面布局

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