1. 实验目的和要求
研究软件注册机制,的现行制,并实现手工去除病毒代码,
利用OD等工具破解U盘监控器、Free Internet Window Washer,绕过或发现注册码,达到注册成功目的。
2.实验步骤
1.1运行软件,获得与破解有关的信息;

1.2寻找注册失败字符串地址;

1.3使用 OD 获取引用该字符串的指令在内存中的地址;
右键点击常量

1.4使用W32DASM获得判断语句的位置;
其实这里要好好对应着OD看看,以及看看事件断点

1.5、使用OD修改指令字节码。

2.1、运行安装软件FIWWSetup2.9.exe(不是破解该安装exe,而是破解安装成功的exe),找到安装文件夹;

2.2、查壳:使用PEID工具检验是否加壳;
没有加壳

2.3、注册,发现报错字符串;

2.4、输入错误注册码,调试跟踪,发现注册判断代码位置;
这里ASCLL搜索RES_Registration_Error,这里应该是给了字符表的ID号
同时真正判断看到这里的时候其实是做一个事件判断的断点才行

2.5、使用OD修改指令字节码;
直接修改成jmp,然后dump出程序就行了

2.6、理解该软件的注册机制。(可选内容)
我们找到触发这件事断点的地方,这里我们看到当我们输入11111的时候函数
跳转到这里,然后发现11111的值传入了eax,然后下一步进入Sub_4D8720
然后做了一个异或判断,异或了al寄存里的值
然后进行了判断,根据之前我们分析的跳入左边就是报错,而test al,al会影响jnz的跳转,那意思就是说Sub_4D8720这个函数至关重要



第一个powered by没有做运算
果然Sub_4D8720这个函数做了对我们的注册码进行了判断


返回值在v2,而v2的初始值给了零,当以上判断通过的时候就为1
如果我们输入的注册码,能绕过以上的条件,那就成功绕过
所以要分析这个判断
注册码必须是9位
注册码第1位跟第4位的和要大于8
注册码的第1、3、4位之和除以10的余数必须和注册码的第6位相等
注册码的第2位必须大于5
注册码的第5位必须小于3
以下的代码生成的注册码我们做一个测试



import random
def generate_registration_code():
while True:
# 随机生成9位注册码
code = [random.randint(0, 9) for _ in range(9)]
# 条件1: 第1位 + 第4位 > 8
if code[0] + code[3] <= 8:
continue
# 条件2: (第1位 + 第3位 + 第4位) % 10 == 第6位
if (code[0] + code[2] + code[3]) % 10 != code[5]:
continue
# 条件3: 第2位 > 5
if code[1] <= 5:
continue
# 条件4: 第5位 < 3
if code[4] >= 3:
continue
# 如果所有条件都符合,返回生成的注册码
return ''.join(map(str, code))
# 生成并输出符合条件的注册码
registration_code = generate_registration_code()
print("生成的注册码:", registration_code)
3. 实验小结
通过本次实验知道,破解软件方式的其中一种就是绕过条件判断,只要细心查找对比,就会发现一些不是很好的软件容易被破解的地方,其本质就是在汇编底层修改跳转语句或者判断标志,防止的方法就是开启不可修改的保护,或者来一些控制流平坦化的混淆机制
No responses yet