0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于frida-inject脚本持久化开发实战分享

哆啦安全 来源:卓码星球 2023-12-09 14:43 次阅读

主要内容:

frida-inject脚本持久化的方案

App开关文件目录以及脚本存储文件目录selinux配置

封装和超级Root权限后台进程通信java Api接口以及封装访问脚本相关目录文件的Java接口

系统源码中添加App启动的时候执行frida-inject命令的逻辑代码

开发控制App实现对第三方App 持久化的配置

1.frida-inject脚本持久化方案原理

方案原理:

在系统源码App启动入口的地方,找一个合适的时机。将frida-inject组装执行附加的命令通过Socket连接发送到超级Root权限后台进程中执行,达到实现App启动就加载js脚本的功能。App启动入口加载时机我们选择ActivityThread.java中的handleBindApplication方法。以下是该方案的一个图示:

49effbb8-9659-11ee-8b88-92fbcf53809c.jpg

2.持久化相关目录文件创建及selinux配置

2.1 文件及目录设计

在该方案中,设计以下的文件目录用来判断App是否需要开启frida inject持久化以及加载的js文件路径。设计如下:

#配置某一个App是否开启持久化功能,$PKG_NAME表示App的包名
#比如一个参考:/data/system/xsettings/frdinject/persist/com.android.jnidemo01/persist_fridainject
/data/system/xsettings/frdinject/persist/$PKG_NAME/persist_fridainject

#配置某一个App加载的js文件路径,$PKG_NAME表示App的包名
#/data/system/xsettings/frdinject/jscfg/com.android.jnidemo01/config.js
/data/system/xsettings/frdinject/jscfg/$PKG_NAME/config.js

在涉及以上的文件或者目录中,管控端App具有system权限,需要配置系统权限的App对以上文件或者目录读写的selinux权限。普通App需要对以上文件有读的权限,所以需要配置第三方App具有读以上文件的selinux权限。

2.2 配置selinux操作

(1).创建文件类型selinux标签

在如下文件中创建文件标签frdinject_data_file,文件列表:

systemsepolicypublicfile.te
systemsepolicyprebuiltsapi29.0publicfile.te

在以上文件中添加如下内容,需要保证两个文件添加的内容一致。不然要编译错误。

#/data/system/xsettings/
typefrdinject_data_file,file_type,data_file_type,core_data_file_type,mlstrustedobject;

(2).为文件目录关联frdinject_data_file标签

在如下文件中添加关联/data/system/xsettings目录selinux标签,文件列表:

systemsepolicyprebuiltsapi29.0privatefile_contexts
systemsepolicyprivatefile_contexts

在以上文件中添加如下内容,需要保证两个文件添加的内容一致。不然要编译错误。

/data/system/xsettings(/.*)?ufrdinject_data_file:s0

(3).配置App访问frdinject_data_file标签的权限

这个地方主要配置两种App。一种是system权限的配置端App。第二种是第三方App。

具有系统权限的配置端App selinux配置如下:

在如下文件中:

systemsepolicyprivatesystem_app.te
systemsepolicyprebuiltsapi29.0privatesystem_app.te

添加如下访问权限,添加之后请保持两个文件内容一致:

#addforaccessingfrdinject_data_file
allowsystem_appfrdinject_data_file:dir{getattrsetattropenreadwriteremove_namecreateadd_namesearchrmdir};
allowsystem_appfrdinject_data_file:file{getattrsetattropenreadwritecreateunlink};

第三方App配置selinux如下:

在以下文件中添加app访问文件夹的selinux策略。确保相对应的文件内容一致。

在以下untrusted_app_all.te文件:

systemsepolicyprivateuntrusted_app_all.te
systemsepolicyprebuiltsapi29.0privateuntrusted_app_all.te

添加内容如下:

#addforaccessingfrdinject_data_file
allowuntrusted_app_allfrdinject_data_file:dir{getattropenreadsearch};
allowuntrusted_app_allfrdinject_data_file:file{getattropenread};

在以下untrusted_app_27.te文件:

systemsepolicyprivateuntrusted_app_27.te
systemsepolicyprebuiltsapi29.0privateuntrusted_app_27.te

在以下文件:

