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. 实验小结

  通过本次实验知道,破解软件方式的其中一种就是绕过条件判断,只要细心查找对比,就会发现一些不是很好的软件容易被破解的地方,其本质就是在汇编底层修改跳转语句或者判断标志,防止的方法就是开启不可修改的保护,或者来一些控制流平坦化的混淆机制

  

Categories:

Tags:

No responses yet

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注