android动态分析技术,Android逆向之动态分析Frida篇

上期的Android逆向之动态分析so篇大家学习的如何啦?本期斗哥将带来Android逆向之动态分析Frida篇。主要内容有Frida环境搭建与Frida在Android环境下的运行与使用。

0X01 Frida框架安装详解

1.简述:

Frida是以Python为载体,注入Javascript作为Android中执行代码的一款Hook框架,可用Android、ios、linux、win等平台。

2.安装客户端:

在已有python和pip环境的系统下安装frida,如windows则使用pip install frida-tools命令安装frida包。

8f3ff2fbfdd7c7c8339951a6542705fa.gif

da.webp.jpg (102.19 KB, 下载次数: 16)

2018-10-22 15:00 上传

使用frida命令查看版本(成功查看到frida版本表示安装成功)。

8f3ff2fbfdd7c7c8339951a6542705fa.gif

成功.webp.jpg (13.02 KB, 下载次数: 15)

2018-10-22 15:00 上传

2. 安装服务端:

首先到github上下载frida-server,网址为https://github.com/frida/frida/releases

下载与客户端相同版相同的frida-server(注意位数)。

在客户端(windows)上使用adb push命令将frida-servser传到Android设备目录中。

8f3ff2fbfdd7c7c8339951a6542705fa.gif

目录.webp.jpg (63.5 KB, 下载次数: 21)

2018-10-22 15:01 上传

修改frida-servser权限,让frida-servse拥有可执行权限。

8f3ff2fbfdd7c7c8339951a6542705fa.gif

执行.webp.jpg (83.34 KB, 下载次数: 22)

2018-10-22 15:02 上传

运行frida服务器。

8f3ff2fbfdd7c7c8339951a6542705fa.gif

服务器.webp.jpg (18.47 KB, 下载次数: 17)

2018-10-22 15:03 上传

在客户端开启端口转发。

adb forward tcp:27042 tcp:27042

adb forward tcp:27043 tcp:27043

8f3ff2fbfdd7c7c8339951a6542705fa.gif

043.webp.jpg (15.16 KB, 下载次数: 19)

2018-10-22 15:03 上传

使用frida-ps -U或者frida-ps -R命令查看手机端进程(成功查看到进程表示Frida环境搭建成功)。

8f3ff2fbfdd7c7c8339951a6542705fa.gif

成功.webp.jpg (61.15 KB, 下载次数: 17)

2018-10-22 15:04 上传

0X02 Frida框架的初步使用

将frida服务器运行起来后,客户端就可以利用frida API对Android设备中的进程以及APP应用进行操作。

例一:

使用Frida获取android手机当前最前端Activity所在的进程。

[PHP] 纯文本查看 复制代码import frida

rdev = frida.get_usb_device()

front_app = rdev.get_frontmost_application()

print(front_app)

8f3ff2fbfdd7c7c8339951a6542705fa.gif

例1.webp.jpg (21.67 KB, 下载次数: 21)

2018-10-22 15:05 上传

例二:

查看手机所有已安装的android APP应用。

[PHP] 纯文本查看 复制代码import frida

rdev = frida.get_usb_device()

apps = rdev.enumerate_applications()

for app in apps:

print(app)

8f3ff2fbfdd7c7c8339951a6542705fa.gif

应用.webp.jpg (55.12 KB, 下载次数: 19)

2018-10-22 15:06 上传

例三:

frida自带的Messages机制与进程交互模板。

[PHP] 纯文本查看 复制代码import frida, sys

def on_message(message, data):

if message['type'] == 'send':

print("[*] {0}".format(message['payload']))

else:

print(message)

jscode = """

//分析hook点,编写javascript代码

//javascript代码,重点

"""

process = frida.get_usb_device().attach('ds.tetris.android')

script = process.create_script(jscode)

script.on('message', on_message)

script.load()

sys.stdin.read()

0X03 Frida框架解题技巧

Frida可以用来解决CTF中移动安全题,如Frida官网的一个APP例子,就是一道CTF题。以如下的CTF题为例,通过解题过程深入了解Frida的使用。

