新手破解练习Crackme160之044 - Dope2112.1

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

  2. 暴力破解, OD搜索关键字定位第一个错误分支00421BDB, 成功分支00421D40, 这样将00421BDB改为 jmp 00421D40, 即破解成功~

  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;
		for(int i=0; i<5; i++){
			if((user[i] >= 0x41) && (user[i] < 0x5A)) user[i] += 0x20; //转小写 
			switch(user[i]){
				case 'a': { bl += 0x18; break; }
				case 'b': { bl += 0x25; break; }
				case 'c': { bl += 0x42; break; }
				case 'd': { bl += 0xC;  break; }
				case 'e': { bl += 0xD;  break; }
				case 'f': { bl += 0x6;  break; }
				case 'g': { bl += 0x36; break; }
				case 'h': { bl += 0x2B; break; }
				case 'i': { bl += 0x17; break; }
				case 'j': { bl += 0x2F; break; }
				case 'k': { bl += 0x13; break; }
				case 'l': { bl += 0x82; break; }
				case 'm': { bl += 0x9B; break; }
				case 'n': { bl += 0x92; break; }
				case 'o': { bl += 0x3;  break; }
				case 'p': { bl += 0x63; break; }
				case 'q': { bl += 0x21; break; }
				case 'r': { bl += 0x42; break; }
				case 's': { bl += 0x5C; break; }
				case 't': { bl += 0x29; break; }
				case 'u': { bl += 0xC7; break; }
				case 'v': { bl += 0x66; break; }
				case 'w': { bl += 0x58; break; }
				case 'x': { bl += 0xA;  break; }
				case 'y': { bl += 0x28; break; }
				case 'z': { bl += 0x50; break; }
				default:  { bl += 0x5D; break; }
			}
		    bl &= 0x000000FF; //bl是ebx的低位, 所以结果要把高位去掉
		}
		int eax = len * 0x4A7E;
		printf("系列号为: %d-%d\n", bl, eax);
	}
	return 0;
}

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

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

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

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

posted @ 2024-05-10 16:57  hankerstudio  阅读(9)  评论(0)    收藏  举报