新CrackMe160之059 - Dope2112.1
与旧版044一样
-
解决乱码, 不知道哪国的语言, 有那么一点像英文, 大概能看懂一点, 用ResScope与UE把对应的字都改掉, 中文转16进制可以用OD,在LCG界面(反汇编代码界面) ctrl+F调出字符串查找框可以转换输入的中文字是乱码, 不用管, 16进制结果是正确的, 不太好的是只能输入不能粘贴, 也可以用吾爱破解工具包中的其他工具下的ASCII_Unicode_HEX 转换工具 v1.2这个工具, 也很好用, 这个工具支持粘贴
-
暴力破解, OD搜索关键字定位第一个错误分支00421BDB, 成功分支00421D40, 这样将00421BDB改为 jmp 00421D40, 即破解成功~ 用户名输入任意6位以上即可
-
正常破解, 第一个错误分支00421BDB, 下面就是算法了, 我们F8单步分析, 输入abcdef, 123456:
bl = 0;
for(i=-1;i<6;i++){ //用户名的前一个开始循环6次
if(name[i] in {a~z}){
dl = val{a~z}; //不同字母对应不同值
}else{
dl = 0x5D;
}
bl += dl;
}
ecx = abcdef, bl = 0x5D + 0x18 + 0x25 + 0x42 + 0xC + 0xD = 0xF5 = 245
eax = len * 0x4A7E = 0x1BEF4 = 114420
str = "245" + "-" + "114420";
然后与系列号对比是否一致, 到此算法也很明确了, 下面开始写注册机代码: keygen.c
#include <stdio.h>
#include "string.h"
int main(){
while(true){
char user[20] = {0};
printf("请输入用户名: ");
scanf("%s", user);
int len = strlen(user);
if(len < 6) {
printf("用户名最少6位\n");
continue;
}
int bl = 0x5D;
char str[27] = {0x18,0x24,0x42,0xC,0xD,0x6,0x36,0x2B,0x17,0x2F,0x13,0x82,0x9B,0x92,0x3,0x63,0x21,0x42,0x5C,0x29,0xC7,0x66,0x58,0xA,0x28,x50,0};
for(int i=0; i<5; i++){
if((user[i] >= 0x41) && (user[i] < 0x5A)) user[i] += 0x20; //转小写
if((user[i] >= 0x61) && (user[i] <= 0x7A)) bl += str[user[i] - 'a'];
else lb += 0x5D;
bl &= 0x000000FF; //bl是ebx的低位, 所以结果要把高位去掉
}
int eax = len * 0x4A7E;
printf("系列号为: %d-%d\n", bl, eax);
}
return 0;
}
运行示例:
请输入用户名: Dope2112
系列号为: 57-152560
使用的工具连接(工具有点多有点大,可以先下OD,其它的后面慢慢下) 点击前往下载
下面是我的OD的界面布局,我觉得这4个是最常用的界面,其它的我基本上没用到~