Giter Club home page Giter Club logo

xserver's Introduction

XServer

A Xposed Module for Android Penetration Test, with NanoHttpd.

背景

渗透测试中经常遇到通信协议的分析或者各类混淆。

此时,若通过静态的代码分析,则定位关键函数时耗时往往很久。此时,直接根据运行时的参数、结果特征直接定位到关键函数,往往能够节省很多时间。

此外,逆向通信协议往往比较麻烦,尤其是测试目的是通信内容而非协议本身时,此时,若不去逆向协议本身,而是直接使用应用内现成的协议,也会省去大量时间。

XServer

XServer是一个用于对方法进行分析的Xposed插件,它针对的是“方法”接口。由于人类习惯函数式编程,为了可维护性,往往会把各个功能分别封装进各个类与方法,这成为了程序的弱点。

利用注入和反射,可以记录并拦截方法的调用,也可以在应用自身的运行环境中调用某个具体方法。这就可以对应用的分析起到辅助。

另外,XServer还通过HTTP和WebSocket提供远程动态操作界面,也提供RPC接口供其它工具调用应用内的方法。

使用说明

通过Xposed启动

  1. 确保Xposed框架已经正确安装
  2. 安装XServer并确保在Xposed中启用XServer
  3. 在XServer应用选择器中选中目标应用
  4. 启动目标应用
    1. 如果XServer没有启动,可能是目标应用早已启动,然后才选择的目标应用,已错过目标应用判断时机。此时,可以关闭目标应用重新打开。
    2. 如果切换目标应用,原目标应用中的XServer依然在工作和占用端口。可以关掉原目标应用再启动新目标应用。
    3. 选择应用后直接重启设备最简单,如果你使用模拟器的话。
  5. 通过ADB转发XServer端口:adb forward tcp:8000 tcp:8000
    1. 目标应用可能存在多个进程,针对这种情况,XServer在进程PID对应的端口也打开了监听。若8000端口对应的进程不是目标应用主进程,可以使用另一个命令修正:adb forward tcp:8000 tcp:[目标进程PID]
  6. 通过http://127.0.0.1:8000/ 访问XServer

通过Frida启动

  1. 确保Frida-Server已经启动
  2. 确保XServer已在设备中
    1. 在目标设备中安装XServer(无需Xposed框架)
    2. 将XServer对应APK放置在/data/local/tmp/xserver.apk
  3. 使用Frida加载XServer.js以启动XServer:frida -U [目标应用包名或进程PID] -l XServer.js
  4. 通过ADB转发XServer端口:adb forward tcp:8000 tcp:8000
  5. 通过http://127.0.0.1:8000/ 访问XServer

通过其他Hook框架启动

XServer内部使用自己定义的Hook接口,因此可以兼容其他Hook框架,只要其他Hook框架实现HookProvider并注册。

  1. 将XServer注入并加载到目标应用中

  2. 修改XServer属性:assetManager、classLoader

  3. 实现HookProvider

    1. 支持动态创建类的框架如Frida可自行实现monkeylord.XServer.handler.HookHandler$HookProvider
    2. 也可以通过Hook已有的monkeylord.XServer.handler.Hook.DummyProvider来实现
  4. 在XServer中注册HookProvider

    HookHandler.setProvider(yourProviderClass);
  5. 启动XServer

    new XServer(8000);

批量跟踪

  1. XServer首页最下方是当前应用已加载的类清单,通过Filter可以根据名称进行过滤
    1. 这个清单不包括系统类
    2. 这个清单对应的是XServer.classLoader中已加载的类
  2. 点击Begin MassMonitoring进入批量跟踪界面
  3. 在Class Filter中根据类名筛选感兴趣的类(支持正则表达式)
  4. 点击Load Methods for Matched Classes来加载符合条件的类中的方法清单
  5. 在Method Filter中根据方法名筛选感兴趣的方法(支持正则表达式)
  6. 点击Hook Matched Methods监控所有符合以上两个筛选条件的方法。
  7. 收起Method Trace Selector观察日志
  8. 在Class Tree中可以随时通过勾选和取消勾选来调整某个方法是否被Hook
    1. 某些不重要的方法可能反复触发刷屏,可取消勾选,不再关注这些方法。
  9. 可以通过Ctrl+F搜索日志以寻找某些已知的内容是否在某个方法的参数或返回值中。

