新CrackMe160之059 - Dope2112.1

与旧版044一样

  1. 解决乱码, 不知道哪国的语言, 有那么一点像英文, 大概能看懂一点, 用ResScope与UE把对应的字都改掉, 中文转16进制可以用OD,在LCG界面(反汇编代码界面) ctrl+F调出字符串查找框可以转换输入的中文字是乱码, 不用管, 16进制结果是正确的, 不太好的是只能输入不能粘贴, 也可以用吾爱破解工具包中的其他工具下的ASCII_Unicode_HEX 转换工具 v1.2这个工具, 也很好用, 这个工具支持粘贴

  2. 暴力破解, OD搜索关键字定位第一个错误分支00421BDB, 成功分支00421D40, 这样将00421BDB改为 jmp 00421D40, 即破解成功~ 用户名输入任意6位以上即可

  3. 正常破解, 第一个错误分支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个是最常用的界面,其它的我基本上没用到~
OD界面布局

posted @ 2024-12-19 14:15  hankerstudio  阅读(1)  评论(0)    收藏  举报