Zero, a API oficial
Primeiro, instale
(1) montado .Windows frida
pip install frida
pip install frida-tool
Depois de concluída a instalação, basta digitar em um terminal frida-ps
de comando para ver se o sistema pode exibir o atual processo é provar instalação bem-sucedida
frida-ps
PID Name
---- ---------------------------------------------
416 AirPlayUIAgent
596 Android Studio
551 AppleSpell.service
529 CoreServicesUIAgent
264 Dock
266 Finder
402 FolderActionsDispatcher
553 Google Chrome
505 LaterAgent
517 QQ
530 QQ jietu plugin
(2) a instalação frida-servidor telefone .android
https://pypi.python.org/pypi/frida
Download de frida-server-12.8.11-android-arm64.xz
- Após o download, descompacte o arquivo e renomeie o arquivo para:
frida-server
Rename após a conclusão do uso deadb push
comandos enviados para o telefone
> adb push frida-server /data/local/tmp/
> adb shell
$ su
# cd /data/local/tmp/
# chmod 777 frida-server
# ./frida-server
frida-ps execução -U para ver se o telefone em modo normal
frida-ps -U | find "frida"
Use frida-ps -R
pode ser, mas necessidade de ser encaminhado.
> adb forward tcp:27042 tcp:27042
> frida-ps -R
Em segundo lugar, com base no uso
1. rastrear uma determinada função frida-traço -U -i [Função Nome] [nome do pacote]
Rastreamento de aplicativo de telefone
frida-trace -U -i open com.peakx.stickfight.and
Depois de rastrear o sucesso, ele irá criar o seguinte arquivo JavaScript "C: \\ Users \\ admin.000 \\ test área de trabalho \\ \\ __ manipuladores __ \\ libbase.so \\ open.js" no caminho atual, podemos modificar este ficheiro adicionar alguns recursos personalizados. Por exemplo, a função de abertura é modificado:
onEnter: function (log, args, state) {
log("open(" +
"path=\"" + Memory.readUtf8String(args[0]) + "\"" +
", oflag=" + args[1] +
")");
},
2. Força iniciar um processo de aplicação frida -U --no-pausa -f [nome do pacote da aplicação]
frida -U --no-pause -f com.peakx.stickfight.and
Quando a anexar for bem sucedida, você pode começar o gancho funções e objetos Java.
Sobre quadro API Friada em Java pode ver parte do documento oficial , a seguir resume várias comum API.
//加载了 JVM也就是是否运行在Dalvik 或 ART环境中.
-> Java.available
// 列出已加载的类
-> Java.perform(function(){
Java.enumerateLoadedClasses(
{
"onMatch":function(className){
console.log(className)
},
"onComplete":function(){
console.log("onComplete")
}
}
)
})
//Java.use(className) 根据className动态获取一个JavaScript wrapper,
//获取到后可以调用$new()方法来实例化一个对象,也可以调用$dispose()方法进行释放
-> Java.perform(function () {
var Activity = Java.use("android.app.Activity");
var Exception = Java.use("java.lang.Exception");
Activity.onResume.implementation = function () {
throw Exception.$new("Test!");
};
});
3. O pacote de código acima é test.js, então deixe frida executar este arquivo
> frida -U -l Test.js --no-pause -f com.peakx.stickfight.and
4.Frida Às vezes, haverá algumas dicas de tempo limite Para evitar isso, o script dentro do código pode ser embalado em uma setImmediate
função ou exportados como rpc
- Exemplo: código test.js mudou um pouco, e, em seguida, re-executar o comando acima para reimplantar clique.
setImmediate(function() {
Java.perform(function () {
var Activity = Java.use("android.app.Activity");
var Exception = Java.use("java.lang.Exception");
Activity.onResume.implementation = function () {
throw Exception.$new("Test!");
};
});
});
Três, ligar um método Java
- Use
Java.use(className)
comando para obter JavaScript invólucro - Chamar o JavaScript invólucro objeto é a obtenção de um método
[JavaScript wrapper对象].[要Hook的方法名].implementation=function(){...}
Nota 1: Para Gancho se houver vários sobrecarregado, você deve usar
overload()
chamadas de método, os parâmetros devem ser uma correspondência exata, o tipo de parâmetro deve ser um nome que está cheio de referências ao nome completo da classe.
Nota 2: parâmetros do método de gancho, porarguments
acesso de matriz, pode serimplementation
declarado parâmetro correspondente função
Código Android:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.mBtnTest).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(final View v) {
helloAndroid();
test1();
test2(123);
test3("str");
test4("str", true);
}
});
}
private void helloAndroid() {
System.out.println("helloAndroid()");
}
private void test() {
System.out.println("test1()");
}
private void test(int i) {
System.out.println("test2(int) " + i);
}
private void test(String s) {
System.out.println("test3(String) " + s);
}
private void test(String s, boolean b) {
System.out.println("test4(String, boolean) " + s + ", " + b);
}
}
JavaScript Gancho Código
Java.perform(function () {
var MainActivity = Java.use("com.github.fridademo.MainActivity");
MainActivity.helloAndroid.implementation = function () {
console.log("helloAndroid()");
this.private_func();
};
MainActivity.test.overload().implementation = function () {
console.log("test1()");
this.private_func();
};
MainActivity.test.overload("int").implementation = function (i) {
console.log("test2(int): " + i);
this.private_func(i);
};
MainActivity.test.overload("java.lang.String").implementation = function () {
console.log("test3(String): " + arguments[0]);
this.private_func(arguments[0]);
};
MainActivity.test.overload("java.lang.String", "boolean").implementation = function (s, b) {
console.log("test4(String,boolean): " + s + ", " + b);
this.private_func(s, b);
};
});
> frida -U -l Test.js --no-pause -f com.peakx.stickfight.and
Quatro, Gancho uma função nativa
Interceptor.attach(Module.findExportByName("libc.so" , "open"), {
onEnter: function(args) {
console.log(
"open(" +
"path=\"" + Memory.readUtf8String(args[0]) + "\"" +
", oflag=" + args[1] +
")"
)
},
onLeave:function(retval){
}
});
> frida -U -l Test.js --no-pause -f com.peakx.stickfight.and
função quinto lugar, o uso de gancho libc.so módulo python frida open ()
# hook chrome进程的libc.so中的函数open
import frida
import sys
import io
device = frida.get_usb_device()
pid = device.spawn(["com.android.chrome"])
session = device.attach(pid)
device.resume(pid)
scr = """
setImmediate(function() {
Interceptor.attach(Module.findExportByName("libc.so" , "open"), {
onEnter: function(args) {
send("open called! args[0]:",Memory.readByteArray(args[0],256));
},
onLeave:function(retval){
}
});
});
"""
def on_message(message ,data):
file_object=open("d:\\log.txt",'ab+')
file_object.write(message['payload'].encode())
file_object.write(data.split(b'\x00')[0])
file_object.write('\n'.encode())
file_object.close()
script = session.create_script(scr)
script.on("message" , on_message)
script.load()
sys.stdin.read()
referência:
https://www.jianshu.com/p/7be526b77bd2