0x1 介绍&安装Objection

objection是基于frida的命令行hook工具, 可以让你不写代码, 敲几句命令就可以对java函数的高颗粒度hook, 还支持RPC调用

目前只支持Java层的hook, 但是objection有提供插件接口, 可以自己写frida脚本去定义接口

比如葫芦娃大佬的脱壳插件, 实名推荐: FRIDA-DEXDump

官方仓库: objection

安装条件

1. python版本 > 3.4
2. pip版本 > 9.0

安装命令

pip3 install objection

安装完成后, 直接输入objection, 就可以看到食用方法了

Usage: objection [OPTIONS] COMMAND [ARGS]...

       _   _         _   _
   ___| |_|_|___ ___| |_|_|___ ___
  | . | . | | -_|  _|  _| | . |   |
  |___|___| |___|___|_| |_|___|_|_|
        |___|(object)inject(ion)

       Runtime Mobile Exploration
          by: @leonjza from @sensepost

  By default, communications will happen over USB, unless the --network
  option is provided.

Options:
  -N, --network            Connect using a network connection instead of USB.
                           [default: False]
  -h, --host TEXT          [default: 127.0.0.1]
  -p, --port INTEGER       [default: 27042]
  -ah, --api-host TEXT     [default: 127.0.0.1]
  -ap, --api-port INTEGER  [default: 8888]
  -g, --gadget TEXT        Name of the Frida Gadget/Process to connect to.
                           [default: Gadget]
  -S, --serial TEXT        A device serial to connect to.
  -d, --debug              Enable debug mode with verbose output. (Includes
                           agent source map in stack traces)
  --help                   Show this message and exit.

Commands:
  api          Start the objection API server in headless...
  device_type  Get information about an attached device.
  explore      Start the objection exploration REPL.
  patchapk     Patch an APK with the frida-gadget.so.
  patchipa     Patch an IPA with the FridaGadget dylib.
  run          Run a single objection command.
  version      Prints the current version and exists.

0x2 简单使用

1. 空格键: 忘记命令直接输入空格键, 会有提示与补全
2. help: help [command] 会有详细介绍指定命令的作用与例子
3. jobs: 任务管理系统, 可以方便的查看与删除任务

启动Frida-server并转发端口

adb forward tcp:27034 tcp:27034

附加需要调试的app, 进入交互界面

objection -g [packageName] explore

可以使用该env命令枚举与所讨论的应用程序相关的其他有趣目录: env

com.opera.mini.native on (samsung: 6.0.1) [usb] # env

Name                    Path

----------------------  ------------------------------------------------------------

filesDirectory          /data/user/0/com.opera.mini.native/files
cacheDirectory          /data/user/0/com.opera.mini.native/cache
externalCacheDirectory  /storage/emulated/0/Android/data/com.opera.mini.native/cache
codeCacheDirectory      /data/user/0/com.opera.mini.native/code_cache
obbDir                  /storage/emulated/0/Android/obb/com.opera.mini.native
packageCodePath         /data/app/com.opera.mini.native-1/base.apk

我们可以使用以下file download命令从远程文件系统中下载文件: file download [file] [outfile]

com.opera.mini.native on (samsung: 6.0.1) [usb] # file download fhash.dat fhash.dat
Downloading /data/user/0/com.opera.mini.native/cache/fhash.dat to fhash.dat

可以列出app具有的所有avtivity: android hooking list activities

com.opera.mini.native on (samsung: 6.0.1) [usb] # android hooking list activities
com.facebook.ads.AudienceNetworkActivity
com.google.android.gms.ads.AdActivity
com.google.android.gms.auth.api.signin.internal.SignInHubActivity
com.google.android.gms.common.api.GoogleApiActivity
com.opera.android.AssistActivity
com.opera.android.MiniActivity
com.opera.android.ads.AdmobIntentInterceptor
com.opera.mini.android.Browser

Found 8 classes

启动指定avtivity: android intent launch_activity [class_activity]

com.opera.mini.native on (samsung: 6.0.1) [usb] # android intent launch_activity com.facebook.ads.AudienceNetworkActivity
Launching Activity: com.facebook.ads.AudienceNetworkActivity...

RPC 调用命令: curl -s "http://127.0.0.1:8888/rpc/invoke/androidHookingListActivities"

$ curl -s "http://127.0.0.1:8888/rpc/invoke/androidHookingListActivities"
["com.reddit.frontpage.StartActivity","com.reddit.frontpage.IntroductionActivity", ... snip ...]

- RPC调用执行脚本:`url -X POST -H "Content-Type: text/javascript" http://127.0.0.1:8888/script/runonce -d "@script.js"`

$ cat script.js
{
    send(Frida.version);
}

[{"payload":"12.8.0","type":"send"}]

RPC WIKI

0x3 API介绍

以下只是写了一部分指令和功能, 详细的功能需要合理运用空格和help呦

memcMemory 指令

memory list modules //枚举当前进程模块
memory list exports [lib_name] //查看指定模块的导出函数
memory list exports libart.so --json /root/libart.json //将结果保存到json文件中
memory search --string --offsets-only //搜索内存

android heap

//堆内存中搜索指定类的实例, 可以获取该类的实例id
search instances search instances com.xx.xx.class

//直接调用指定实例下的方法
android heap execute [ins_id] [func_name]

//自定义frida脚本, 执行实例的方法
android heap execute [ins_id]

root

//尝试关闭app的root检测
android root disable

//尝试模拟root环境
android root simulate

ui

//截图
android ui screenshot [image.png]

//设置FLAG_SECURE权限
android ui FLAG_SECURE false

内存漫游

//列出内存中所有的类
android hooking list classes

//在内存中所有已加载的类中搜索包含特定关键词的类
android hooking search classes [search_name] 

//在内存中所有已加载的方法中搜索包含特定关键词的方法
android hooking search methods [search_name] 

//直接生成hook代码
android hooking generate simple [class_name]

hook 方式

 /*
  hook指定方法, 如果有重载会hook所有重载,如果有疑问可以看
  --dump-args : 打印参数
  --dump-backtrace : 打印调用栈
  --dump-return : 打印返回值
  */
android hooking watch class_method com.xxx.xxx.methodName --dump-args --dump-backtrace --dump-return

//hook指定类, 会打印该类下的所以调用
android hooking watch class com.xxx.xxx

//设置返回值(只支持bool类型)
android hooking set return_value com.xxx.xxx.methodName false

Spawn方式Hook

objection -g packageName explore --startup-command '[obejection_command]'

activity和service操作

//枚举activity
android hooking list activities

//启动activity
android intent launch_activity [activity_class]

//枚举services
android hooking list services

//启动services
android intent launch_service [services_class]

任务管理器

//查看任务列表
jobs list

//关闭任务
jobs kill [task_id]

关闭 app ssl 校验

android sslpinning disable

监控系统剪贴板

//获取Android剪贴板服务上的句柄并每5秒轮询一次用于数据。 如果发现新数据,与之前的调查不同,则该数据将被转储到屏幕上。
help android  clipboard

执行命令

help android shell_exec [command]

插件编写 : objection pluging

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