逆向 - 用IDA破解adb时间限制
# 一、场景
之前公司有个 TV 盒子项目,需要使用厂商提供的 adb 工具才能连接设备进行调试,厂商为了安全,就在 adb 工具里加了过期时间限制,现在 adb 工具过期了,问厂商要新的,不给,让我自己改电脑时间(内心 os:这么容易就绕过去了,当初还为了安全加过期时间?纯属恶心人)。今天,领导说还要再调试查查项目 bug,我静心一想,每次都这样改时间也不是个事儿,求人不如求己,既然厂商不给力,那我就自己来动手破解吧~
# 二、实战
此次所需工具/条件如下:
- 神器 IDA
- 厂商 adb 包
- 懂一点 adb 命令
- 懂一点汇编知识
# 1、准备环境
【神器 IDA】,这个网上随便找一下就有了,这里不多赘述,有能力的请支持一下正版,良心软件。
【厂商 adb 包】是一个 zip 压缩包,解压后,只有 3 个文件:
- adb.exe
- AdbWinApi.dll
- AdbWinUsbApi.dll
在 windows 上,为了方便在 cmd 窗口使用 adb 命令,同时为了不与 AndroidStudio 自带的 adb 冲突,我将以上 3 个文件复制到 xxx\Android\Sdk\platform-tools
目录下进行覆盖。
注意:记得备份好该目录下原本的 3 个文件哦
# 2、寻找切入点
确定好 TV 盒子的 ip 地址,打开 cmd 窗口,使用 adb connect xxx
连接盒子:
C:\Users\GitLqr>adb connect 192.168.0.104
############
这里的 ############
是厂商 adb 在验证系统时间过期后输出的,当然,此时是无法成功连上 TV 盒子的。不过呢,这个字符串输出不就是一个很好的切入点吗!!接着我们用 IDA-32bit 打开 adb.exe
:
注意:使用 IDA 64bit 还是 32bit 是根据具体要逆向的程序而定的,这里的
adb.exe
是 32 位程序,所以用的是 IDA-32bit。
选中 adb.exe
文件后,点 "打开" ,之后一路点 "OK" 和 "Yes":
注意:IDA 在加载文件的时候,中途可能会提示一些 Warning 警告,不管它,继续点 "OK" 或 "Yes"。
当 IDA 加载成功后,就会看到如下界面了:
现在需要找到前面提到的 ############
字符串,通过 "View -> Open subviews ->Strings" 或 按"Shift+F12" 打开字符串窗口:
此时,在 IDA 的左侧会出现一个 Strings window (字符串窗口):
通过快捷键 "ctrl + f" 打开搜索栏,输入 ############
后回车:
双击该搜索结果条目,在 IDA 右侧的 IDA View-A 窗口会跳转到该字符串所在的地址处。至此,切入点的指令位置就已经找到了。
# 3、理清逻辑
在找到切入点之后,接下来就需要理清这段指令的触发时机了。注意看,在 004C58E9
地址处指令后面有一段蓝色字: ; DATA XREF: _adb_commandline+124B
,这段蓝色字的意思是该指令被 _adb_commandline+124B
处引用,正合我意,我们的目的就是要看,这个指令是在哪里被引用和触发的。
双击蓝色字之后,IDA View-A 窗口内容会发现变化,从 Text View 转变成了 Graph View,记住这个指令块的地址 loc_40C110
:
按下 ctrl 键,加鼠标滚轮,可以缩放这个 Graph View:
沿着 loc_40C110
指令块头上的绿色线条,可以找到解决该指令块的唯一源头:
从这个图可以知道,该 loc_40BC0B
指令块使用了 cmp
汇编指令,比较 2 个值的大小关系,汇编指令 jg
的意思是 有符号大于则跳转
,所以当比较结果大于 0 时,就会跳转到 loc_40C110
处,即输出 ############
字符串,否则,往右边红色线继续执行,进入正常的 adb 操作。至此,已经把切入点的触发逻辑搞清楚了。
# 3、逆向汇编代码
在弄清楚触发逻辑之后,就得考虑破解方案了,我自个想到的有如下几种破解思路:
- 修改获取到的时间值(难,要找到获取时间的地址处)
- 修改比较结果(难,我不知道 ebp、buf、1Fh 都是些啥)
- 修改比较逻辑(易,只需要把
jg
改成能执行到红色线的其它指令即可)
综上,选用方案 3,因为 JG
意为 有符号大于则跳转
,那么相反的,使用 为 0 则跳转
的 JZ
或 有符号小于则跳转
的 JL
,都可以达到执行红色线的目的,这里我选用 JZ
指令,这样,无论电脑时间如何修改,基本上都不可能触发。(但是,如果你硬是要抬杠,那就算你说的对)
汇编跳转指令说明:https://blog.csdn.net/wq57885/article/details/80700032 (opens new window)
接下来要真正开始修改指令码了,先把 Graph View 转成 Text View,右击指令块,点击 "Text view":
将光标移动到 jg
指令那行,即 0040BC12
:
注意:鼠标左击一下,确定你光标就是在那里。
通过 "Edit -> Patch program -> Assemble" 打开 Assemble instruction (汇编指令) 对话框:
直接把 jg
改成 jz
,然后,点击 "OK":
此时,你会发现,0040BC12
处的指令成功修改成功了,但还是会有个对话框出来问你,下一行 0x40BC18
处你要不要也改了,因为不需要修改,所以点击 "Cancel" 或 直接叉掉就行了:
搞定,至此,汇编指令修改成功。
# 4、导出成品
不要以为直接 ctrl + s
保存就可以了,到目前为止,我们在 IDA 里所做的一切,都没有修改到原 adb.exe
文件,因为这是一个由 IDA 对原程序加载解析后得到的一个 IDA 工程,我们修改的也只是这个 IDA 工程里的代码,所以,我们还需要把工程进行导出,不过,IDA 很 dio,通过 "Edit -> Patch program -> Apply patches to input file...",可以把修改过的汇编码直接应用到原文件上:
这里还可以指定应用的地址范围,不用管,直接点 "OK" 即可:
可能会遇到 "Permission denied" 警告,这是因为 adb 进程正在运行中,只需要把 adb 进程 kill 掉,再重复上述操作即可:
注意:除了用 windows 自带的任务管理器,还可以使用 adb 命令
adb kill-server
来杀掉 adb 进程哦。
应用成功后,再来执行一次 adb 连接命令:
C:\Users\GitLqr>adb kill-server
C:\Users\GitLqr>adb connect 192.168.0.104
* daemon not running. starting it now on port 5037 *
* daemon started successfully *
connected to 192.168.0.104:5555
perfect~
- 01
- Flutter - 轻松搞定炫酷视差(Parallax)效果09-21
- 02
- Flutter - 轻松实现PageView卡片偏移效果09-08
- 03
- Flutter - 升级到3.24后页面还会多次rebuild吗?🧐08-11