luject v1.0.3首发,一个静态注入动态库的工具
luject是一个静态注入动态库的工具,它可以实现对mac, ios, linux, windows, android的可执行程序,动态库程序进行修改,来插入指定动态库实现注入和加载。
另外luject也实现了对ios的ipa包,android的apk包自己macOS的.app包的动态库注入,重打包和重签名支持。
注入技术简介
我们可以通过ptrace附加或启动一个程序,然后将指定的动态库注入进去,但很多情况下需要root权限才行。
除了通过动态注入,我们也可以通过设置DYLD_INSERT_LIBRARIES
等环境变量的方式,来注入指定的动态库,mac/ios程序就可以使用这种方式来简单快速地实现注入,例如:
$DYLD_INSERT_LIBRARIES=inject.dylib ./test
不过这种方式在ios上也需要越狱后才可用,另外我们也可以在工程的Build Settings中找到Other Linker Flages 并添加下面的字段来限制这种加载方式,实现对可执行程序的注入保护。
-Wl,-sectcreate,__RESTRICT,__restrict,/dev/null
因此,也不是非常的通用,其实还有一种更加通用的方式,就是直接静态修改可执行文件,插入需要加载的动态库就可以了,简单暴力有效。
Mayhem 在Phrack中也详细解释了这一技术的原理,而LIEF库提供了一种跨平台的api,实现对MachO, ELF, PE等可执行文件格式的快速修改。
这里luject就是利用了这个库,通过修改可执行文件,插入动态库加载路径,来实现静态注入,例如:
auto elf_binary = std::unique_ptr<LIEF::ELF::Binary>{LIEF::ELF::Parser::parse("testapp")}; elf_binary->add_library("libtest.so"); elf_binary->write("testapp_injected");
luject编译安装
准备工作
我们需要先安装xmake来编译此项目。
编译
$ xmake
安装
$ xmake install
luject使用说明
用法很简单,主要就是指定输入输出的文件路径就好:
$ luject -i [input] -o [output] -p [libpattern] lib1 lib2 ..
最后面的lib列表,就是指定有哪些动态库需要被注入进去
例如:
$ luject -i app.apk lib1.so lib2.so $ luject -i app.ipa lib1.dylib lib2.dylib $ luject -i liba.so lib1.so lib2.so $ luject -i app.exe lib1.dll lib2.dll $ luject -i a.dll lib1.dll lib2.dll $ luject -i liba.dylib lib1.dylib lib2.dyib $ luject -i bin lib1.so lib2.so
当然,除了指定库路径,我们也可以指定@loader_path
, $ORIGIN
的路径进去,例如:
$ luject -i libdemo.dylib @loader_path/libtest.dylib
上面的命令,我们就可以把libtest.dylib
注入到另一个libdemo.dylib
的动态库中去,如果libdemo.dylib
被加载,那么就会从@loader_path
也就是libdemo.dylib当前加载目录下 找对应的libtest.dylib
库,然后自动加载进来,我们也可以通过otool/ldd等工具也查看验证加载列表:
$ otool -L libdemo.dylib libdemo.dylib: @loader_path/libtest.dylib (compatibility version 0.0.0, current version 0.0.0) /usr/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.11) /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 800.7.0) /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1281.0.0)
可以看到,libtest库已经被成功插入进去了。
注入libfrida-gadget.so到apk
通常我们在使用frida系列工具对app进行动态分析时,如果不想root,那么可以通过luject将frida-gadget库静态注入到apk里面的so库中去,比如:
$ luject -i app.apk -p libtest /tmp/libfrida-gadget.so
其中,libtest是指定apk中需要匹配注入的so库,并且支持模式匹配实现批量注入,例如:libtest_*.so
,如果不指定-p
参数,默认多所有so进行批量全注入。
关于这块,我们也可以详细看下相关文章: How to use frida on a non-rooted device
另外,luject重打包后,还会对apk进行重签名,来确保可以正常安装使用
注入libfrida-gadget.dylib到ipa
除了android的应用程序包,luject也支持对ios的ipa包进行注入,用法类似:
$ luject -i app.ipa -p libtest /tmp/libfrida-gadget.dylib
luject也会对ipa包进行重签名,它会自动探测用户环境中的有效签名证书,来直接重签名,当然如果默认检测的签名不符合需求,我们也可以手动指定对应的签名信息:
$ luject -i app.ipa -p libtest --codesign_identity='Apple Development: xxx@gmail.com (T3NA4MRVPU)' --mobile_provision='iOS Team Provisioning Profile: org.tboox.test' --bundle_identifier=org.tboox.test /tmp/libfrida-gadget.dylib
那如何知道我们需要的签名配置呢?一种就是在xcode里面查看,另外xmake也提供了一些辅助工具可以dump出当前可用的所有签名配置:
$ xmake l private.tools.codesign.dump ==================================== codesign identities ==================================== { "Apple Development: waruqi@gmail.com (T3NA4MRVPU)" = "AF73C231A0C35335B72761BD3759694739D34EB1" } ===================================== mobile provisions ===================================== { "iOS Team Provisioning Profile: org.tboox.test" = "<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>AppIDName</key> <string>XC org tboox test5</string> <key>ApplicationIdentifierPrefix</key> <array> <string>43AAQM58X3</string> ...
xmake也提供了其他辅助工具来对已有的ipa/app程序进行重签名,例如:
$ xmake l utils.ipa.resign test.ipa|test.app [codesign_identity] [mobile_provision] [bundle_identifier]
其中,后面的签名参数都是可选的,如果没设置,那么默认会探测使用一个有效的签名:
$ xmake l utils.ipa.resign test.ipa $ xmake l utils.ipa.resign test.app "Apple Development: waruqi@gmail.com (T3NA4MRVPU)" $ xmake l utils.ipa.resign test.ipa "Apple Development: waruqi@gmail.com (T3NA4MRVPU)" iOS Team Provisioning Profile: org.tboox.test" org.tboox.test
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Proxy-Go v9.2 发布,新增P2P打洞重试、流量快速上报,TCP压缩!
Proxy 是 golang 实现的高性能 http、https、websocket、tcp、udp、socks5 代理服务器,支持正向代理、反向代理、透明代理、内网穿透、TCP/UDP 端口映射、SSH 中转、TLS 加密传输、协议转换、DNS 防污染智能代理、前置 CDN/Nginx 反代、代理连接重定向、API动态调用上级代理、限速限连接数。提供全平台的命令行版本,友好易用的Windows&Linux&macOS控制面板,强大的安卓版。 更新内容 内网穿透P2P打洞增加了重试,提高成功率。 http(s)\socks5\sps增加了控制接口参数,通过参数--control-url指定的http接口地址。用来及时断开比如流量超了或者过期了的用户或IP已经建立的连接。 tcp增加了压缩传输参数-z和-Z。 http(s)/socks5/sps/tcp/udp代理流量上报增加了模式参数--traffic-mode,默认是`normal`普通模式上报,还可以使用`fast`快速模式上报(精准控制流量)。 特色功能 链式代理,程序本身可以作为一级代理,如果设置了上级代理那么...
- 下一篇
云存储网关归档管理的前提条件及步骤
云栖号快速入门:【点击查看更多云产品快速入门】不知道怎么入门?这里分分钟解决新手入门等基础问题,可快速完成产品配置操作! 通过设置OSS Bucket的生命周期规则和自动归档操作,实现文件网关中的文件自动归档。 前提条件 已创建标准类型或低频访问类型的OSS Bucket,详情请参见创建存储空间。 已创建共享。 (1).如果是云上文件网关,详情请参见管理共享。(2).如果是本地文件网关,详情请参见管理NFS共享。 背景信息 从1.0.44版本开始,支持文件网关中的文件自动归档存储到OSS Bucket。 对于标准类型或者低频访问类型OSS Bucket内的文件,文件网关提供了文件系统端配置自动归档文件,解冻归档文件,查询文件归档状态的功能,不需要跳转到OSS控制台针对某个文件进行生命周期管理。 步骤一:设置生命周期规则 您可以通过生命周期规则来批量转换OSS Bucket内对象(Object)的存储类型。 1.登录OSS管理控制台。2.在左侧存储空间列表中,单击目标存储空间名称,进入该存储空间概览页面。3.单击基础设置页签,找到生命周期区域,单击设置。4.在生命周期页面,单击创建规则。...
相关文章
文章评论
共有0条评论来说两句吧...