本文为原创作品,转载请注明出处,作者:Chris.xisaer E-mail:69920579@qq.com
QQ群3244694
补丁程序下载地址:https://download.csdn.net/download/xsdn123/71939906
https://github.com/hansiyuan1983/UltraEdit/tree/%E7%A0%B4%E8%A7%A3%E8%A1%A5%E4%B8%81
1.本文所涉及的相关技术只限于交流和学习使用,请勿将其用于商业活动。对此产生的一切后果本人概不负责。
2.如果本文涉及到侵犯著作权的问题,请及时联系,我将下架文章。
3.在此鄙视垃圾CODER诞生地CSDN。竟然不允许发破解技术相关的文章。技术本无罪,人性是贪婪。(还有假冒破解技术,搞收费的某论坛)。
现在我准备为大家带来UltraEdit64破解的一些技术分享。目前的最新版本 Version 28.20.0.92,这是一个64位的文本处理软件。可能老家伙们都知道这个编辑软件。非常的NICE,尤其是他的二进制查看功能。对于程序员来说很好很强大。但是不知道从什么时候开始这个软件收费了。。希望大家都自觉购买正版软件。本文的目的不是提供给大家使用破解版。而是分享一些软件的漏洞,以促使软件开发者更注意软件的安全使用。
首先我们来看一下试用期到期时候的情况!
这里还是提醒大家请购买正版软件,以鼓励软件行业的良性发展。
先说明几点情况:1 此软件没有加壳,这个结论是经过验证的。
2 此软件是用MFC编写。请大家先补习一下MFC的基本知识。
我们打开反编译神器:idapro64,为什么用64??因为我们要破解的UE64是64位的软件,SO...
来一张图吧
对于新手可能有点懵逼,老手掠过,我先讲解一下IDA的基本情况。左边的窗口是函数窗口,右边的窗口是程序代码窗口。下面的窗口是输出窗口,上面还有很多标签页。我们关注的是import ,struct,还有pseudocodeXXX窗口。
IDA的用法如果详细些会成为一本书,确实有一本IDA使用说明的书。目前已经出了第二版了。我这里就不赘述了,有兴趣的同学可以去看看。非常不错。不仅讲IDA的使用,还有一些反编译的知识。
可能看到这篇文章的各位水平不一样。我这里只给新手讲解,大牛可以绕道。刚刚接触破解的同学可能拿到一个程序不知道从何下手。我们该怎么找到程序的漏洞?(这里我用漏洞其实不合适,但是没办法。等你们写文章的时候就知道我为什么用漏洞,而不是线索了。)。
开头的图片大家都看了,是试用到期后弹出模态对话框。阻止任何操作,关闭对话框后程序关闭。那么我们首先判断一下程序虽然是试用版,但是其实功能和正式版是一样的,唯一区别就是多了试用倒计时。那么我们的思路就有了。1.干掉这个对话框。2点击输入许可证密钥。通过模拟验证程序完成注册。3,通过修改验证程序逻辑达到欺骗源程序验证机制的方式关闭对话框。当然还有其他的一些方法我这里就不一一说明了。
不过我可以告诉大家干掉这个对话框,虽然可以但是实现起来非常麻烦,比第3步还要麻烦。因为开头我说过这个程序是MFC写的。作者创建的对话框时封装在自己类中的由自己的类实现了个对话框初始化函数。所以你如果想只干掉对话框会有一些数据无法传递给源程序,这样程序会访问非法内存地址,导致无法正常运行。
如果你选择第二种方法我只能说你有以一颗强大的心,而且是真心想学习反汇编技术,这个程序的许可证是通过哈希算法得到的 无非就是机器码。磁盘编号 ,电子邮件等等信息混合成一个哈希值。然后验证。而且破解这个程序的也肯定不是我一个人。可能有大牛已经写出来了。我这里就不过多赘述(因为真的很复杂)
我们试试第三种方法。修改程序验证逻辑。首先我们找到切入点,搜索一下字符串吧!不是试用版吗 还是根据地区自动选择语言的。想变成英文版只能改系统区域。麻烦。我就猜测一下吧。英文的试用 应该是trial. 先打开另一个工具X64DBG!!!
搜索所有模块字符串。我们先找一下包含trial的相关信息!可能要等一会,程序代码量还是挺大的!
并没有搜到想要的信息。明显和提示的对不上。想从这里找对话框的一些地址是没戏了。回到IDApro,我们点击import选项卡:搜索CreateDialog关键字。我们能够发现
找到了一个创建对话框的函数。但是别高兴,这个并不是我们需要的函数。因为开头说过这是个MFC程序。所以我们应该能想到,作者写程序的时候不是用SDK中的函数写程序,而是用C++封装类后写程序。再结合MFC的相关知识。我们知道MFC中是有个对话框类的 CDialog.所以我们现在应该等待IDAPRO 这个强大的软件。然后再函数窗口搜索我们猜测的MFC类CDialog:
不出所料,我们找到了我们的线索。那不用说了只要是创建对话框。就一定会用到CDialog的构造函数。所以我们选择我们搜到的CDialog::CDialog(uint,CWnd*),这函数作为切入点。开始我们的找CALL之旅!
我们双击函数进入查看:
我们在函数名字上面右键查看交叉引用 看看一共有多少处调用了此函数,然后回溯出只有在关于我们需要的这个创建对话框函数。这里可能大家有些不明白。因为程序里面创建的对话框很多。当你点开交叉引用的时候你会发现可能成百上千的地方都调用了这个函数。而我们需要断下来的地方只有一个。而且通过上面函数的this指针我们能知道这是CDialog的成员函数。开头我还说过,作者写MFC程序肯定是以C++的习惯将其他类封装到自己的类中。所以我们要找的并不是MFC中的CDialog类中的构造函数。我们要找的是封装了这个函数的未命名函数。因为IDA是不能识别作者自己的类名和函数名的。所以这里我们只能通过回溯CALL 找出到底是哪个函数调用。
通过函数回溯我们最终确定调用这个CALL的地址是
.text:00000001403E5F90 call sub_140458A60
这个函数的主调函数非常的长 我决定只把名字给大家截图看一下,具体的还是大家自己浏览IDA吧因为 太长了。。。。
讲过漫长的初始化工作。。我们最终看到了这条汇编语句:
这个调用就是后续启动对话框的调用。我们想要干掉对话框就要做些动作不让这条语句执行。这里我就不详细写怎么写这些基础指令了。。很简单。但是我要告诉大家。如果你只是修改此处代码的话。那么程序将启动即崩溃。因为作者这里通过自己的函数传递了一些数据给后面的程序。如果得不到这些数据的初始化。那么程序将访问未知的内存空间。好,那我们就进去修改一下再出来。我们进入函数一直步进。直到来到这个地址:
这里有相当多的CALL ,而且每个CALL 之前都是比较后才调用的。在这里我先透露一点反汇编的结果。这些CALL 都是验证软件的各种状态的,有剩余日期,有激活状态,有版本信息。
我们在这里不要管先单步走一下程序。发现在进入call sub_14044B790这个CALL后会弹出对话框,实际上是函数经过对比版本后发现版本是试用版,然后对比激活信息发现并未激活。然后程序会通过调用自己封装的sub_140458A60 函数调用CDialog类的初始化函数生成对话框。流程就是这样的。
这里需要看动态调试的结果。当指令指针运行到00000001403E6B6E这条指令的时候 也就是test al,al. 我们观察寄存器窗口标志位ZF的值是1:
也就是说这条语句之后我们的 标志位不为0,跳转不会发生。会继续下面的验证工作,也就是剩余天数是否还有,当然TEST EAX,EAX 之后显然跳转也为发生就是我们要进入正常逻辑开启对话框了。好了至于应该修改哪里还是留给各位大神来完成吧。这里我就不说出答案了。(已经显而易见了)
我们来看一下破解后的程序:
如果你还有不明白的地方可以来群里找我交流一下技术。随时欢迎!!