java 层代码分析(录制 + 执行)

从最开始的application 分析到这里,整个流程有点复杂不做记录。

image-20220624173353535

走录制流程 , 启动一个悬浮窗服务com.cyjh.mobileanjian.vip.service.FloatService。录制时使用ScriptRecordHelp.startRecordScript,怀疑该函数内部存在监控屏幕触摸行为,

com.cyjh.mobileanjian.vip.view.floatview.control.BaseFloatDragView 该类值得怀疑,hook挂上没调用。排除

这里思考下,本次分析从初始application -> main Activity -> 实际目标的activity 说实话,分析流程很有逻辑性,每步分析都有理有据,实际问题在于分析复杂度很高,不能很快的定位到目标activy或class。

下次分析,优先找到最近的activity然后找相关的类或方法。

从选择应用 到 悬浮窗的日志。

2022-06-28 10:50:30.643 1472-1472/com.cyjh.mobileanjian I/SelectAppTypeBaseFragment: setOnItemClickListener --> ROOT
2022-06-28 10:50:30.666 1472-1472/com.cyjh.mobileanjian I/IntentUtil: toFloatService --> 1
2022-06-28 10:50:30.666 1472-1472/com.cyjh.mobileanjian I/IntentUtil: toFloatService --> 3
2022-06-28 10:50:30.704 1472-1472/com.cyjh.mobileanjian I/FloatService: onCreate -->
2022-06-28 10:50:30.708 1472-1472/com.cyjh.mobileanjian I/FloatService: onStartCommand --> flag=1
2022-06-28 10:50:30.708 1472-1472/com.cyjh.mobileanjian I/FloatService: startFloat -->
2022-06-28 10:50:30.708 1472-1472/com.cyjh.mobileanjian I/ScripDateManager: optionScriptType -->
2022-06-28 10:50:30.708 1472-1472/com.cyjh.mobileanjian I/ScripDateManager: optionScriptType --> getCategoryPath=/storage/emulated/0/MobileAnJian/Record,getScriptType=RECORD
2022-06-28 10:50:30.708 1472-1472/com.cyjh.mobileanjian I/FloatViewManager: record -->
2022-06-28 10:50:30.708 1472-1472/com.cyjh.mobileanjian I/FFF: init WAN
2022-06-28 10:50:30.708 1472-1472/com.cyjh.mobileanjian I/FloatViewManager: record --> 1
2022-06-28 10:50:30.708 1472-1472/com.cyjh.mobileanjian I/FloatViewManager: record --> 2
2022-06-28 10:50:30.708 1472-1472/com.cyjh.mobileanjian I/FFF: onCreate 1
2022-06-28 10:50:30.708 1472-1472/com.cyjh.mobileanjian I/FFF: onCreate 2
2022-06-28 10:50:30.708 1472-1472/com.cyjh.mobileanjian I/FFF: onCreate 3
2022-06-28 10:50:30.708 1472-1472/com.cyjh.mobileanjian I/FFF: onCreate 4
2022-06-28 10:50:30.712 1472-1543/com.cyjh.mobileanjian W/SQLiteLog: (28) double-quoted string literal: "
2022-06-28 10:50:30.712 1472-1543/com.cyjh.mobileanjian W/SQLiteLog: (28) double-quoted string literal: "208494F33944FF7518A31FDDF3921101"
2022-06-28 10:50:30.751 1472-1472/com.cyjh.mobileanjian I/FFF: onCreate 5
2022-06-28 10:50:30.759 1472-1472/com.cyjh.mobileanjian I/FFF: onCreate 6
2022-06-28 10:50:30.759 1472-1472/com.cyjh.mobileanjian I/FloatViewManager: record onCreate WAN
2022-06-28 10:50:30.759 1472-1472/com.cyjh.mobileanjian I/ScripDateManager: createScriptModel
2022-06-28 10:50:30.759 1472-1472/com.cyjh.mobileanjian I/ScripDateManager: createScriptModel Common
2022-06-28 10:50:31.215 1472-1698/com.cyjh.mobileanjian D/OpenGLRenderer: endAllActiveAnimators on 0xad0c5800 (ListView) with handle 0x841d8d30
2022-06-28 10:50:31.223 1472-1472/com.cyjh.mobileanjian I/Downloader-AppStatusManager: dispatchAppBackground
2022-06-28 10:50:37.939 1472-1688/com.cyjh.mobileanjian I/TeaLog: p worked:true 60000
2022-06-28 10:50:37.971 1472-1688/com.cyjh.mobileanjian I/TeaLog: s0 0
2022-06-28 10:50:37.971 1472-1688/com.cyjh.mobileanjian I/TeaLog: s worked:true 60000
2022-06-28 10:50:41.157 1472-1472/com.cyjh.mobileanjian E/闹钟: 当前闹钟,需不需要跑脚本-1
2022-06-28 10:50:41.262 1472-2110/com.cyjh.mobileanjian I/[matrix]: init sdk : channel=anjianjingling, version=21
2022-06-28 10:50:41.864 1472-1472/com.cyjh.mobileanjian I/MainActivity: onEventMainThread onReceiveSocketMessage -->
2022-06-28 10:50:41.864 1472-1472/com.cyjh.mobileanjian D/Event: No subscribers registered for event class com.cyjh.mobileanjian.vip.event.Event$PCClientStatus
2022-06-28 10:50:41.864 1472-1472/com.cyjh.mobileanjian D/Event: No subscribers registered for event class de.greenrobot.event.NoSubscriberEvent
2022-06-28 10:50:41.864 1472-1472/com.cyjh.mobileanjian I/MainActivity: REMOTE_CLIENT_CLOSED_CODE -->

