新手破解练习Crackme160之126 - NZC.1

这个程序无法直接运行, win98下可以正常运行~
程序有壳, 无法直接脱壳, 只能手动脱壳, 跟着solly大佬的步伐来, 一步一步~ OC载入程序

  1. 脱壳
    1). 代码中还有很多???的乱代码, 是无用的花指令, 可以先去掉~ 菜单->插件->去除花指令->默认选择1.ObSiDiUm, 搜索地址0040D000(当前第一条程序地址), 搜索大小FFF(直到结束), 点确定后, 成功去除160个花指令, 代码一下清爽好多, 多出很多nop代码, 不用管~, 我们还可以继续尝试去除别的花指令, 结果都是0, 也就是没有别的类型的花指令了~
    2). 去除花指令后, F8单步跟踪, 来到第一个0040D241 call 0040D246 这一行, F7进入call方法, 继续F8一路下去到0040D2A9 ~ 0040D2B2这个循环, 有循环一般就是解码用的, 所以我们在循环下一行0040D2B4下个断点, F9运行跳过循环, 继续F8来到0040D2E3 call 0040D005, 有call我们就先在下一行断点, 再F7进入, 出来后再去断点(都这么操作, 防止程序无法返回), 里面也不懂做什么用的, 直接F9跳过吧, 来到call下面的断点处, 0040D2ED处后面备注显示KERNEL32.LoadLibraryA, 所以上面的call应该就是引用系统函数用的吧~
    3). 过程有点漫长, 我们分段分析, 0040D306 call dword ptr [ebp+4028CB]这行是加载user32.dll, 下面0040D32A处加载KERNEL32.dll, 这一段代码都是为了获取一些系统方法的, 所以我们一路F8下去到0040D472处, 0040D472 ~ 0040D48D 是timer事件, 大佬说跳过它, 我们跟着做, 在下一行0040D493处点中右键设为新的EIP, 确定后成功跳过, 继续F8
    4). 又是一路的F8来到0040D04AE ~ 0040D4CD这个循环, 这是一个关键的解码循环, 循环下面下个断点F9跳过循环, 继续F8, 又来到0040D4FC ~ 0040D51E的循环, 还是解码用的(只要有循环就肯定是解码用的, 都需要特别关注循环下面的代码, 因为解码完很可能就进入正常的代码块了, 所以循环后面一般都可以先下个断点, 防止操作过快跳过了, 又得重来), 循环下面下个断点F9跳过循环, F8来到0040D550 ~ 0040D559处又是循环, 同理跳过, 来到0040D55B处, 看到下面又开始有很多???的代码了, 是不是跟第一步一样? 所以, 我们需要继续去掉它们
    5). 再次去花指令, 同1).操作, 类型还是选1.ObSiDiUm, 搜索地址换成0040D55B, 搜索大小换成300(跟大佬一样), 成功去除93个花指令
    6). F8继续运行程序来到0040D56F处(跟大佬同步), 看到 0040D573处有个int 68, 这个命令只有低版本的系统才有, 高版本的系统会异常, 程序崩掉~, 跟着大佬的步伐直接跳到0040D59A处(右键设为新EIP), 继续F8向下来到0040D668 ~ 0040D680这个循环, 循环肯定也是解密一些东东, 我们继续跳过~ F8来到0040D705 ~ 0040D737循环, 又跳过~ (作者真牛X, 各种加密, 我们也只能硬着头皮继续解了), 又一路F8, 又来到一个循环0040D78B ~ 0040D795, 同理还是跳过~ 又是一路F8来到 0040D828 jmp eax, 好家伙, 终于拔开云雾见天日了, 我们终于来到明码区了~ F8进入解好的明码区
    7). 到了明码区, 我们要开始保存明码操作了~ 当前程序执行到00401A50处了(程序明码入口), 右键dump, 所有选项默认, 保存, 到此才脱壳完成~ (太难了)
     

  2. 正常破解
    OD载入脱壳后程序(OD有智能搜索插件, 找事件入口比较方便, OC插件比较少, 但代码中备注比较完善, 更容易理解代码上下文, 两个软件可以结合使用), 搜索界面只看到一个常量串, 没有成功失败关键字, 定位到常量串对应方法入口00401410, 运行程序, 点一下OK按钮, 成功停下, 说明成功找到了按钮事件, F8单步跟踪~ 00401486获取用户名, 00401493获取系列号, 00401517处判断系列号是否包含"-", 00401548处取得系列号"-"前面内容再转为10进制数(00401557) sn1, 00401595取"-"后面内容转10进制数 sn2, 后面值减去前面的值(0040159B)与固定值47391894.0比较(004015C1), 00401608~0040161E循环计算用户名: sn1 = (sn1 ^ 0x6F); ecx = len * user[len-1]; for(i=0;i<len(user);i++){sum += (user[i] & 0x7F) * ecx;}, 比较sn1^0x10与sum是否相等(00401637), 程序运行到这里就无法继续了, 所以我们得先写出注册机, 把用户名的算法先计算出来与sn1相等才能继续:

	#include <stdio.h>
	#include <string.h>

	unsigned int getvaluebyname(char *szName,unsigned int filesize,unsigned int nCompanyLength,unsigned int *psize);
	int rol(unsigned int num, unsigned char i);

	int main() {
		char user[21] = { 0 };
		unsigned long sn1=0, sn2=0;
		printf("用户名: "); scanf("%s", user);
		int len = strlen(user);
		if(len < 5) {
			printf("用户名最少5位");
			return 0; 
		}
		int ecx = len * user[len-1];
		for(int i=0; i<len; i++){
			sn1 += (user[i] & 0x7F) * ecx;
		}
		sn1 = sn1 ^ 0x10 ^ 0x6F;
		sn2 = 47391894 + sn1 + 1; //要大,这里先多加1 
		printf("系列号: %ld-%ld\r\n ", sn1, sn2);
		
		getchar();getchar();
		return 0;
	 }

运行示例:
用户名: abcde
系列号: 249864-47641759
0040166C取系列号最后一位, 与 4^0xC=8 比较, 所以上面的代码还需要改改, 不能直接加1, 需要判断到底加多少最后一位才会是8, 改后如下:

	#include <stdio.h>
	#include <string.h>

	unsigned int getvaluebyname(char *szName,unsigned int filesize,unsigned int nCompanyLength,unsigned int *psize);
	int rol(unsigned int num, unsigned char i);

	int main() {
		char user[21] = { 0 };
		unsigned long sn1=0, sn2=0;
		printf("用户名: "); scanf("%s", user);
		int len = strlen(user);
		if(len < 5) {
			printf("用户名最少5位");
			return 0; 
		}
		int ecx = len * user[len-1];
		for(int i=0; i<len; i++){
			sn1 += (user[i] & 0x7F) * ecx;
		}
		sn1 = sn1 ^ 0x10 ^ 0x6F;
		sn2 = 47391894 + sn1; 
		ecx = sn2 % 10; //取出个位 
		ecx = (ecx < 8 ? 8 : 18) - ecx;
		sn2 += ecx; // 这里ecx已经可以补齐最后一位为8了, ecx + 10n的所有数都是符合要求的
		printf("系列号: %ld-%ld\r\n ", sn1, sn2);
		
		getchar();getchar();
		return 0;
	 }

运行示例:
用户名: abcde
系列号: 249864-47641768

用户名: Merlin
系列号: 406003-47797898

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

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

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

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

posted @ 2024-08-01 16:39  hankerstudio  阅读(22)  评论(0)    收藏  举报