新手破解练习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;
}
1~160每个破解过程,在吾爱破解论坛都有高手破解过了,也有整理好现成的, 我这边主要就是自己动手操作的过程,与他们的不太一样
附上高手们的连接: 点击前往查看
使用的工具连接(工具有点多有点大,可以先下OD,其它的后面慢慢下) 点击前往下载
新人入门教程"玩玩破解,写给新人看" 点击前往查看
我就是从这里开始的,对我这样的小白感觉超级友好~
下面是我的OD的界面布局,我觉得这4个是最常用的界面,其它的我基本上没用到~


浙公网安备 33010602011771号