新手破解练习Crackme160之158 - Torn@do.1

OD载入程序, 打开搜索界面, 第三行看到了REGISTERED!, 定位到0040150B, 在00401503处看到了两数比较,说明这里可以追码, 向上找到方法入口, 点击004014E0行, 下面信息框显示来自004015AA的调用, 右键转到调用, 又是一个小方法, 再次点方法入口行00401580, 信息框提示来自004019AB的调用, 继续右键跳转调用, 成功看到了关键方法GetDlgItemTextA (0040198B) 这里下个断点, 输入三个值点check, 成功停在这里, 这行是获取注册码的, 说明前面已经获取过用户名和公司名了, 00401996将注册码转整形, 说明注册码必须是全数字, 向下则进到关键字方法中, 没有用户名的相关读取, 也没看到相关算法, 在关键对比00401503处, 看到, 系列号整数与[00409770]这个内存值比较, 所以这个值肯定就是用户名算法结果值了, 右键查找所有常量409770, 结果中有4处赋值语句:

参考位于 Torn@do_:.text 到常量 0x409770
地址       反汇编                                    注释
004013A4   mov dword ptr ds:[0x409770],eax
004013F1   mov ebx,dword ptr ds:[0x409770]           ds:[00409770]=003A1DFC
00401425   mov dword ptr ds:[0x409770],ebx
004014C7   add dword ptr ds:[0x409770],edi
004014E1   mov ecx,dword ptr ds:[0x409770]           ds:[00409770]=003A1DFC
004014FD   mov dword ptr ds:[0x409770],ecx           (初始 CPU 选择)
00401934   mov dword ptr ds:[0x409770],0x0           Case 3EB of switch 004018C5
00406BA8   cmp edx,Torn@do_.00409770                 00409770=Torn@do_.00409770

一个个查看可得00401425(用户名)与004014C7(公司名)相关算法, 分别两处都下好断点, 单步分析算法, 注册机如下:

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

int main(int argc, char** argv) {
	char str1[54] = "Etn5Pnc5AXi1DFlkYqnujsXNmvHdbcrqOoT8aaV5DkaymMRkPkoQ.";
	char str2[65] = "fQObVwNOankJ5skqJvae3Ae5jdoETu5n02J6Ez85430PNSDAPjDrYgFaze9VDRjq";
	char str3[32] = "F3A4BF3B0503FB8BCB4F49803D5C740"; //日对应值
	char str4[13] = "9803D2F7404E"; //月对应值
	char user[21] = {0};
	char comp[21] = {0};
	printf("用户名: ");
	scanf("%s", user);
	printf("公司名: ");
	scanf("%s", comp);
	int lenu = strlen(user);
	int lenc = strlen(comp);
	if(lenu<1 || lenc<1){
		printf("用户名与公司名不能为空");
		return 0; 
	}
	unsigned long sum = 0;
	time_t now;
	struct tm *date;
	time(&now);
	date = localtime(&now); //date->(tm_year+1900, tm_mon+1, tm_mday, tm_hour, tm_min, tm_sec)
	sum += str4[date->tm_mon+1 - 1] * str3[date->tm_mday - 1]; //0040162A程序启动时使用当前时间月日计算所得 
	for(int i=0; i<lenu-1; i++){
		sum += user[i] * str2[i] * str1[i] * (i+1);
	}
	for(int i=0; i<lenu-1; i++){
		sum += comp[i] * str2[i] * str1[i] * (i+1);
	}
	printf("系列号: %lu\r\n", sum);
    getchar();getchar();
    return 0;
}

运行示例:
用户名: abc
公司名: 123
注册码: 3811844

后面还有一个算法, 不知道干嘛用的,

sum1 = 0;
for(int i=1; i<lenu; i++){
	sum1 += user[i] * 221;
}
for(int i=1; i<lenc; i++){
	sum1 += ((comp[i] * 11) << 0xB) - comp[i];
}
sum1 += 0x7CF;
if(sum1 == sum){
	[0x40977C] = 1;
	[0x409774] = 1;
}

 
 
 
这是160个软件part1
这是160个软件part2

1~160每个破解过程,在吾爱破解论坛都有高手破解过了,也有整理好现成的, 我这边主要就是自己动手操作的过程,与他们的不太一样
附上高手们的连接: 点击前往查看
使用的工具连接(工具有点多有点大,可以先下OD,其它的后面慢慢下) 点击前往下载

新人入门教程"玩玩破解,写给新人看" 点击前往查看
我就是从这里开始的,对我这样的小白感觉超级友好~

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

posted @ 2024-08-15 15:48  hankerstudio  阅读(9)  评论(0)    收藏  举报