排查悬浮窗相关类,FloatRecordManager , BaseScriptManager 。

调研发现在root情况下,通过getevent 可以获取屏幕触摸和按键的事件。查看getEvent关键字没有什么东西,有没有可能我漏掉了一些执行关键逻辑的进程。把按键精灵另起的sh进程 和su进程分别进行了监控,还是没有发现相关数据。可能录制功能还是在java层完成。

定位 “选择应用的Activity”后,是否有弹出的悬浮窗的代码去分析,怀疑之前分析的点,在监控启动之后。

根据上方日志,排查FloatService是否存在相关行为?

选择应用的ACTIVITY为com.cyjh.mobileanjian/.vip.activity.find.SelectApplicationListActivity,展示界面使用了

com.cyjh.mobileanjian.vip.activity.find.fragment.SelectAppTypeBaseFragment

fragment 相关链接和操作。 https://developer.android.com/guide/fragments

怀疑visibilityChange 用于更新应用列表的展示。

hook 打印参数和类名

image-20220704202000730

其中com.cyjh.mobileanjian.vip.activity.find.model.bean.InstallAppInfo 如图,包含了包名等相关信息。

image-20220704202054508

com.cyjh.mobileanjian.vip.activity.find.fragment.SelectAppTypeBaseFragment的visibilityChange方法同时绑定了

image-20220721200939452

该页面是个listView ,

com.cyjh.mobileanjian.vip.activity.find.fragment.SelectAppTypeBaseFragment. visibilityChange 方法注册了 该控件的点击方法。

hook 该控件的点击方法,时机刚好对上。

image-20220721201358334
image-20220721203105424

分析ScriptType.RECORD的代码分支。

跟随日志, 进入一个目标类 , com.cyjh.mobileanjian.vip.view.floatview.help.ScripDateManager

image-20220721211652369

跟进到 ,前端加载的res/layout/view_float_control_record.xml 资源,该悬浮窗功能所在类,

image-20220721212638192

实现录制的功能按键,com.cyjh.mobileanjian.vip.view.floatview.FloatControlFuncRecordView

image-20220721212712376

