概述

本文以Mac为例,Linux和Mac基本是一样的。windows系统也有想对应的软件,整体思路也基本是一致的。

在我们使用的收费软件中一般有两种形式:

  • 输入注册码
  • 购买VIP

      学习过程序的人都知道,这些实现的本质都是一些if … else的判断。所以这两种软件的破解思路是一样的。
例如输入注册码的程序判断思路:

1
2
3
4
5
6
if [用户已经注册]
可以正常使用软件
ELSE if [试用期不到30天]
可以正常使用软件
ELSE
弹框提示不能使用软件

同理购买VIP的软件的程序判断思路如下:

1
2
3
4
if[是VIP用户]
享受VIP的待遇
ELSE
享受普通用户的待遇

      看到上面的执行过程,可以发现如果我们调换 if … else … 的处理过程。其实我们就达到了破解软件的效果。所以我们的破解思路从总体上可以分为以下几步:

1
2
3
4
5
1 根据可执行的二进制文件,找到上面的 if ... else ... 的代码的头文件 (这个可以使用class dump工具帮助我们分析)
2 利用反编译工具找到我们代码处理的机器指令(可以通过 Hopper Disassembler工具实现)
3 根据我们定位的机器指令,找到指令的二进制地址(可以通过gdb调试工具实现)
4 修改二进制代码,将相等改为不想等,即eq(74)指令改为nep(75)指令(可以通过Hex Fiend实现)
5 如果是Mac系统,需要为软件生成签名认证。

完成整个破解过程需要安装以下软件

  • class dump 分析找到我们要修改的类
  • Hopper Disassembler 定位机器指令
  • gdb 定位机器指令以及二进制地址
  • Hex Fiend 修改二进制代码

破解过程

列出详细过程以及思路。怎么分析的都不在多说了。主要都是围绕概述的思路进行的。

class dump 找到类文件

      可以通过class dump -f 查找包含关键字的方法名称。这些关键字一般在弹出的输入注册码的页面上的单词,配合我们的经验所得。常用的关键字有 licenseregistervalidatevipisVIP。。。
我们执行

1
class-dump -f license /Applications/Paw.app/Contents/MacOS/Paw

      执行结果如下:

分析可以发现 LMWelcomeViewController这个类是控制弹出注册框的类。我们可以继续执行

1
class-dump -f showWelcome /Applications/Paw.app/Contents/MacOS/Paw

      结果如下:

看到这个输出,基本可以确定 LMWelcomeViewController 就是我们要找的类。

Hopper Disassembler 找到机器指令

      使用 Hopper Disassembler 软件打开 /Applications/Paw.app/Contents/MacOS/Paw 二进制执行程序。如果软件无法直接选择,可以建立一个软连到目标文件。
Hopper Disassembler 软件的左上边的lables下面搜索 “showWelcomeWindow”,可以发现五个类,通过分析,我们要找的方法是: LMWelcomeViewController.showWelcomeWindows。所以打开方法,最后页面显示如下:

      通过上面的图片可以看到LMWelcomeViewController.showWelcomeWindows的两条指令jeret。je执行表示判断两条指令是否相等,ret指令表示返回执行。所以可以猜想这段代码的逻辑是:

1
2
3
if (XXX).equals(XXX)
弹框
else return;

可以通过Hopper Disassembler生成伪代码看看:

      想法基本正确。至此,我们已经找到了要修改的指令代码的位置。接下来的问题就是计算出指令代码的二进制地址,然后替换二进制地址。

gdb 计算eq指令的二进制地址

通过上图可以看到 eq 指令的虚拟内存地址是 0x000000010011a7fe现在我们要做的就是利用gdb调试工具根据eq指令的虚拟内存地址,逆向第从内存中找到eq指令的二进制码。首先在命令行执行

1
gdb /Applications/Paw.app/Contents/MacOS/Paw

然后执行

1
x/x 0x000000010011a7fe

得到结果如下:

从结果可以看到0x55c30174就是二进制指令的十六进制表示。
注意:
Mac使用的Intel处理器,是以小端序存储的,而硬盘上的二进制码是以大端序存储的。所以,这里需要把 “0x55c30174” 改为对应的大端序 “0x7401c355” 然后在二进制文件中搜索。
Hex Fiend打开/Applications/Paw.app/Contents/MacOS/Paw 文件,然后按下搜索。如下:

可以发现这个指令出现了很多次,不能直接替换,这也很好理解,代码中判断相等的地方毕竟很多。那么我们可以在对查询一个字节,这样两个字节的重复率应该很低了。所以我们找到eq指令的后继指令ret,继续计算他的二进制地址如下:

得到 0x894855c3 将其转换为大端序为:0xc3554889可以看到eq指令的后四位和ret指令的前四位完全相同。原因是不同指令的二进制长度不同,而gdb的 x/x 命令读取的指令的长度总是相同。所以这里出现了重叠。最后可以确定我们要找到的指令是0x7401c3554889
然后我们再次打开Hex Fiend 查询 “7401c3554889”发现这次结果只有一个(如果有多个,就在查询一个指令以此类推)。
然后我们执行替换工作:

其实我们只是将74(eq)命令改成了75(nep)命令,也就是调换了处理逻辑。如概述所说。

codesign生成签名

上面过程已经完成了整个破解过程,还是很简单的。但是现在打开软件还是不能使用,会报错。原因是Mac系统对软件进行了MD5校验,如果发现软件二进制被修改了,就会报错退出,这是一种自我的安全保护。但是如果软件是被认证的,则可以执行所以我们需要为软件生成Mac系统的签名。过程如下:
1 打开Mac的KeyChainAccess软件,新建一个认证证书

2 取一个名字认证类型选择”code sign” 勾选下面的复选框

3 验证信息中编码是一串数字,要求不能和其他证书的编码重复即可。以及证书的有效期天数

4 有一个地方要选择“login”忘记截图了。注意一下是个下拉框
5 剩下的所有信息都走默认,直到完成
6 完成之后如下。注意类型是login,上面没有截图,如果不是删除重来一遍

7 选择刚刚创建的证书,右击点击”get info “

8 选择 “trust” —> “always trust”

为软件签名

打开命令行执行:

1
sudo codesign -f -s gcl_paw_keychain_access /Applications/Paw.app/Contents/MacOS/Paw

提示如下:

1
/Applications/Paw.app/Contents/MacOS/Paw: replacing existing signature

现在软件就可以随便使用啦啦啦啦啦啦啦啦啦啦!!!!

再次重申:仅供学习交流,请支持正版