1. 题目描述:

寻一名可以拿到20000分的高手,在线等很急!

2. 寻找hook点:

MainActivity部分代码如下:

静态分析得到getScore()方法是记录分数的关键。

[PHP] 纯文本查看 复制代码public final void invoke(@NotNull Score arg6) {

Intrinsics.checkParameterIsNotNull(arg6, "$receiver");

if(arg6.getScore() > 20000) {

Game.access$getView$p(Game.this).setScore(0xFFFFFFFF);

}

else {

Game.access$getView$p(Game.this).setScore(arg6.getScore());

}

if(Game.access$getView$p(Game.this).getLevel() < arg6.getLevel() && Game.access$getView$p(Game.this).getLevel() != 0 && (Game.this.getSoundEnabled())) {

DefaultImpls.play$default(Game.access$getSoundtrack$p(Game.this), Sound.LEVEL_UP, 0, 2, null);

}

Game.access$getView$p(Game.this).setLevel(arg6.getLevel());

}

Hook点:setScore方法值置为-1,程序将就会自动为我们解密flag。

[PHP] 纯文本查看 复制代码public void setScore(int arg4) {

if(arg4 == -1) {

UtilsKt.errorhandler(this);

}

this.score = arg4;

View v0 = this._$_findCachedViewById(id.scoreLabel);

Intrinsics.checkExpressionValueIsNotNull(v0, "scoreLabel");

((TextView)v0).setText("Score: " + arg4);

}

3. 解题过程:

(请先阅读Android逆向之静态分析文章)

静态分析完应用逻辑后可知只要将 MainActivity 中的 setScore方法参数值设为-1,程序就会自动为我们解密flag,所以可以通过Frida框架重写setScore方法将值直接设为-1。

8f3ff2fbfdd7c7c8339951a6542705fa.gif

-1.webp.jpg (16.48 KB, 下载次数: 19)

2018-10-22 15:08 上传

用frida-ps -R发现应用进程。

8f3ff2fbfdd7c7c8339951a6542705fa.gif

发现.webp.jpg (61.15 KB, 下载次数: 22)

2018-10-22 15:09 上传

Javascript脚本如下:

[PHP] 纯文本查看 复制代码Java.perform(function() {

var clz = Java.use("ds.tetris.android.MainActivity");

clz.setScore.overload('int').implementation = function(args){

args = -1

clz.setScore.overload('int').call(this,args)

}

});

运行服务器frida-server,客户端使用Frida运行以下命令:

8f3ff2fbfdd7c7c8339951a6542705fa.gif

命令.webp.jpg (51.8 KB, 下载次数: 23)

2018-10-22 15:09 上传

点击游戏开始,程序会解密并弹窗。

8f3ff2fbfdd7c7c8339951a6542705fa.gif

弹窗.webp.jpg (12.61 KB, 下载次数: 15)

2018-10-22 15:10 上传

完整的python代码如下:

[PHP] 纯文本查看 复制代码import frida, sys

def on_message(message, data):

if message['type'] == 'send':

print("[*] {0}".format(message['payload']))

else:

print(message)

jscode = """

Java.perform(function() {

var clz = Java.use("ds.tetris.android.MainActivity");

clz.setScore.overload('int').implementation = function(args){

args = -1

clz.setScore.overload('int').call(this,args)

}

});

"""

process = frida.get_usb_device().attach('ds.tetris.android')

script = process.create_script(jscode)

script.on('message', on_message)

script.load()

sys.stdin.read()

0X04小小总结

本期Android逆向之动态分析Frida篇就为大家介绍到这里啦!各位小伙伴如果在学习的过程中有疑问或者是其他的见解,都可以给斗哥留言!我们下周见!

8f3ff2fbfdd7c7c8339951a6542705fa.gif

qrcode_for_gh_223e082fe8a7_344.jpg (12 KB, 下载次数: 15)

2018-10-22 15:10 上传

你可能感兴趣的:(android动态分析技术)