新手破解练习Crackme160之153 - The_q.1
Delphi的程序, 用IDR查看源码, 只有一个注册码框change事件, OD载入程序定位到事件入口地址00425F64, F8单步走起~
1). 00425FF5 ~ 00426052 将注册码分成单双号两半, 如:12345678 => 1357, 2468
2). 00426071 ~ 00426084 将奇数段每一位异或存到edi = '1' ^ '3' ^ '5' ^ '7' = 0
3). 00426097 ~ 004260AC 将偶数段补齐8位, 如: 24680000
4). 004260EE 将2)串"24680000"前4位"2468"转数字0x9A4
5). 0042611D 将2)串"24680000"后4位"0000"转数字0
6). 判断edi是否为0, 为0则失败了, 不为0则将双数mod edi, 结果为0xD则成功了~
我们手动计算一下, (上面的12345678, 肯定是不行的, edi=0直接失败了, 所以去一位变成, 135, 将7改为偶数)
设单数位为: 135 => edi = '1' ^ '3' ^ '5' = 0x37
那双数位为: 0x37 * (2n+1)(n=0) + 0xD = 0x44 = 68 (符合)
奇数3位135, 偶数用0被齐5位00068, 可随意组合: 13500068 输入测试验证失败, 跟踪可得偶数位结果为"00068egi"后面还有字母了, 多次测试后发现只能是4位, 因为程序判断小于5位就会把后4位变为0, 就不会出现字母了了, 试一下1350068, 测试成功了~, 经测试13579随便取3位都是可以的, 且奇数位不需要顺序与位置, 如1350068, 1006835, 0068351...都是可以的, 0x37就是7, 所以70068也是可以的^ _ ^, 只要偶数是4位, 奇数位数不限, 如:11111170068
注册机(只取n=1的情况并且是纯数字)
#include <stdio.h>
#include <stdlib.h>
int chkCode(char *num);
int getNum(int index, int len, char *num); //递归取len位的数字
int main(int argc, char** argv) {
char num[11] = {0};
for(int i=1; i<6; i++){ //这里列出1~6位奇数的情况,
getNum(0, i, num);
}
system("pause");
return 0;
}
int chkCode(char *num){ //num为所有奇数
char code[9] = {0};
int rlt = 0, s = 0, num_js = 0, i = 0;
while(*(num+i)!=0){
num_js ^= *(num+i);
i++;
}
i = 1; //这里只取 n = 1 的情况
rlt = num_js * i + 0xD;
sprintf(code, "%04d", rlt);
s = 1;
for(int j=0; j<4; j++){
if(code[j] % 2 == 1) { s = 0; break; }
}
if(s == 1){
printf("%s%04d\n", num, rlt);
return 0;
}
return 0;
}
int getNum(int index, int len, char *num){
if(index == len){
return chkCode(num);
}
char str[6] = "13579";
int rlt = 0;
for(int i=0; i<5; i++){
num[index] = str[i];
rlt = getNum(index+1, len, num);
if(rlt == 1) return 1;
}
return 0;
}
1~160每个破解过程,在吾爱破解论坛都有高手破解过了,也有整理好现成的, 我这边主要就是自己动手操作的过程,与他们的不太一样
附上高手们的连接: 点击前往查看
使用的工具连接(工具有点多有点大,可以先下OD,其它的后面慢慢下) 点击前往下载
新人入门教程"玩玩破解,写给新人看" 点击前往查看
我就是从这里开始的,对我这样的小白感觉超级友好~
下面是我的OD的界面布局,我觉得这4个是最常用的界面,其它的我基本上没用到~


浙公网安备 33010602011771号