當前位置:
首頁 > 知識 > Android hook神器frida(一)

Android hook神器frida(一)

運行環境

● Python – latest 3.x is highly recommended

● Windows, macOS, or Linux

安裝方法

使用命令 sudo pip install frida

或從https://build.frida.re/frida/下載

以cat命令為例,檢查frida是否正確安裝:

$ cp /bin/cat /tmp/cat
$ /tmp/cat

打開一個新的終端,創建example.py ,寫入如下代碼:

import frida
session = frida.attach("cat")
print([x.name for x in session.enumerate_modules()])

在linux系統下,還需執行如下命令確保開啟調試非子進程:

$ sudo sysctl kernel.yama.ptrace_scope=0

然後運行examp.py,應該得到類似如下結果:

基本使用方法

源碼:frida/core.py 和frida/tracer.py

1.枚舉模塊

如果我們執行print(session.enumerate_modules)

就會得到類似如下的結果:

[Module(name="cat", base_address=0x400000, size=20480, path="/bin/cat"), ...]

其中base_address是模塊的基地址

2.枚舉內存範圍

枚舉當前目標進程映射的所有內存範圍:enumerate_ranges(mask)

執行print s.enumerate_ranges("rw-"),會得到類似如下的結果:

[Range(base_address=0x2d4160a06000, size=1019904, protection="rwx"), ...]

base_address是這個範圍的基址。

3.讀寫內存

read_bytes(address, n):從目標進程地址address中讀取n位元組數據。

write_bytes(address, data):將data以位元組形式寫入到address中。

操作模式

(1)注入模式

主要在root或者越獄的手機上使用

(2)嵌入模式

非root非越獄機上使用。通過嵌入一個叫frida-gadget的共享庫到目標app中

(3)預載入模式

不涉及到任何TCP或者對外的通信,同意需要用到共享庫frida-gadget。需要設置環境變數FRIDA_GADGET_SCRIPT用於指向一個js文件。

如linux環境下,可以創建一個包含以下內容的hook.js文件:

"use strict";

rpc.exports = {
init: function {
Interceptor.attach(Module.findExportByName(null, "open"), {
onEnter: function (args) {
var path = Memory.readUtf8String(args[0]);
console.log("open("" + path + "")");
}
});
}
};

然後設置兩個環境變數

LD_PRELOAD=/path/to/frida-gadget.so
FRIDA_GADGET_SCRIPT=/path/to/hook.js

然後啟動目標進程。

同樣可以使用FRIDA_GADGET_ENV=development來開發自己的邏輯,以便於frida-gadget 監控文件更改,一旦發現文件更改後自動重新載入。

函數操作

首先我們來創建一個實驗代碼hello.c

#include
#include

void
f (int n)
{
printf ("Number: %d
", n);
}

int
main (int argc,
char * argv[])
{
int i = 0;

printf ("f is at %p
", f);

while (1)
{
f (i++);
sleep (1);
}
}

執行命令gcc -Wall hello.c -o hello進行編譯,然後運行,記錄f函數的地址0x40057d

(1)hook函數編寫hook代碼hook.py用於hook函數調用,返回函數參數,具體代碼如下:

from __future__ import print_function
import frida
import sys

session = frida.attach("hello")
script = session.create_script("""
Interceptor.attach(ptr("%s"), {
onEnter: function(args) {
send(args[0].toInt32);
}
});
""" % int(sys.argv[1], 16))
def on_message(message, data):
print(message)
script.on("message", on_message)
script.load
sys.stdin.read

執行 python hook.py 0x40057d

得到如下結果:

Android hook神器frida(一)

(2)修改函數參數創建modify.py,代碼如下:

import frida
import sys

session = frida.attach("hello")
script = session.create_script("""
Interceptor.attach(ptr("%s"), {
onEnter: function(args) {
args[0] = ptr("1337");
}
});
""" % int(sys.argv[1], 16))
script.load
sys.stdin.read

執行python modify.py 0x400544後會發現輸出的值變了

Android hook神器frida(一)

(3)函數調用創建call.py

import frida
import sys

session = frida.attach("hello")
script = session.create_script("""
var f = new NativeFunction(ptr("%s"), "void", ["int"]);
f(1911);
f(1911);
f(1911);
""" % int(sys.argv[1], 16))
script.load

運行得到如下結果:

Android hook神器frida(一)

(4)注入字元串並調用函數創建hello.c

#include
#include

int
f (const char * s)
{
printf ("String: %s
", s);
return 0;
}

int
main (int argc,
char * argv[])
{
const char * s = "Testing!";

printf ("f is at %p
", f);
printf ("s is at %p
", s);

while (1)
{
f (s);
sleep (1);
}
}

創建腳本stringhook.py,使用frida注入一段字元串到內存中,然後調用f函數:

from __future__ import print_function
import frida
import sys

session = frida.attach("hi")
script = session.create_script("""
var st = Memory.allocUtf8String(" I love you!");
var f = new NativeFunction(ptr("%s"), "int", ["pointer"]);
// In NativeFunction param 2 is the return value type,
// and param 3 is an array of input types
f(st);
""" % int(sys.argv[1], 16))
def on_message(message, data):
print(message)
script.on("message", on_message)
script.load

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 科技優家 的精彩文章:

同一個tomcat多個項目共享session,一個tomcat兩個項目共享sessionId
ELK日誌框架(2):log4net.ElasticSearch+ Kibana實現日誌記錄和顯示
React Native之APK文件簽名及打包
DotNetCore跨平台~服務匯流排 事件匯流排的重新設計

TAG:科技優家 |

您可能感興趣

ios神器,android平台神器,nplayer android版 mate20pro可用!
Android MultiMedia Framework技術概述
從kernel到Android
Windows、Android、iPhone和Mac都能用的小體積office
微軟計劃將Cortana集成到Outlook for iOS和Android
Microsoft Launcher 4.8 for Android 正式版發布
android permissions分析
微軟Outlook for iOS & Android主管負責Cortana部門
Android Authority年度最佳Android手機出爐:三星Galaxy Note 9
Android 消息機制—ThreadLocal
Google打造Android Automotive OS
Google正在努力為AndroidStudio模擬器添加AndroidGo圖像
4款Android上的Markdown編輯器
Android Auto Wireless上線北美
新版本Google Play拋棄對Android Ice Cream Sandwich支持
Chrome 67 for Android發布
如何檢查你的Iphone、Android及Windows設備存在Spectre Bug
微軟正在iOS和Android上的Outlook中測試Cortana
Motorola One/One Power發布:運行Android One
Nokia 7+曝光採用Android One系統