拦截、修改、重放方法调用

  1. 进入目标方法查看界面
    1. 在MassMonitoring界面中点击感兴趣的方法直接进入
    2. 在首页点击对应的类,再点击进入对应方法
  2. 部署并启动中间人工具并设置代理进行抓包
    1. XServer报文会使用系统配置的代理
  3. 操作应用,目标方法被调用时可在中间人工具中拦截到/invoke2调用
    1. 方法查看界面下方会也会记录方法调用情况,此处同时可以查看方法被调用时的堆栈情况
    2. 方法查看界面中的Invoke是一种简单触发调用的方法,用于调用应用中一些简单的工具方法
  4. 在中间人工具中,可以实时修改/invoke2调用中的参数和返回结果,从而改变方法被调用时的参数/返回结果
  5. 可以在中间人工具中直接重放/invoke2请求,这会使对应的方法被再次调用
    1. 对于加解密方法,这可以直接调用加解密
    2. 对于网络请求方法,这可以再次触发网络请求

注入Js脚本执行方法

XServer 接入Rhino 可动态注入脚本执行,调用指定方法。
例如调用监控 Application.onCreate() 方法

app.onCreate()

js环境中支持Application变量:app 可直接使用,导入类方式,参考Rhino官方文档

D8doQA.md.jpg

XServer基础结构

架构

XServer是一个被注入到目标APP中的、具备Hook等能力的HttpServer。

包含两个部分:HttpServer、Xposed入口

Xposed启动HttpServer并提供Hook能力,WebServer负责界面、RPC及各类业务逻辑。

新版的XServer可以在无Xposed的环境下运行,比如使用Frida来启动和Hook。

关键组件

Xposed入口:XposedEntry

应用选择器:MainActivity

HttpServer:XServer

业务逻辑处理:handler

对外接口:api

其它功能组件:utils、objectparser

资源文件:各类freemarker页面(XServer目前使用freemarker作为模板引擎)

HttpServer

对应代码:XServer.java

基于NanoHTTPD和NanoWSD开发,实现HTTP路由表与WebSocket路由表,并整合freemarker作为模板引擎。

定义了两类API接口,HTTP API和WebSocket API(Operation、wsOperation),启动后加载的各类功能API都要在此注册。

模板引擎则很简洁,在assets目录中编写模板,然后XServer.render(data,templete)即可。

XServer可以动态注册第三方插件,比如新增API,或者告诉XServer特殊对象如何处理,不过目前并没有定义这部分能力。

API组件

Viewer

包含以下API:MemoryView、ClassView、MethodView和wsMethodView

MemoryView提供基本的内存修改、Dump能力。

ClassView提供对类和方法的浏览,用来了解和查看应用的结构。

MethodView和wsMethodView提供对方法调用与返回的实时监控,同时将被监控的方法变为远程调用。

Tracer

包含两个API:Tracer和wsTracer

提供对应用执行流的方法粒度跟踪,批量监控并记录方法调用与返回,以及对应的参数和结果。

用于分析应用执行流,定位关键函数。

Invoker

包含两个API:Invoke和Invoke2

提供并完成对应用内方法的远程调用,也管理保存的对象实例。

MethodView界面里的Invoke提供的是基本调用,适用于一些简单的情况。

wsMethodView里使用了Invoke2调用,设置了Burp等代理后,可以拦截并修改对应方法的调用,可以处理复杂对象,也支持在Burp等工具中直接重放、爆破等。建议使用Invoke2。

Injector

API:TODO

提供动态注入SO,APK的能力,用于启动frida-gadget或动态启动其它Xposed插件。

Handler组件

处理反射

包含ClassHandler、MethodHandler

用于通过反射获取各种类与方法的对象,提取和处理其中信息。

处理注入

包含两个handler:HookHandler、ObjectHandler

HookHandler用于为其他组件提供Hook能力,并定义了XServer使用的Hook接口。

ObjectHandler用于管理APP中的各类对象实例,在XServer内部收集和复用各类对象实例。Invoke2依赖此功能,Invoke2处理复杂对象时通常不创建对象,而是通过ObjectHandler复用APP自身使用的对象。

深度操作

目前包含MemoryHandler

提供内存操作,利用内部类Libcore实现,没有使用SO。

可以用于Dump内存寻找Demo,也可以动态修改内存。

TODO:提供SO和APK加载

