java 层代码分析(录制 + 执行)
从最开始的application 分析到这里,整个流程有点复杂不做记录。
走录制流程 , 启动一个悬浮窗服务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 打印参数和类名
其中com.cyjh.mobileanjian.vip.activity.find.model.bean.InstallAppInfo 如图,包含了包名等相关信息。
com.cyjh.mobileanjian.vip.activity.find.fragment.SelectAppTypeBaseFragment的visibilityChange方法同时绑定了
该页面是个listView ,
com.cyjh.mobileanjian.vip.activity.find.fragment.SelectAppTypeBaseFragment. visibilityChange 方法注册了 该控件的点击方法。
hook 该控件的点击方法,时机刚好对上。
分析ScriptType.RECORD的代码分支。
跟随日志, 进入一个目标类 , com.cyjh.mobileanjian.vip.view.floatview.help.ScripDateManager
跟进到 ,前端加载的res/layout/view_float_control_record.xml 资源,该悬浮窗功能所在类,
实现录制的功能按键,com.cyjh.mobileanjian.vip.view.floatview.FloatControlFuncRecordView
使用IPC通信
那这个IPC通信,发给谁了?
r 有点像消息队列,a方法在消息队列新增数据,参数通过com.cyjh.mobileanjian.ipc.share.proto.Ipc 去构造。
关注r 被使用的部分就能知道谁取数据去发送。
点击 “录制” 时的调用情况
该类的b方法 ,值得怀疑可惜hook下来没有调用。
奇怪 ,打印该类的f方法时,出现了该类的b方法。回溯上层的函数。
上层函数看下ipcservervice , 这个类会泄露很多信息。
对该类挂起hook会崩溃??
应该是frida 的兼容性问题,换了个设备没啥问题。
我们要的点应该就在
giao , 思路有点乱了,ipc 起了匿名类2 来检测root环境, 起了匿名类1 看线程名称为ipc_server , 应该负责管理ipc通信,
com.cyjh.mq.sdk.MqRunner 没有有效信息。
IpcService.this.e.a 启动了socket server,IPC通信通过socket实现。
难受的是hook 该类的所有的成员函数,实际也没有拿到有效信息。莫非java层hook 不能hook ,shit 可能是脚本的问题,确实是脚本问题。
没有直接看到injectelf 参与的部分,那还是回到使用socket通信的端口,再去找谁去占用该端口来分析。
hook com.cyjh.mq.c.c.a( ) , 使用域套接字。
跑了两个socket , 分别是端口号为 12010 和 名称为”com.cyjh.mobileanjian.event.localserver” 的套接字。
sendMessage 去发送消息,不知道也没有快速定位handleMessage的方法,
全局搜索handleMessage方法。
com.cyjh.mobileanjian.vip.view.floatview.help.BaseScriptRecordHelp 负责去处理消息
handler 和
结果回到了最初的点, com.cyjh.mq.c.b,
我人傻了 ,accept 通过就说明此时在建立连接 ,这时再看谁在使用这个端口。
com.cyjh.mq.c.a 从socket 读写数据
com.cyjh.mq.c.b 封装数据后使用com.cyjh.mq.c.a进行读写。
问题又回到怎么去获取socket 的客户。
打印socket 使用时的文件描述符。
giao 我一直才使用的端口,结果用的是域 ,no fuck call say。
自己写实例发现,java socket 使用sento 作为实现,但是看buffer 看不出来发送了什么数据,内存数据可能在的java层的数据布局。
那么考虑到此,按键精灵另一端应没有走native实现,还是通过java实现。
那只能看下其他进程,有没有实现了?
先判断Mobileanjian:x ,使用frida hook上后并没有使用 ipc相关的类
打印进程的dex文件, 没有发现同等的IPC的类 。
另一个进程
ok 。 跟踪这个进程发现了,获取/dev/input 实践的一系列行为。就知道按键精灵的实现原理了。
问题1
我只获取到,localSocket 的server端,知道另一端是不可靠的,因为启动线程来传输消息的话, 捕捉不到上层逻辑。不必纠结通过socket获取到通信的两端。
问题2
之前使用frida hook过open函数来排查通过/dev/input 来获取到按键信息,但是实际上,frida 没有hook到这个进程。可能这个进程启动的方式有些特殊。
这次由于进程没有抹去com.cyjh.mobileanjian 的特征,成功定位到该进程。可以写个应用运行前后进程数目和名称对比脚本来避免进程漏分析。
0 条评论