新CrackMe160之044 - tsrh-crackme

  1. 去NAG
    OD载入程序, F9运行, 弹出NAG框, 点暂停(F12), 堆栈界面(K)看到弹框处为00401057, 定位到代码区域看到是一个jnz,下面便是弹框代码, 所以改为jmp跳过弹框即可

  2. 破解
    重新载入去NAG程序, 用户名需要5位以上,输入伪码abcde,12345验证,提示无效的系列号,按提示搜索到5个错误信息,上面的关键跳5处都下个断点,重新点验证, F8单步跟踪, 分析算法:
    1). 00401112处得到年份: 0x7D3 + 用户名长度
    2). 00401130处将系列号与0x68727374(tsrh)对比, 说明系列号前4位得是tsrh, 再与年份组串得: tsrh-year- => rlt0
    3). 0040113F处用户名循环计算: (user[i] + 0xC - 0x11 + user[i] + 0xC - 10) ^ (user[i] + 0xC) => rlt1(只存第一位,其它位置0)
    4). 00401151处又将用户名与2).计算结果进行计算: (user[i] + 1) ^ rlt1[i] =>结果控制在A~Z之间 => rlt2
    5). rlt0 + rlt2 与 系列号对比
    注册机如下:

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

int main() {
	char code[21] = {0};
	char user[21] = {0};
	char tmp[3] = {0};
	printf("用户名: ");
	fgets(user, sizeof(user), stdin);
	int i, j, k = 0, len = strlen(user) - 1;
	int year = 0x7D3 + len; 
	code[0] = '0';
	code[1] = '0';
	j = (2 * (user[1] + 0xC) - 0x1B) ^ (user[1] + 0xC); //只会用到rlt1中的第3个,由第2位用户名计算所得 
	sprintf(tmp, "%02X", j);
	code[2] = tmp[0];
	for(i=0; i<len; i++){
		code[i] = (user[i] + 1) ^ code[i+2];
		while(code[i] < 0x41){
			code[i] += 8;
		}
		while(code[i] > 0x5A){
			code[i] -= 3;
		}
	}
	printf("系列号: tsrh-%d-%s", year, code);
	getchar();
	return 0;
}

运行示例:
用户名: tsrh044
系列号: tsrh-2010-LYXZAEE

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

 
 
 

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

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

posted @ 2024-12-19 13:42  hankerstudio  阅读(42)  评论(0)    收藏  举报