TODO:提供C层Hook,利用SO实现,或许可以使用substrate,或许可以现场gcc?

TODO:集成一些比较有用的Hook

对象处理ObjectParser

定义了XServer对于各类对象的序列化、反序列化逻辑。

对应的逻辑在XServer中注册。

目前包括了字符串、字节数组、整型的处理逻辑,以及使用ObjectHandler来存取对象的处理逻辑。

这部分可以较为方便地自行增添和注册,也欢迎PR。

xserver's People

Contributors

gflkdns avatar krosxx avatar monkeylord avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

xserver's Issues

Didn't find class "monkeylord.XServer.XServer" on path:

执行:frida -U monkeylord.xserver -l XServer.js

报错:
不知道这样会有什么影响?
XServer Frida Tool
By Monkeylord
[XServer]Loading XServer from /data/local/tmp/xserver.apk
Error: java.lang.ClassNotFoundException: Didn't find class "monkeylord.XServer.XServer" on path: DexPathList[[zip file "/data/local/tmp/xserver.apk"],nativeLibraryDirectories=[/system/lib64, /system/product/lib64]]
at frida/node_modules/frida-java-bridge/lib/env.js:126
at frida/node_modules/frida-java-bridge/lib/class-factory.js:459
at frida/node_modules/frida-java-bridge/lib/class-factory.js:840
at frida/node_modules/frida-java-bridge/lib/class-factory.js:128
at frida/node_modules/frida-java-bridge/lib/class-factory.js:83
at loadXServer (/XServer.js:313)
at /XServer.js:364
at frida/node_modules/frida-java-bridge/lib/vm.js:11
at /XServer.js:369
[Pixel 2::monkeylord.xserver]-> help

不知道是不是这个原因导致 hook不到加密方法

Memory Editor dump报错

/sdcard/XServer.dump: open failed: EACCES (Permission denied)

权限怎么设置?

这个工具非常棒,感谢

Operation not permitted

启动后报
/art: setrlimit(RLIMIT_CORE) failed for pid 2576: Operation not permitted 错误
然后在pc端输入ip地址和端口号也无法访问

查看参数调用的值与一个improve请求

大佬好,有两个问题请教下:
1.使用XServer Hook到目标的函数调用了两个参数,都是String类型,但是第二个是@1e51c87 这种形式,个人推测是调用一个地址或参数名,如何用XServer看这个参数的值呢。
2. 目标app可能有反调试机制或者是测试机比较老,容易卡退重启。我已经知道过滤器该过滤哪些类名、方法名,能不能我在测试机写一个txt,XServer每次加载后自动读取这个txt,自动帮我Hook该txt指定的过滤器呢,这样就不用每次机器重启我还得重新点Tracer-Classs Filter--Method Filter --Hook 了。
最后感谢大佬的工作,工具很好用。

使用产生的问题

使用frida启动会有读写权限的问题
image
使用xpoosed启动,仅出现一个index页面
image

8000端口返回空

image
image
我有哪里做的不对吗
android 11 miui 12.5 面具 root frida环境 无xp
copy apk to tmp/xserver.apk
手机上再安装xserver启动选择目标app 然后点击apply
转发端口 8000 或者目标进程pid都打不开 求帮忙看看应该怎么操作

8000 端口打不开,xposed 模块日志有报错

网页未发送数据:
image
查看模块日志发现:

