備忘録

備忘録

Frida の使い方

Ⅰ. はじめに

Frida は JavaScriptを用いてでネイティブアプリをデバッグすることができる強力なツールです。
www.frida.re

Androidアプリをトレースする
※予めAndroidにfrida-serverを入れ、起動しておく必要があります。

frida-trace -U -i *Func* app

Windowsでトレースする

frida-trace -i *Func* notepad.exe

引数を表示する

onEnter: function (log, args, state) {
  for(var i=0; i<10; i++) {
    log("Func args[" + i + "]" + Memory.readUtf8String(args[i]));
  }
},

メモリダンプ

var buf = Memory.readByteArray(args[0], 0x35);
console.log(hexdump(buf, {
  offset: 0,
  length: 0x35,
  header: true,
  ansi: true
}));

f:id:kagasu:20161124114917p:plain

レジスタ(ARMの例)

console.log("r0: " + this.context.r0);
console.log("r1: " + this.context.r1);
console.log("r2: " + this.context.r2);
console.log("r3: " + this.context.r3);
console.log("r4: " + this.context.r4);
console.log("r5: " + this.context.r5);
console.log("r6: " + this.context.r6);
console.log("r7: " + this.context.r7);

レジスタのアドレスを元にメモリダンプする

var buf = Memory.readByteArray(this.context.r1, 0x35);
console.log(hexdump(buf, {
  offset: 0,
  length: 0x35,
  header: true,
  ansi: true
}));

直接アドレスを指定してメモリを読み取る

var pointer = new NativePointer("0x7ad1a4d0");

var buf1 = Memory.readUtf8String(pointer);
console.log(buf1);

アドレス(ポインタ)にオフセットを加える

var address = parseInt(args[1]) + 16; // 16バイトのオフセット
var addressHex = "0x" + address.toString(16);
var pointer = new NativePointer(addressHex);

var buf1 = Memory.readUtf8String(pointer);
console.log(buf1);

Windows で send を frida-trace する場合の例

1. frida-trace する

frida-trace -i "send" hoge.exe

2. send.js を書き換える

onEnter: function (log, args, state) {
  var length = parseInt(args[2]);
  var buf = Memory.readByteArray(args[1], length);
  console.log(hexdump(buf, {
    offset: 0,
    length: length,
    header: true,
    ansi: true
    }));
},

オフセットを指定する場合

frida-trace -U -a libxxx.so!13c8112 xx.xx.xx

System.Security.Cryptography.RijndaelManagedTransform のコンストラクタはkey,ivを引数に取っている
SymmetricAlgorithm の set_Key など

criWareUnity_SetDecryptionKey
System.Security.Cryptography.HashAlgorithm の ComputeHash
BestHTTP の set_RawData はPOSTデータ