使用IPC通信

image-20220721212743765

那这个IPC通信,发给谁了?

r 有点像消息队列,a方法在消息队列新增数据,参数通过com.cyjh.mobileanjian.ipc.share.proto.Ipc 去构造。

image-20220725165453972

关注r 被使用的部分就能知道谁取数据去发送。

点击 “录制” 时的调用情况

image-20220801155547459

该类的b方法 ,值得怀疑可惜hook下来没有调用。

奇怪 ,打印该类的f方法时,出现了该类的b方法。回溯上层的函数。

image-20220801164402323

上层函数看下ipcservervice , 这个类会泄露很多信息。

image-20220801165708381

对该类挂起hook会崩溃??

应该是frida 的兼容性问题,换了个设备没啥问题。

image-20220801173848683

我们要的点应该就在

image-20220801182040431

giao , 思路有点乱了,ipc 起了匿名类2 来检测root环境, 起了匿名类1 看线程名称为ipc_server , 应该负责管理ipc通信,

image-20220802145246877

com.cyjh.mq.sdk.MqRunner 没有有效信息。

IpcService.this.e.a 启动了socket server,IPC通信通过socket实现。

image-20220802150020488

难受的是hook 该类的所有的成员函数,实际也没有拿到有效信息。莫非java层hook 不能hook ,shit 可能是脚本的问题,确实是脚本问题。

没有直接看到injectelf 参与的部分,那还是回到使用socket通信的端口,再去找谁去占用该端口来分析。

hook com.cyjh.mq.c.c.a( ) , 使用域套接字。

image-20220803102409879

跑了两个socket , 分别是端口号为 12010 和 名称为”com.cyjh.mobileanjian.event.localserver” 的套接字。

image-20220803110145269
image-20220803112132921

sendMessage 去发送消息,不知道也没有快速定位handleMessage的方法,

全局搜索handleMessage方法。

com.cyjh.mobileanjian.vip.view.floatview.help.BaseScriptRecordHelp 负责去处理消息

handler 和

image-20220803153810524

结果回到了最初的点, com.cyjh.mq.c.b,

image-20220803171329783

我人傻了 ,accept 通过就说明此时在建立连接 ,这时再看谁在使用这个端口。

image-20220803171932462

com.cyjh.mq.c.a 从socket 读写数据

com.cyjh.mq.c.b 封装数据后使用com.cyjh.mq.c.a进行读写。

image-20220804203655923

问题又回到怎么去获取socket 的客户。

打印socket 使用时的文件描述符。

image-20220805171312443

giao 我一直才使用的端口,结果用的是域 ,no fuck call say。

image-20220805172206868
image-20220806163032020

自己写实例发现,java socket 使用sento 作为实现,但是看buffer 看不出来发送了什么数据,内存数据可能在的java层的数据布局。

那么考虑到此,按键精灵另一端应没有走native实现,还是通过java实现。

那只能看下其他进程,有没有实现了?

image-20220807004625693

先判断Mobileanjian:x ,使用frida hook上后并没有使用 ipc相关的类

打印进程的dex文件, 没有发现同等的IPC的类 。

另一个进程

image-20220807020953123

ok 。 跟踪这个进程发现了,获取/dev/input 实践的一系列行为。就知道按键精灵的实现原理了。

问题1

我只获取到,localSocket 的server端,知道另一端是不可靠的,因为启动线程来传输消息的话, 捕捉不到上层逻辑。不必纠结通过socket获取到通信的两端。

问题2

之前使用frida hook过open函数来排查通过/dev/input 来获取到按键信息,但是实际上,frida 没有hook到这个进程。可能这个进程启动的方式有些特殊。

这次由于进程没有抹去com.cyjh.mobileanjian 的特征,成功定位到该进程。可以写个应用运行前后进程数目和名称对比脚本来避免进程漏分析。


pareto

未来什么方向不管,先做自己喜欢做的事情。

0 条评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注