一、场景

项目需要的 adb 工具过期,虽然可以通过修改电脑时间来使用,但这很不方便,于是便有了此文章。

二、实战

此次所需工具/条件如下:

  • 神器 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命令设置android时间 adb改时间_tv

adb命令设置android时间 adb改时间_字符串_02

选中 adb.exe 文件后,点 “打开” ,之后一路点 “OK” 和 “Yes”:

adb命令设置android时间 adb改时间_tv_03

adb命令设置android时间 adb改时间_java_04

注意:IDA 在加载文件的时候,中途可能会提示一些 Warning 警告,不管它,继续点 “OK” 或 “Yes”。

当 IDA 加载成功后,就会看到如下界面了:

adb命令设置android时间 adb改时间_tv_05

现在需要找到前面提到的 ############ 字符串,通过 “View -> Open subviews ->Strings” 或 按"Shift+F12" 打开字符串窗口:

adb命令设置android时间 adb改时间_字符串_06

此时,在 IDA 的左侧会出现一个 Strings window (字符串窗口):

adb命令设置android时间 adb改时间_android_07

通过快捷键 “ctrl + f” 打开搜索栏,输入 ############ 后回车:

adb命令设置android时间 adb改时间_android_08

双击该搜索结果条目,在 IDA 右侧的 IDA View-A 窗口会跳转到该字符串所在的地址处。至此,切入点的指令位置就已经找到了。

3、理清逻辑

在找到切入点之后,接下来就需要理清这段指令的触发时机了。注意看,在 004C58E9 地址处指令后面有一段蓝色字: ; DATA XREF: _adb_commandline+124B,这段蓝色字的意思是该指令被 _adb_commandline+124B 处引用,正合我意,我们的目的就是要看,这个指令是在哪里被引用和触发的。

adb命令设置android时间 adb改时间_tv_09

双击蓝色字之后,IDA View-A 窗口内容会发现变化,从 Text View 转变成了 Graph View,记住这个指令块的地址 loc_40C110

adb命令设置android时间 adb改时间_adb命令设置android时间_10

按下 ctrl 键,加鼠标滚轮,可以缩放这个 Graph View:

adb命令设置android时间 adb改时间_adb命令设置android时间_11

沿着 loc_40C110 指令块头上的绿色线条,可以找到解决该指令块的唯一源头:

adb命令设置android时间 adb改时间_字符串_12

从这个图可以知道,该 loc_40BC0B 指令块使用了 cmp 汇编指令,比较 2 个值的大小关系,汇编指令 jg 的意思是 有符号大于则跳转,所以当比较结果大于 0 时,就会跳转到 loc_40C110 处,即输出 ############ 字符串,否则,往右边红色线继续执行,进入正常的 adb 操作。至此,已经把切入点的触发逻辑搞清楚了。

3、逆向汇编代码

在弄清楚触发逻辑之后,就得考虑破解方案了,我自个想到的有如下几种破解思路:

  1. 修改获取到的时间值(难,要找到获取时间的地址处)
  2. 修改比较结果(难,我不知道 ebp、buf、1Fh 都是些啥)
  3. 修改比较逻辑(易,只需要把 jg 改成能执行到红色线的其它指令即可)

综上,选用方案 3,因为 JG 意为 有符号大于则跳转,那么相反的,使用 为 0 则跳转JZ有符号小于则跳转JL,都可以达到执行红色线的目的,这里我选用 JZ 指令,这样,无论电脑时间如何修改,基本上都不可能触发。(但是,如果你硬是要抬杠,那就算你说的对)

汇编跳转指令说明:

接下来要真正开始修改指令码了,先把 Graph View 转成 Text View,右击指令块,点击 “Text view”:

adb命令设置android时间 adb改时间_tv_13

将光标移动到 jg 指令那行,即 0040BC12

注意:鼠标左击一下,确定你光标就是在那里。

adb命令设置android时间 adb改时间_tv_14

通过 “Edit -> Patch program -> Assemble” 打开 Assemble instruction (汇编指令) 对话框:

adb命令设置android时间 adb改时间_字符串_15

adb命令设置android时间 adb改时间_字符串_16

直接把 jg 改成 jz ,然后,点击 “OK”:

adb命令设置android时间 adb改时间_字符串_17

此时,你会发现,0040BC12 处的指令成功修改成功了,但还是会有个对话框出来问你,下一行 0x40BC18 处你要不要也改了,因为不需要修改,所以点击 “Cancel” 或 直接叉掉就行了:

adb命令设置android时间 adb改时间_android_18

搞定,至此,汇编指令修改成功。

4、导出成品

不要以为直接 ctrl + s 保存就可以了,到目前为止,我们在 IDA 里所做的一切,都没有修改到原 adb.exe 文件,因为这是一个由 IDA 对原程序加载解析后得到的一个 IDA 工程,我们修改的也只是这个 IDA 工程里的代码,所以,我们还需要把工程进行导出,不过,IDA 很 dio,通过 “Edit -> Patch program -> Apply patches to input file…”,可以把修改过的汇编码直接应用到原文件上:

adb命令设置android时间 adb改时间_字符串_19

这里还可以指定应用的地址范围,不用管,直接点 “OK” 即可:

adb命令设置android时间 adb改时间_tv_20

可能会遇到 “Permission denied” 警告,这是因为 adb 进程正在运行中,只需要把 adb 进程 kill 掉,再重复上述操作即可:

adb命令设置android时间 adb改时间_adb命令设置android时间_21

注意:除了用 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