我之前破解过Visual C++ 编程全能词典,之前破解的是注册码部分,帖子连接如下:
使用的朋友会发现,其中文本资料的内容不能复制,复制会出现如下提示:
这便是切入点 首先用OD 载入,不知道为什么OD 在Win7 64 位旗舰版不能正确加载这个软件,加载到20% 多就卡死,于是我用VM 虚拟机挂上了XP 破解的,破解后的程序经测试在XP 和Win7 64 位旗舰版均可正常使用
OD载入后界面如下: 点击运行启动程序,程序启动后随便选择一篇文章,如下所示 这时打开OD 对MessageBoxA MessageBoxExA MessageBoxIndirectA MessageBoxExWMessageBoxW MessageBoxIndirectW MessageBoxW 以及rtcMsgBox设置断点
然后随意选定一段内容,会发现OD暂停在77D3A082,可见这是系统领空,并且停在了MessageBoxIndirectA API处 按Ctrl+F9执行到返回,程序会弹出刚才的对话框,按一下确定,返回到OD,然后按一次F8,会到达733FF6B2 此处依旧是系统领空,因此按Ctrl+F9然后按一次F8 返回到733FF52E处,依旧是系统领空,重复操作 返回到733FF829处,系统领空,继续重复操作 返回到733F3BF0处,系统领空,继续重复操作 返回到7346D07A处,系统领空,继续重复操作 返回到009185FD处,终于到达用户领空了 我们看上一行即009185FD处,会发现这就是刚才弹出对话框的地方即rtcMsgBox,不知道为何设置的VB API未被触发
继续往上翻,会看到大量的VB API调用,现在我们先把程序运行起来,然后不停地从刚才那一行向上设置断点,你会发现当设置到009181FC处时程序自动暂停运行,显示跳转已实现 我们有必要对这里产生怀疑,于是我们关闭这里的断点,由于在这里设置断点使得我们无法操作,根据程序裸机,我们在它的下一行即00918202处设置断点,然后运行,打开软件,选定一段内容,你会发现00918202处断点被触发 这说明009181FC处的跳转不成立,这说明了什么? 这说明,009181FC处便是我们要找的关键跳转,为了防止地址在运行时自己改变或者其它不可预料的错误,我们这次给出一种新的修改方法,向上看一行即009181FA处,那里有一句test edx,edx,在这里我们介绍一下test和cmp指令,普及一下汇编知识,以下内容摘自网络,已经过我的大脑审核>_< --------------------------------------------------------网络摘自开始---------------------------------------------------- 首先看看:状态寄存器(即标志寄存器) PSW(Program Flag)程序状态字(即标志)寄存器,是一个16位寄存器,由条件码标志(flag)和控制标志构成, 如下所示: 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 OF DF IF TF SF ZF AF PF CF 条件码: ①OF(Overflow Flag)溢出标志,溢出时为1,否则置0.标明一个溢出了的计算,如:结构和目标不匹配. ②SF(Sign Flag)符号标志,结果为负时置1,否则置0. ③ZF(Zero Flag)零标志,运算结果为0时置1,否则置0. ④CF(Carry Flag)进位标志,进位时置1,否则置0.注意:Carry标志中存放计算后最右的位. ⑤AF(Auxiliary carry Flag)辅助进位标志,记录运算时第3位(半个字节)产生的进位置。 有进位时1,否则置0. ⑥PF(Parity Flag)奇偶标志.结果操作数中1的个数为偶数时置1,否则置0. 控制标志位: ⑦DF(Direction Flag)方向标志,在串处理指令中控制信息的方向。 ⑧IF(Interrupt Flag)中断标志。 ⑨TF(Trap Flag)陷井标志。 为举例方便说一下jnz和jz 测试条件 JZ ZF=1 JNZ ZF=0 即Jz=jump if zero (结果为0则设置ZF零标志为1,跳转) Jnz=jump if not zero 好,接着来看test和cmp ******************************************************************************* test属于逻辑运算指令 功能: 执行BIT与BIT之间的逻辑运算 测试(两操作数作与运算,仅修改标志位,不回送结果). Test对两个参数(目标,源)执行AND逻辑操作,并根据结果设置标志寄存器,结果本身不会保存。TESTAX,BX 与 AND AX,BX 命令有相同效果 语法: TEST r/m,r/m/data 影响标志: C,O,P,Z,S(其中C与O两个标志会被设为0) 运用举例: 1.Test用来测试一个位,例如寄存器: test eax, 100b; b后缀意为二进制 jnz ******; 如果eax右数第三个位为1,jnz将会跳转 我是这样想的,jnz跳转的条件是ZF=0,ZF=0意味着ZF(零标志)没被置位,即逻辑与结果为1. 2.Test的一个非常普遍的用法是用来测试一方寄存器是否为空: test ecx, ecx jz somewhere 如果ecx为零,设置ZF零标志为1,Jz跳转 ******************************************************************************* CMP属于算术运算指令 功能: 比较两个值(寄存器,内存,直接数值) 语法: CMP r/m,r/m/data 标志位: C,P,A,Z,O CMP比较.(两操作数作减法,仅修改标志位,不回送结果). cmp实际上是只设置标志不保存结构的减法,并设置Z-flag(零标志). 零标志很像carry,也是内部标志寄存器的一位. 例如: Cmp eax, 2; 如果eax-2=0即eax=2就设置零标志为1 Jz ****; 如果设置了零标志就跳转 ******************************************************************************* 我得出的结论 test逻辑与运算结果为零,就把ZF(零标志)置1; cmp 算术减法运算结果为零,就把ZF(零标志)置1. --------------------------------------------------------网络摘自结束----------------------------------------------------
根据上面的说明,我们知道,je条件成立与否也就是edx是否为0,若edx为0,则je成立,根据这一点,你会发现这条指令是两个字节85D2,我们可以修改成cmp edx,edx edx-edx在任何情况下都等于0,这一点大家都能理解吧,就像a-a=0 a为任意数一样,此时je就会永恒成立,相当于无条件跳转,同样,cmp edx,edx也是两个字节3BD2 我们右键选择修改的这一行,选择“复制到可执行文件->选择” 弹出这样的窗口 右键这一行选择保存文件,保存即可,我们来看一下最终的效果,以下在win7环境下测试
首先我们打开它 同样打开一篇文章,选定一段文本 你会发现成功选定,然后复制,你会发现按右键不会弹出菜单,没关系,按Ctrl+C复制,我们打开WinWord
我们看到了什么? 由这次破解我得到了一些经验,首先是对于Ctrl+F9和F8键跳出系统领空进入程序领空的经验,以及破解VB程序的经验,并且对VB的消息循环和事件机制在汇编的体现有了一定的了解,感谢大家的支持,求管理加精,文件在附件中,四年了,现在破解技术越来越好了,这次破解只用了一个小时,以下是我本次破解时做的记录,有正确的和错误的,大家可以参考一下: --------------------------------------------------------笔记开始-------------------------------------------------------- 733FF520 信息框函数 009185F7 rtcMsgBox 防复制调试 009183EE 防复制决策 00916C60 检测事件 009180D8 009181FC 防复制事件决策点 将其上的test edx,edx改成cmp edx,edx即可
--------------------------------------------------------笔记结束--------------------------------------------------------
|