[ 2022-01-30T00:04:09.750        0:   684:  1348 I/LSPosedLogcat   ] New log file: /data/adb/lspd/log/verbose_2022-01-30T00:04:09.75.log
[ 2022-01-30T00:04:29.258    10350: 19640: 19640 I/LSPosed         ] Loading modules for com.example.buttontoast/10350
[ 2022-01-30T00:04:29.260    10350: 19640: 19640 I/LSPosed-Bridge  ] Loading module monkeylord.xserver from /data/app/monkeylord.xserver-1f9k9skhlD_6N4v1ahiAuw==/base.apk
[ 2022-01-30T00:04:29.341    10350: 19640: 19640 I/LSPosed-Bridge  ]   Loading class monkeylord.XServer.XposedEntry
[ 2022-01-30T00:04:29.567    10350: 19640: 19640 E/LSPosed-Bridge  ] java.lang.NullPointerException: Attempt to invoke interface method 'boolean java.util.Enumeration.hasMoreElements()' on a null object reference
	at com.blankj.utilcode.util.NetworkUtils.getIPAddress(NetworkUtils.java:515)
	at monkeylord.XServer.XposedEntry.handleLoadPackage(XposedEntry.java:105)
	at de.robv.android.xposed.IXposedHookLoadPackage$Wrapper.handleLoadPackage(Unknown Source:2)
	at de.robv.android.xposed.callbacks.XC_LoadPackage.call(Unknown Source:6)
	at de.robv.android.xposed.callbacks.XCallback.callAll(Unknown Source:28)
	at D1.afterHookedMethod(Unknown Source:111)
	at de.robv.android.xposed.LspHooker.handleHookedMethod(Unknown Source:136)
	at LspHooker_.getClassLoader(Unknown Source:8)
	at android.app.LoadedApk.getResources(LoadedApk.java:1034)
	at android.app.ContextImpl.createAppContext(ContextImpl.java:2357)
	at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5874)
	at java.lang.reflect.Method.invoke(Native Method)
	at de.robv.android.xposed.LspHooker.handleHookedMethod(Unknown Source:107)
	at LspHooker_.handleBindApplication(Unknown Source:11)
	at android.app.ActivityThread.access$1200(ActivityThread.java:206)
	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1686)
	at android.os.Handler.dispatchMessage(Handler.java:106)
	at android.os.Looper.loop(Looper.java:201)
	at android.app.ActivityThread.main(ActivityThread.java:6882)
	at java.lang.reflect.Method.invoke(Native Method)
	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:873)

127网页界面无法打印堆栈 看不到调用信息

但是在xposed里面是可以看到日志 hook到那个方法了 网页界面不会打印堆栈 看不到调用信息 已经开启了hook模式的
image
我是看别人介绍你这个软件使用 但是就是没有这个界面加载出来 xposed框架日志都有hook到指定方法了

主动调用任意函数报错

08-12 10:22:14.686 8637-9212/? W/System.err: java.net.SocketException: sendto failed: EBADF (Bad file descriptor)
        at libcore.io.IoBridge.maybeThrowAfterSendto(IoBridge.java:542)
        at libcore.io.IoBridge.sendto(IoBridge.java:511)
        at java.net.PlainSocketImpl.write(PlainSocketImpl.java:500)
        at java.net.PlainSocketImpl.access$100(PlainSocketImpl.java:37)
08-12 10:22:14.687 8637-9212/? W/System.err:     at java.net.PlainSocketImpl$PlainSocketOutputStream.write(PlainSocketImpl.java:266)
        at java.io.OutputStream.write(OutputStream.java:82)
        at libcore.io.Streams.writeSingleByte(Streams.java:53)
        at java.net.PlainSocketImpl$PlainSocketOutputStream.write(PlainSocketImpl.java:262)
        at monkeylord.XServer.utils.NanoWSD$WebSocketFrame.write(NanoWSD.java:702)
        at monkeylord.XServer.utils.NanoWSD$WebSocket.sendFrame(NanoWSD.java:390)
        at monkeylord.XServer.utils.NanoWSD$WebSocket.send(NanoWSD.java:385)
        at monkeylord.XServer.api.wsMethodViewNew$ws.trySend(wsMethodViewNew.java:61)
        at monkeylord.XServer.api.wsMethodViewNew$MethodHook.beforeHookedMethod(wsMethodViewNew.java:128)
        at monkeylord.XServer.XposedEntry$1$1.beforeHookedMethod(XposedEntry.java:91)
        at de.robv.android.xposed.XposedBridge.handleHookedMethod(XposedBridge.java:340)
        at com.mywickr.util.RootUtils.isRooted(<Xposed>)
        at java.lang.reflect.Method.invoke(Native Method)
        at monkeylord.XServer.api.Invoke.handle(Invoke.java:27)
        at monkeylord.XServer.api.BaseOperation.handle(BaseOperation.java:22)
        at monkeylord.XServer.XServer.serveHttp(XServer.java:128)
        at monkeylord.XServer.utils.NanoWSD.serve(NanoWSD.java:164)
        at monkeylord.XServer.utils.NanoHTTPD$HTTPSession.execute(NanoHTTPD.java:1973)
        at monkeylord.XServer.utils.NanoHTTPD$ClientHandler.run(NanoHTTPD.java:1522)
        at java.lang.Thread.run(Thread.java:818)
    Caused by: android.system.ErrnoException: sendto failed: EBADF (Bad file descriptor)
        at libcore.io.Posix.sendtoBytes(Native Method)
        at libcore.io.Posix.sendto(Posix.java:211)
        at libcore.io.BlockGuardOs.sendto(BlockGuardOs.java:278)
        at libcore.io.IoBridge.sendto(IoBridge.java:509)
    	... 22 more
