新CrackMe160之031 - Cruehead.1

与旧版033相同

这个程序还是有主界面, 注册界面, 那我们就当主界面是NAG干掉它, 分析得知是汇编写的, 不会, 完全不会, 单步跟踪了好久没找到突破口, 放弃了, 后面学了更多知识再来吧

  1. 暴力破解, 打开注册界面, OD搜索关键字, 定位到00401370与004013B4两处失败提示, 找到方法入口看是谁调用过来的, 我们跟过去看(在OD中点方法入口行, 会提示来自哪里, 我们在提示行右键即可跳过去), 我们分别找到了000401226与00401243两处je, 00401243改为jmp, 保存, 暴破完成~

  2. 正常破解, 单步跟踪可知0040122D为用户名算法, 输入abcde计算结果为0x5737, 00401238为系列号算法, 输入12345计算结果为0x220D, 然后比较两个结果是否相同, 那我们就分别把两个算法分析出来问题就解决了,
    用户名算法:
    1.判断输入的每一位是否在0x41~0x5A之间, 即A~Z之间, 不是大写的就转为大写abcde=>ABCDE
    2.每一位相加起来, A+B+C+D+E = 0x14F,
    3.相加结果异或0x5678=> 0x14F xor 0x5678 = 0x5737

系列号算法:

  1. 每一位减0x30就是字符数字转整形数字,
  2. 异或 0x1234 => 12345 xor 0x1234 = 0x220D

OK, 算法解读完成, 接下来就是写注册机程序了

#include <iostream>
#include "string.h"

int main(){
	while(true){
		char user[20] = {0};
		printf("请输入用户名: ");
		scanf("%s", user);
		int len = strlen(user);
		int a = 0;
		int rlt = 0;
		for(int i=0; i<len; i++){
			a = user[i];
			if(a >= 97 && a <= 122){ a -= 32; } //小写转大写
			if(a < 0x41 || a > 0x5A){ 
				printf("用户名不合法,只能输入字母~");
				user[0] = 0;
				rlt = 0;
				break; 
			}
			rlt += a;
		}
		if(rlt > 0){
			rlt ^= 0x5678;
			rlt ^= 0x1234;
		}
		printf("系列号为: %d\n", rlt);
	}
	return 0;
}

运行示例:
请输入用户名: Cruehead
系列号为: 17933

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

 
 
 

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

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

posted @ 2024-12-10 09:14  hankerstudio  阅读(1)  评论(0)    收藏  举报