:004025E0 8975F8 mov dword ptr [ebp-08], esi假设我们通过跟踪分析已经知道Call dword ptr [0043E414]是注册码的验证子程序,而jne 004025F8则根据验证程序返回值AX判断注册信息是否正确
:004025E3 897DFC mov dword ptr [ebp-04], edi <-- 假设这里往前压栈注册验证参数
:004025E6 FF1514E44300 Call dword ptr [0043E414] <-- 假设个CALL是注册码验证的关键处
:004025EC 6685C0 test ax, ax <-- 测试验证程序返回值AX
:004025EF 7507 jne 004025F8 <-- 判断注册码是否正确
:004025F1 68D8184400 push 004418D8
:004025F6 EB2B jmp 00402623
:004025E0 8975F8 mov dword ptr [ebp-08], esib.我们假设当返回值 AX=0 时表示注册码不正确,那么我们必须让程序走到jne 004025F8去而不论验证子程序返回值AX为多少,这样的话我们可以有两种方法:一是将jne 004025F8改成je 004025F8,由于jne的机器码是75,je的机器码是74,所以只要将:004025EF处的7507改成7407即可;另外一种方法是将jne 004025F8改成jmp 004025F8,由于jne的机器码是75,它所对应的jmp指令的机器码是EB,所以只要将:004025EF处的7507改成EB07即可,将jne改成je的出发点是基于我们输入的注册信息肯定是不正确的,所以只需要将程序原来的注册检验逻辑判断取反即可,而将jne改成jmp则是百分之百的可靠,因为这样修改之后程序已经失去了判断的功能,无论输入正确或是错误的注册信息其结果都是一样,即按照我们希望的方向运行,这两种的修改方式结果分别如下所示:
:004025E3 897DFC mov dword ptr [ebp-04], edi
:004025E6 FF1514E44300 Call dword ptr [0043E414]
:004025EC 6685C0 test ax, ax <-- 返回值 AX = 0 表示注册信息正确,所以必须让程序走到push 004418D8
:004025EF 90 nop <-- 用两个nop代替jne 004025F8
:004025F0 90 nop <-- 现在程序的注册信息判断已经失效,我们肯定能走到“成功之处”了!^_^
:004025F1 68D8184400 push 004418D8
:004025F6 EB2B jmp 00402623
:004025E0 8975F8 mov dword ptr [ebp-08], esi
:004025E3 897DFC mov dword ptr [ebp-04], edi
:004025E6 FF1514E44300 Call dword ptr [0043E414]
:004025EC 6685C0 test ax, ax
:004025EF 7407 je 004025F8 <-- 将jne 004025F8改成je 004025F8,注意机器码的前后变化
:004025F1 68D8184400 push 004418D8
:004025F6 EB2B jmp 00402623
:004025E0 8975F8 mov dword ptr [ebp-08], esi4、知道了要如何修改程序代码,接下来就要开始动手用HIEW来修改程序了:首先运行HIEW,打开需要修改的程序文件,然后按F4,选择“DECODE”来到反汇编模式,这样我们就可以看到程序的汇编代码了;
:004025E3 897DFC mov dword ptr [ebp-04], edi
:004025E6 FF1514E44300 Call dword ptr [0043E414]
:004025EC 6685C0 test ax, ax
:004025EF EB07 jmp 004025F8 <-- 将jne 004025F8改成jmp 004025F8,注意机器码的前后变化
:004025F1 68D8184400 push 004418D8
:004025F6 EB2B jmp 00402623
:004025E0 8975F8 mov dword ptr [ebp-08], esi3、分析修改方法:假设当返回值 AX=0 时表示注册码不正确,而我们希望将jne 004025F8改成jmp 004025F8,入如下所示:
:004025E3 897DFC mov dword ptr [ebp-04], edi <-- 假设这里往前压栈注册验证参数
:004025E6 FF1514E44300 Call dword ptr [0043E414] <-- 假设个CALL是注册码验证的关键处
:004025EC 6685C0 test ax, ax <-- 测试验证程序返回值AX
:004025EF 7507 jne 004025F8 <-- 判断注册码是否正确
:004025F1 68D8184400 push 004418D8
:004025F6 EB2B jmp 00402623
:004025E0 8975F8 mov dword ptr [ebp-08], esi4、对原程序的分析跟踪及解决方法都已确定,那么我们就可以开始编辑相应的脚本命令了,下面以R!SC's Process Patcher内存补丁软件为例,讲解它的脚本命令格式及使用方法:
:004025E3 897DFC mov dword ptr [ebp-04], edi
:004025E6 FF1514E44300 Call dword ptr [0043E414]
:004025EC 6685C0 test ax, ax
:004025EF EB07 jmp 004025F8 <-- 将jne 004025F8改成jmp 004025F8,注意机器码的前后变化
:004025F1 68D8184400 push 004418D8
:004025F6 EB2B jmp 00402623
R!SC's Process Patcher 脚本命令 |
---|
";" 分号 ;所在行后面的内容为脚本注释 ,不会被解释执行。 "T=" 对内存的检测次数, T=1000: 表示对内存检测 1000 次,在放弃之前会提示应用程序不是正确的版本。 这个参数可以不用设置,脚本中的默认值为 T=8000: 'F=' 需要打补丁的应用程序文件名 。 'O=' 生成的补丁程序文件名 , 如果没有指定,其默认文件名为 O=LOADER.EXE: 'P=' 补丁信息 , 格式:代码地址 / 原代码 / 补丁码 : 'R:' 直到这条命令之前的补丁全部都做好之后再继续下面的命令。 '$' 脚本命令文件结束标志 。 ':' 每一行脚本命令的结束标记 注意事项:只有当内存代码地址和机器码同时匹配的条件下才会打补丁;脚本文件命令不能大于40kb, 补丁码最多为75Eh个字节,打补丁的应用程序文件名必须小于30个字符。 |
text.exe 对应的脚本命令文件script.rpp的内容 |
---|
T=8000: 对内存的检测次数采用默认值 8000 F=text.exe: 需要打补丁的应用程序文件名为 text.exe O=test_load.exe: 生成的补丁程序文件名为 test_load.exe P=004025EF/75,EB: 补丁信息 , 将 jne ???????? 改成 jmp ???????? $ 脚本文件到此结束 |
提示:在Softice中如何查看指令机器码? -- 方法:使用 CODE ON / CODE OFF 命令来切换机器码的显示状态
关于暴力破解中所用到的汇编指令机器码知识:
我们在暴力破解中修改的对象基本上都是条件跳转指令(如 JZ、JNZ、JG。。。等等)和无条件跳转指令JMP,对于其它地方的修改多数都是改成NOP,所以这里主要讲一下跳转指令对应的机器码。在80X86体系的CPU中,成对条件跳转指令(指的是判断条件刚好相反)如下所示:JZ <--> JNZ80X86体系CPU中的条件跳转指令分为单字节和双字节指令两种,分别对应8BIT和16BIT跳转;而与条件跳转指令相匹配的无条件跳转指令JMP也有单字节和双字节指令两种,分别对应8BIT和16BIT跳转,当我们需要将条件跳转指令改成相应的无条件跳转指令时,因为要保持修改前后机器码长度的一致性,所以要注意被修改的条件跳转指令是单字节还是双字节指令,从而用相应字节的JMP机器码来代替,下表列出了暴力破解中条件跳转指令的修改方法:
JE <--> JNE
JB(JNAE) <--> JNB(JAE)
JC <--> JNC
JA(JNBE) <--> JNA(JBE)
JG(JNLE) <--> JNG(JLE)
JL(JNGE) <--> JNL(JGE)
JS <--> JNS
JP(JPE) <--> JNP(JPO)
JO <--> JNO
8位跳转指令修改方法 | ||||||
汇编指令 | 机器码 | 相反汇编指令 | 机器码 | 测试标志位 | 修改后的机器码 | 对应的汇编指令 |
JZ ???????? JE ???????? | 74 XX | JNZ ???????? JNE ???????? | 75 XX | Z = 0 或 1 | EB XX | JMP ???????? |
JB ???????? JNAE ???????? | 72 XX | JNB ???????? JAE ???????? | 73 XX | C = 0 或 1 | ||
JC ???????? | 72 XX | JNC ???????? | 73 XX | C = 0 或 1 | ||
JA ???????? JNBE ???????? | 77 XX | JNA ???????? JBE ???????? | 76 XX | Z OR C = 0 或 1 | ||
JG ???????? JNLE ???????? | 7F XX | JNG ???????? JLE ???????? | 7E XX | (S XOR O) OR Z = 0 或 1 | ||
JL ???????? JNGE ???????? | 7C XX | JNL ???????? JGE ???????? | 7D XX | S XOR O = 0 或 1 | ||
JS ???????? | 78 XX | JNS ???????? | 79 XX | S = 0 或 1 | ||
JP ???????? JPE ???????? | 7A XX | JNP ???????? JPO ???????? | 7B XX | P = 0 或 1 | ||
JO ???????? | 70 XX | JNO ???????? | 71 XX | O = 0 或 1 |
16位跳转指令修改方法 | ||||||
汇编指令 | 机器码 | 相反汇编指令 | 机器码 | 测试标志位 | 修改后的机器码 | 对应的汇编指令 |
JZ ???????? JE ???????? | 0F 84 XX | JNZ ???????? JNE ???????? | 0F 85 XX | Z = 0 或 1 | 90 EB XX | NOP JMP ???????? |
JB ???????? JNAE ???????? | 0F 82 XX | JNB ???????? JAE ???????? | 0F 83 XX | C = 0 或 1 | ||
JC ???????? | 0F 82 XX | JNC ???????? | 0F 83 XX | C = 0 或 1 | ||
JA ???????? JNBE ???????? | 0F 87 XX | JNA ???????? JBE ???????? | 0F 86 XX | Z OR C = 0 或 1 | ||
JG ???????? JNLE ???????? | 0F 8F XX | JNG ???????? JLE ???????? | 0F 8E XX | (S XOR O) OR Z = 0 或 1 | ||
JL ???????? JNGE ???????? | 0F 8C XX | JNL ???????? JGE ???????? | 0F 8D XX | S XOR O = 0 或 1 | ||
JS ???????? | 0F 88 XX | JNS ???????? | 0F 89 XX | S = 0 或 1 | ||
JP ???????? JPE ???????? | 0F 8A XX | JNP ???????? JPO ???????? | 0F 8B XX | P = 0 或 1 | ||
JO ???????? | 0F 80 XX | JNO ???????? | 0F 81 XX | O = 0 或 1 |
关于跟踪程序时如何在Softice中动态改变条件跳转指令的执行方向:
其实这个问题我已经在“破解常见问题/技巧”中仔细讲过,可还是老有人来问,现在再次将相应的Softice列出来!跳转指令 | 测试标志 | Softice命令 |
JZ、JNZ、JE、JNE | Z=0或1 | R FL=Z |
JB、JNB、JAE、JNAE、JC、JNC | C=0或1 | R FL=C |
JA、JNBE | Z OR C = 0 | R FL=+Z 或 R FL=+C 或 R FL=+Z+C |
JNA、JBE | Z OR C = 1 | R FL=-Z-C |
JG、JNLE | (S XOR O) OR Z = 0 | R FL=+Z 或 R FL=+S-O 或 R FL=-S+O 或 R FL=+S-O+Z 或 R FL=-S+-O+Z |
JNG、JLE | (S XOR O) OR Z = 1 | R FL=+S+O-Z 或 R FL=-S-O-Z |
JGE、JNL | S XOR O = 0 | R FL=+S-O 或 R FL=-S+O |
JL、JNGE | S XOR O = 1 | R FL=+S+O 或 R FL=-S-O |
JS、JNS | S=0或1 | R FL=S |
JO、JNO | O=0或1 | R FL=O |
JP、JPE、JNP、JPO | P=0或1 | R FL=P |
相关视频
相关阅读 Mac访问Windows共享文件夹Windows 7正版系统验证方法windows 8.1系统版本号查看方法Windows 8.1系统电话激活时无法输入微软返回代码解决方法Windows 8如何调整屏幕分辨率windows8.1磁盘占用100%解决方法Mac双系统如何删除Boot Camp安装的Windows分区Apple教你如何在Mac 上运行 Windows
热门文章 去除winrar注册框方法
最新文章
比特币病毒怎么破解 比去除winrar注册框方法
华为无线路由器HG522-C破解教程(附超级密码JEB格式文件京东电子书下载和阅读限制破解教UltraISO注册码全集(最新)通过Access破解MSSQL获得数据
人气排行 华为无线路由器HG522-C破解教程(附超级密码JEB格式文件京东电子书下载和阅读限制破解教UltraISO注册码全集(最新)qq相册密码破解方法去除winrar注册框方法(适应任何版本)怎么用手机破解收费游戏华为无线猫HG522破解如何给软件脱壳基础教程
查看所有0条评论>>