08-12 10:22:14.689 8637-9212/? E/[XServer Debug]: result: null
08-12 10:22:14.690 8637-9212/? W/System.err: java.net.SocketException: sendto failed: EBADF (Bad file descriptor)
        at libcore.io.IoBridge.maybeThrowAfterSendto(IoBridge.java:542)
        at libcore.io.IoBridge.sendto(IoBridge.java:511)
        at java.net.PlainSocketImpl.write(PlainSocketImpl.java:500)
        at java.net.PlainSocketImpl.access$100(PlainSocketImpl.java:37)
        at java.net.PlainSocketImpl$PlainSocketOutputStream.write(PlainSocketImpl.java:266)
        at java.io.OutputStream.write(OutputStream.java:82)
        at libcore.io.Streams.writeSingleByte(Streams.java:53)
        at java.net.PlainSocketImpl$PlainSocketOutputStream.write(PlainSocketImpl.java:262)
        at monkeylord.XServer.utils.NanoWSD$WebSocketFrame.write(NanoWSD.java:702)
        at monkeylord.XServer.utils.NanoWSD$WebSocket.sendFrame(NanoWSD.java:390)
        at monkeylord.XServer.utils.NanoWSD$WebSocket.send(NanoWSD.java:385)
        at monkeylord.XServer.api.wsMethodViewNew$ws.trySend(wsMethodViewNew.java:61)
08-12 10:22:14.691 8637-9212/? W/System.err:     at monkeylord.XServer.api.wsMethodViewNew$MethodHook.afterHookedMethod(wsMethodViewNew.java:171)
        at monkeylord.XServer.XposedEntry$1$1.afterHookedMethod(XposedEntry.java:107)
        at de.robv.android.xposed.XposedBridge.handleHookedMethod(XposedBridge.java:374)
        at com.mywickr.util.RootUtils.isRooted(<Xposed>)
        at java.lang.reflect.Method.invoke(Native Method)
        at monkeylord.XServer.api.Invoke.handle(Invoke.java:27)
        at monkeylord.XServer.api.BaseOperation.handle(BaseOperation.java:22)
        at monkeylord.XServer.XServer.serveHttp(XServer.java:128)
        at monkeylord.XServer.utils.NanoWSD.serve(NanoWSD.java:164)
        at monkeylord.XServer.utils.NanoHTTPD$HTTPSession.execute(NanoHTTPD.java:1973)
        at monkeylord.XServer.utils.NanoHTTPD$ClientHandler.run(NanoHTTPD.java:1522)
        at java.lang.Thread.run(Thread.java:818)
    Caused by: android.system.ErrnoException: sendto failed: EBADF (Bad file descriptor)
        at libcore.io.Posix.sendtoBytes(Native Method)
        at libcore.io.Posix.sendto(Posix.java:211)
        at libcore.io.BlockGuardOs.sendto(BlockGuardOs.java:278)
        at libcore.io.IoBridge.sendto(IoBridge.java:509)
    	... 22 more

目前相关方法无法进行hook

系统: 安卓10
是否root: 已root
机器:pixel 3
frida版本:16.1.4
frida-server版本:16.1.4
Xserver版本:0.7.3-2(最新版)

进入8000端口的网页之后,能够查看到当前调用的方法,在Mass Monitor页面勾选要hook的方法之后,在手机上点击和该方法对应的按扭之后,日志不打印任何调用信息,看终端里也只是简单的调用:
image
但是在使用原版frida,写好hook函数的js文件之后,hook对应函数,是可以hook到该方法的,打印出调用的参数:
image

apply后无效

com.android.server.telecom.AsyncRingtonePlayer$1

com.android.server.telecom.AsyncRingtonePlayer

com.android.server.telecom.BluetoothManager$1

com.android.server.telecom.BluetoothManager$2

转发后进入页面没有解析我选择得那个app得所有方法,是不能解析带壳得吗?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.