大家好,又见面了,我是你们的朋友全栈君。
一、前言
在使用Mac的过程中,经常会碰到一些软件,属于付费使用产品。那么处于好奇或者自学的目的,能不能绕过这个限制呢。今天简单的分享下我激活成功教程的几款软件当中的一款,具体是什么软件就不说了,主要是提供下激活成功教程的思路。由于不能供发图,所以这里简单介绍下这款软件。这款软件是App Store上的一款磁盘清理软件,扫描是免费的。扫描到数据之后,点击清理按钮时候会检查是否注册。如果注册了,直接进入清理程序,否则弹出注册页面。
二、环境准备
我这里使用的是Hopper + lldb来进行调试。Hopper是一款反汇编二进制的软件,可以将一个MachO(苹果的可执行文件)文件反汇编成汇编代码,查看程序的一些基本逻辑。而lldb是系统提供的一款调试软件,可以对程序下断点、单步调试等操作。如何不太熟悉这两款这两款软件如何使用,可以百度学习下,这里先不介绍。
三、代码定位
先下载指定App到本地,运行软件,观察软件的特征。打开Hopper,将App的Macho文件拖入进去,即可对相应app进行反汇编。一般来说,类名和方法名是没有被混淆的(当然也有通过加壳进行混淆的,相应可以进行脱壳),我们大致可以通过类名和方法名来进行定位相应代码。这里是我定位到相应的部分汇编代码
-[XXXXXXXXViewController cleanPressed:]:
00000001000275ee lea rdx, qword [cfstring_Clean_Clicked]
00000001000275f5 lea rcx, qword [cfstring_]
00000001000275fc mov rdi, r14
00000001000275ff mov r8, rcx
0000000100027602 mov r9, rbx
0000000100027605 call r13
0000000100027608 mov r15, qword [_objc_release_1000fb5b0]
000000010002760f mov rdi, rbx
0000000100027612 call r15
0000000100027615 mov rdi, r14
0000000100027618 call r15
000000010002761b mov rdi, qword
0000000100027622 add rdi, r12
0000000100027625 call imp___stubs__objc_loadWeakRetained
000000010002762a mov rbx, rax
000000010002762d mov rsi, qword [0x100138678]
0000000100027634 mov rdi, rbx
0000000100027637 call r13
000000010002763a mov r14, rax
000000010002763d mov rdi, rbx
0000000100027640 call r15
0000000100027643 test r14, r14
0000000100027646 je loc_10002768a
从方法名可以看出是清理按钮按下方法,从倒数第二行可以看出是进行对比,如果注册直接进行清理,不注册则弹出注册界面。这里是我大致初步的判断,如何判断我是否找对了呢?这时候就需要lldb来进行挂载调试了。
四、lldb挂载调试
lldb如果没有接触过,可以百度进行学习,这里受篇幅限制,不作介绍。对于lldb来说,最重要的就是下断点,而下断点要么是符号,要么就是地址。上面Hopper反汇编出来可以看到,已经具备了地址,那么是不是可以使用这个地址进行下断点呢?这里就需要说下苹果的ASLR机制。
在计算机科学中,地址空间配置随机加载(英语:Address space layout randomization,缩写ASLR,又称地址空间配置随机化、地址空间布局随机化)是一种防范内存损坏漏洞被利用的计算机安全技术。ASLR通过随机放置进程关键数据区域的地址空间来防止攻击者能可靠地跳转到内存的特定位置来利用函数。现代操作系统一般都加设这一机制,以防范恶意程序对已知地址进行Return-to-libc攻击。
所以每一次程序被加载进内存,内存起始地址都会随机,获取到这个随机地址加上Hopper里的地址就是真实的地址。那么如何拿到这个地址呢?
打开命令行终端,执行命令lldb -n (appname) -w,然后点击运行相应程序。当程序启动后,发现被挂起,终端lldb进入可执行命令模式,紧接着输入以下命令
im list -o -f ,得到以下输出内容
[ 0] 0x00000000024ed000 XXXX.app/Contents/MacOS/XXXX
[ 1] 0x000000010922a000 /usr/lib/dyld
[ 2] 0x0000000102652000 AFNetworking
[ 3] 0x00000001026c6000 CargoBay
[ 4] 0x00000001026eb000 RNCryptor_objc
所以可以看到实际的地址应该是0x0000000100027640+0x00000000024ed000
,接下来对该地址进行下断点
br set -a "0x0000000100027640+0x00000000024ed000"
,下断点成功,点击软件的清理按钮,发现该地方只是弹出是否选择文件的判断。继续看cleanPressed方法汇编的代码,发现有如下汇编代码
-> 0x102514674 <+246>: testb %al, %al
0x102514676 <+248>: je 0x102514771
0x10251467c <+254>: movq %rbx, %rdi
0x10251467f <+257>: callq *0xd3f2b(%rip)
testb指令的含义是将两个寄存器的值进行与操作,如果为1,则je条件成立,如果为0,je条件为假。那么我们可以通过register read/x al
来读取寄存器的值,打印的值为0x0,那么我们只要将al寄存器的值设置为0x1即可绕过该操作。通过命令register write al 0x1
将寄存器的值进行改写,之后输入命令c来进行继续运行,发现正常进行了清理,跳过了注册的步骤,成功绕过注册的限制。
五、总结
由于不能写出相应app的名称,导致整篇文章看起来比较难以理解。本篇只是从逻辑上进行讲解,大概的一个流程。本篇虽然实现了绕过注册逻辑,但是这样手动一步一步比较麻烦。好在lldb提供了python脚本自动化的能力,那么下一篇文章我们讲解如何通过python来自动化实现产品注册绕过的实现。
~ 欢迎大家加入我们的知识星球,一起交流学习 ~
微信扫码加入:
点击链接加入:https://t.zsxq.com/n27YzRV
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/148377.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...