#addforaccessingfrdinject_data_file
allowuntrusted_app_27frdinject_data_file:dir{getattropenreadsearch};
allowuntrusted_app_27frdinject_data_file:file{getattropenread};

在以下untrusted_app_25.te文件:

systemsepolicyprivateuntrusted_app_25.te
systemsepolicyprebuiltsapi29.0privateuntrusted_app_25.te
#addforaccessingfrdinject_data_file
allowuntrusted_app_25frdinject_data_file:dir{getattropenreadsearch};
allowuntrusted_app_25frdinject_data_file:file{getattropenread};

在以下untrusted_app.te文件:

systemsepolicyprivateuntrusted_app.te
systemsepolicyprebuiltsapi29.0privateuntrusted_app.te
#addforaccessingfrdinject_data_file
allowuntrusted_appfrdinject_data_file:dir{getattropenreadsearch};
allowuntrusted_appfrdinject_data_file:file{getattropenread};

2.3 init.rc中配置开机的时候就创建对应的目录

该持久化实现中,使用了如下目录。

/data/system/xsettings/frdinject/persist
/data/system/xsettings/frdinject/jscfg

所以可以将该目录放在init进程启动的时候进行创建。由于init进程会解析init.rc文件执行配置的命令,所以可以根据init.rc创建文件夹的规则加入创建以上两个目录的操作。在systemcore ootdirinit.rc文件中添加内容如下:

#/data/system/xsettings/frdinject/persist
mkdir/data/system/xsettings0775systemsystem
mkdir/data/system/xsettings/frdinject0775systemsystem
mkdir/data/system/xsettings/frdinject/persist0775systemsystem
mkdir/data/system/xsettings/frdinject/jscfg0775systemsystem

3.系统源码中相关Java接口封装

3.1 封装和超级Root权限通信的MgskSu模块

在源码根目录中创建如下对应的目录:

frameworksasecorejavaandroidxfrd

在目录xfrd中将存放MgskSu模块的接口实现。具体实现如下:

packageandroid.xfrd;

importjava.io.BufferedReader;
importjava.io.BufferedWriter;
importjava.io.InputStreamReader;
importjava.io.OutputStreamWriter;
importjava.net.InetSocketAddress;
importjava.net.Socket;

publicclassMgskSu{

publicstaticStringmagiskSu(Stringcmd)
{
StringretString="";
try{
//创建socket
StringmyCmd="do_cmd|"+cmd;
SocketmSocket=newSocket();
InetSocketAddressinetSocketAddress=newInetSocketAddress("127.0.0.1",11111);
mSocket.connect(inetSocketAddress);
BufferedWriterbufferedWriter=newBufferedWriter(newOutputStreamWriter(mSocket.getOutputStream()));
BufferedReaderbufferedReader=newBufferedReader(newInputStreamReader(mSocket.getInputStream()));
bufferedWriter.write(myCmd+"
");
bufferedWriter.flush();
retString=bufferedReader.readLine();
bufferedReader.close();
bufferedWriter.close();
}catch(Exceptioneeeee)
{
eeeee.printStackTrace();
}
returnretString;
}
}

3.2 封装针对App需要持久化判断和获取对应js文件路径的接口

在该方案中通过对应App的包名组装文件路径来识别是否存在来判断App是否需要启动就加载js文件。在MagiskSu.java同目录中创建FrdSettings.java模块文件。核心代码如下:

packageandroid.xfrd;


importandroid.system.Os;
importjava.io.File;

publicclassFrdSettings{

staticfinalStringTAG=FrdSettings.class.getSimpleName();
privatestaticfinalStringSETTINGS_DIR="/data/system/xsettings/frdinject/persist";
privatestaticfinalStringCONFIG_JS_DIR="/data/system/xsettings/frdinject/jscfg";
publicstaticfinalStringPERSIST_FRIDA_INJECT="persist_fridainject";
publicstaticfinalStringPERSIST_FRIDA_GADGET="persist_fridagadget";
publicstaticfinalStringPERSIST_FRIDA_GUMJS="persist_fridagumjs";
//

publicstaticbooleanisAppJsPathExists(StringpkgName){
Filefile=newFile(CONFIG_JS_DIR+"/"+pkgName+"/config.js");
returnfile.exists();
}
publicstaticStringgetAppJsPath(StringpkgName)
{

Filefile=newFile(CONFIG_JS_DIR+"/"+pkgName+"/config.js");
returnfile.getAbsolutePath();
}


/**********************判断是否开启持久化***************************/
//设置对应的App是否开启持久化
publicstaticvoidsetEnablePersistFridaInject(StringpkgName,StringmethodType,booleanisEnable){
Filefile=newFile(SETTINGS_DIR);
if(!file.exists()){
file.mkdirs();
try{
Os.chmod(file.getAbsolutePath(),0775);
}catch(Exceptioneeee){

}
}
FilepkgFile=newFile(file,pkgName);
if(!pkgFile.exists()){
pkgFile.mkdirs();
try{
Os.chmod(pkgFile.getAbsolutePath(),0775);
}catch(Exceptioneeee){
eeee.printStackTrace();
}
}
FileenableFile=newFile(pkgFile,methodType);
if(isEnable){
if(!enableFile.exists()){

try{
enableFile.createNewFile();
//MyLog.d(TAG,"createfilesuccess");
Os.chmod(enableFile.getAbsolutePath(),0775);
}catch(Exceptioneeee){
//MyLog.d(TAG,"filecreateerrror:"+enableFile.getAbsolutePath());
eeee.printStackTrace();
}
}else{
//MyLog.d(TAG,"fileexists:"+enableFile.getAbsolutePath());
}
}else{
if(enableFile.exists()){
enableFile.delete();
}
}

}

//判断app是否打开自动注入脚本功能
publicstaticbooleanisEnablePersistFrida(StringpkgName,StringmethodType){
FileenableFile=newFile(SETTINGS_DIR,pkgName+"/"+methodType);
returnenableFile.exists();
}
}

4.源码中在App启动入口ActivityThread.java中添加加载js逻辑

在之前方案分析中已经找到了在frameworksasecorejavaandroidappActivityThread.java中的handleBindApplication方法中加入加载js的逻辑是一个比较不错的选择。在handleBindApplication中加入如下关键调用代码,实现App启动的时候就去加载执行js。核心关键代码如下:

StringcurPkgName=data.appInfo.packageName;
intmypid=Process.myPid();
intmytempUid=Process.myUid();

if(mytempUid>10000)
{
BooleanisB=FrdSettings.isEnablePersistFrida(curPkgName,FrdSettings.PERSIST_FRIDA_INJECT);
Log.d("FridaInject","curPkgNameisEnableFridaInject:"+isB);
if(isB)
{
StringjsPath=FrdSettings.getAppJsPath(curPkgName);
if(jsPath!=null)
{
//这个地方比较重要,不然App运行会奔溃。
//App中主线程中调用网络socket操作配置
android.os.StrictMode.ThreadPolicypolicy=newandroid.os.StrictMode.ThreadPolicy.Builder().permitAll().build();
android.os.StrictMode.setThreadPolicy(policy);
StringcmdString="myfridainjectarm64-p"+mypid+"-s"+jsPath+"-e";
StringretString=MgskSu.magiskSu(cmdString);
try{
Thread.sleep(50);
}catch(Exceptioneee)
{
}
Log.d("FridaInject","retStringis"+retString);
}else{
Log.d("FridaInject","jsPathisnull");
}
}else{

}

}

5.控制端App开发实现对第三方App持久化配置

控制端App中对App是否持久化开关配置以及js路径配置使用的封装接口和以上系统源码中封装的FrdSettings.java是一样的封装。这个地方就不讲接口的封装了。只说一下几个关键的地方使用。

配置界面参考:

4a02e69c-9659-11ee-8b88-92fbcf53809c.jpg

主要涉及的几个接口调用如下:

(1).打开/关闭第三方App加载js功能

调用了封装的接口:setEnablePersistFridaInject

(2).将选择的js文件复制到对应App的配置js目录

调用了封装的接口:copyJsFileToAppJsPath

(3).判断App当前是否配置了加载js功能

调用了封装的接口:isEnablePersistFrida

(4).获取App配置的js文件路径

置以及js路径配置使用的封装接口和以上系统源码中封装的FrdSettings.java是一样的封装。这个地方就不讲接口的封装了。只说一下几个关键的地方使用。

配置界面参考:

[外链图片转存中…(img-L6IhssD7-1667868558625)]

主要涉及的几个接口调用如下:

(1).打开/关闭第三方App加载js功能

调用了封装的接口:setEnablePersistFridaInject

(2).将选择的js文件复制到对应App的配置js目录

调用了封装的接口:copyJsFileToAppJsPath

(3).判断App当前是否配置了加载js功能

调用了封装的接口:isEnablePersistFrida

(4).获取App配置的js文件路径

调用了封装接口:getAppJsPath







审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • JAVA
    +关注

    关注

    19

    文章

    2904

    浏览量

    102995
  • API接口
    +关注

    关注

    1

    文章

    79

    浏览量

    10315

原文标题:基于frida-inject脚本持久化开发实战

文章出处:【微信号:哆啦安全,微信公众号:哆啦安全】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Windows/Ubuntu安装frida和objection

    Windows环境使用管理员权限安装frida,Ubuntu使用普通或Root权限安装均可。
    发表于 11-17 09:36 785次阅读

    Linux Shell脚本入门到实战详解

    Linux Shell脚本入门到实战详解
    发表于 02-17 15:03 478次阅读

    frida-inject工具使用及说明 内置frida-inject工具到手机系统

    frida-injectfrida中提供的可以直接放到手机端执行注入js脚本到App程序进行hook的工具。也就是说使用frida-inject命令可以脱离PC端执行注入了。
    的头像 发表于 10-26 10:42 3391次阅读

    自动化测试脚本开发技巧

    开发自动化测试脚本的技巧和心得软件测试 增量式调试脚本 录制测试脚本,和其他的软件开发成果一样,会变得非常大。为了可以成功的回放,需要调试几
    发表于 03-26 16:24 53次下载

    LabVIEW入门与实战开发100例

    LabVIEW入门与实战开发100例LabVIEW入门与实战开发100例LabVIEW入门与实战开发
    发表于 02-18 11:44 0次下载

    c#开发Android应用实战

    c#开发Android应用实战
    发表于 07-14 13:32 0次下载

    如何使用Myeclipse进行java可视化开发

    本文档的主要内容详细介绍的是如何使用Myeclipse进行java可视化开发。实现Java的可视化开发
    发表于 01-10 10:38 5次下载
    如何使用Myeclipse进行java可视<b class='flag-5'>化开发</b>

    arduino开发实战指南

    arduino开发实战指南
    发表于 02-22 14:56 1次下载

    Python项目开发实战

    Python项目开发实战
    发表于 06-13 14:51 2次下载

    浅谈IoT Power的Lua脚本开发应用

    Lua脚本开发简单快速,在Cat.1和MCU开发应用中已历经验证并广受好评。所以LuatOS社群经常有人问:合宙推出的口袋神器——IoT Power,可以脚本
    的头像 发表于 09-05 14:43 913次阅读

    安卓常规逆向操作涉及到的知识点介绍

    持久frida(独立执行frida,不需要借助adb 执行frida-server终端命令)
    的头像 发表于 09-20 09:13 612次阅读
    安卓常规逆向操作涉及到的知识点介绍

    LabVIEW经典实战开发100例

    本文档的主要内容详细介绍的是LabVIEW经典实战开发100例的VI程序下载。例题十分齐全,能快速帮您提高labview实战开发能力。
    发表于 09-29 15:58 191次下载

    基于frida的Objection对APP逆向过程的作用

    在APP的逆向过程中避免借助使用一些反汇编工具,动静态调试分析工具,自然也免不了和frida这个工具打交道,frida作为强大的逆向分析工具在攻防过程中具有不可撼动的地位。
    的头像 发表于 10-09 11:08 3183次阅读

    LabVIEW入门与实战开发100例

    LabVIEW入门与实战开发100例,实用例子
    发表于 10-26 15:25 25次下载

    STM32库开发实战指南

    STM32库开发实战指南-刘火良,电子 epub格式,清晰非扫描
    发表于 10-27 16:25 9次下载