241 lines
9.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Frida Kılavuzu
{{#include ../../../banners/hacktricks-training.md}}
## Kurulum
Yükleyin **frida tools**:
```bash
pip install frida-tools
pip install frida
```
**İndirip kurun** Android cihazına **frida server** ([Download the latest release](https://github.com/frida/frida/releases)).\
Tek satırlık komut: adb'yi root modunda yeniden başlatmak, ona bağlanmak, frida-server'ı yüklemek, çalıştırma izinleri verip arka planda çalıştırmak:
```bash
adb root; adb connect localhost:6000; sleep 1; adb push frida-server /data/local/tmp/; adb shell "chmod 755 /data/local/tmp/frida-server"; adb shell "/data/local/tmp/frida-server &"
```
**Kontrol et** eğer **çalışıyorsa**:
```bash
frida-ps -U #List packages and processes
frida-ps -U | grep -i <part_of_the_package_name> #Get all the package name
```
## Frida server vs. Gadget (root vs. no-root)
Frida ile Android uygulamalarını enstrümente etmenin iki yaygın yolu:
- Frida server (rooted devices): Cihaza yerel (native) bir daemon push edip çalıştırır; bu daemon herhangi bir process'e attach olmanızı sağlar.
- Frida Gadget (no root): Frida'yı APK içine shared library olarak paketler ve hedef process içinde otomatik olarak yükler.
Frida server (rooted)
```bash
# Download the matching frida-server binary for your device's arch
# https://github.com/frida/frida/releases
adb root
adb push frida-server-<ver>-android-<arch> /data/local/tmp/frida-server
adb shell chmod 755 /data/local/tmp/frida-server
adb shell /data/local/tmp/frida-server & # run at boot via init/magisk if desired
# From host, list processes and attach
frida-ps -Uai
frida -U -n com.example.app
```
Frida Gadget (no-root)
1) APK'nin paketini açın, gadget .so ve yapılandırmayı ekleyin:
- libfrida-gadget.so dosyasını lib/<abi>/ içine koyun (ör. lib/arm64-v8a/)
- assets/frida-gadget.config dosyasını, script yükleme ayarlarınızla oluşturun
Örnek frida-gadget.config
```json
{
"interaction": { "type": "script", "path": "/sdcard/ssl-bypass.js" },
"runtime": { "logFile": "/sdcard/frida-gadget.log" }
}
```
2) Gadget'in erken başlatılmasını sağlayacak şekilde referans verin/yükleyin:
- En kolay: Application.onCreate() içinde System.loadLibrary("frida-gadget") çağıran küçük bir Java stub'u ekleyin veya zaten var olan native lib yüklemesini kullanın.
3) APK'yı yeniden paketleyin ve imzalayın, sonra yükleyin:
```bash
apktool d app.apk -o app_m
# ... add gadget .so and config ...
apktool b app_m -o app_gadget.apk
uber-apk-signer -a app_gadget.apk -o out_signed
adb install -r out_signed/app_gadget-aligned-debugSigned.apk
```
4) Host'tan gadget process'e attach edin:
```bash
frida-ps -Uai
frida -U -n com.example.app
```
Notlar
- Gadget bazı korumalar tarafından tespit edilebilir; isimleri/yolları gizli tutun ve gerekirse geç/koşullu olarak yükleyin.
- Sertleştirilmiş uygulamalarda, tercihen rooted testleri server + late attach ile yapın veya Magisk/Zygisk gizleme ile kombinleyin.
## Eğitimler
### [Eğitim 1](frida-tutorial-1.md)
**Kaynak**: [https://medium.com/infosec-adventures/introduction-to-frida-5a3f51595ca1](https://medium.com/infosec-adventures/introduction-to-frida-5a3f51595ca1)\
**APK**: [https://github.com/t0thkr1s/frida-demo/releases](https://github.com/t0thkr1s/frida-demo/releases)\
**Kaynak Kod**: [https://github.com/t0thkr1s/frida-demo](https://github.com/t0thkr1s/frida-demo)
**Okumak için [bağlantıya tıklayın](frida-tutorial-1.md).**
### [Eğitim 2](frida-tutorial-2.md)
**Kaynak**: [https://11x256.github.io/Frida-hooking-android-part-2/](https://11x256.github.io/Frida-hooking-android-part-2/) (Bölümler 2, 3 & 4)\
**APKs ve Kaynak kodu**: [https://github.com/11x256/frida-android-examples](https://github.com/11x256/frida-android-examples)
**Okumak için [bağlantıya tıklayın.](frida-tutorial-2.md)**
### [Eğitim 3](owaspuncrackable-1.md)
**Kaynak**: [https://joshspicer.com/android-frida-1](https://joshspicer.com/android-frida-1)\
**APK**: [https://github.com/OWASP/owasp-mstg/blob/master/Crackmes/Android/Level_01/UnCrackable-Level1.apk](https://github.com/OWASP/owasp-mstg/blob/master/Crackmes/Android/Level_01/UnCrackable-Level1.apk)
**Okumak için [bağlantıya tıklayın](owaspuncrackable-1.md).**
**Daha fazla Awesome Frida script'ini şurada bulabilirsiniz:** [**https://codeshare.frida.re/**](https://codeshare.frida.re)
## Hızlı Örnekler
### Komut satırından Frida çağırma
```bash
frida-ps -U
#Basic frida hooking
frida -l disableRoot.js -f owasp.mstg.uncrackable1
#Hooking before starting the app
frida -U --no-pause -l disableRoot.js -f owasp.mstg.uncrackable1
#The --no-pause and -f options allow the app to be spawned automatically,
#frozen so that the instrumentation can occur, and the automatically
#continue execution with our modified code.
```
### Temel Python Betiği
```python
import frida, sys
jscode = open(sys.argv[0]).read()
process = frida.get_usb_device().attach('infosecadventures.fridademo')
script = process.create_script(jscode)
print('[ * ] Running Frida Demo application')
script.load()
sys.stdin.read()
```
### Hooking parametresiz fonksiyonlar
`sg.vantagepoint.a.c` sınıfının `a()` fonksiyonunu Hooklayın.
```javascript
Java.perform(function () {
; rootcheck1.a.overload().implementation = function() {
rootcheck1.a.overload().implementation = function() {
send("sg.vantagepoint.a.c.a()Z Root check 1 HIT! su.exists()");
return false;
};
});
```
Hook java `exit()`
```javascript
var sysexit = Java.use("java.lang.System")
sysexit.exit.overload("int").implementation = function (var_0) {
send("java.lang.System.exit(I)V // We avoid exiting the application :)")
}
```
Hook MainActivity `.onStart()` & `.onCreate()`
```javascript
var mainactivity = Java.use("sg.vantagepoint.uncrackable1.MainActivity")
mainactivity.onStart.overload().implementation = function () {
send("MainActivity.onStart() HIT!!!")
var ret = this.onStart.overload().call(this)
}
mainactivity.onCreate.overload("android.os.Bundle").implementation = function (
var_0
) {
send("MainActivity.onCreate() HIT!!!")
var ret = this.onCreate.overload("android.os.Bundle").call(this, var_0)
}
```
android `.onCreate()`'ine hook uygula
```javascript
var activity = Java.use("android.app.Activity")
activity.onCreate.overload("android.os.Bundle").implementation = function (
var_0
) {
send("Activity HIT!!!")
var ret = this.onCreate.overload("android.os.Bundle").call(this, var_0)
}
```
### Parametrelerle Hooking fonksiyonları ve değeri alma
Bir decryption fonksiyonunu hooking. Girdiyi yazdır, orijinal fonksiyonu çağırıp girdiyi decrypt et ve son olarak düz veriyi yazdır:
```javascript
function getString(data) {
var ret = ""
for (var i = 0; i < data.length; i++) {
ret += data[i].toString()
}
return ret
}
var aes_decrypt = Java.use("sg.vantagepoint.a.a")
aes_decrypt.a.overload("[B", "[B").implementation = function (var_0, var_1) {
send("sg.vantagepoint.a.a.a([B[B)[B doFinal(enc) // AES/ECB/PKCS7Padding")
send("Key : " + getString(var_0))
send("Encrypted : " + getString(var_1))
var ret = this.a.overload("[B", "[B").call(this, var_0, var_1)
send("Decrypted : " + ret)
var flag = ""
for (var i = 0; i < ret.length; i++) {
flag += String.fromCharCode(ret[i])
}
send("Decrypted flag: " + flag)
return ret //[B
}
```
### Hooking fonksiyonları ve onları girdimizle çağırma
Bir string alan bir fonksiyonu Hook'la ve onu başka bir string ile çağır (from [here](https://11x256.github.io/Frida-hooking-android-part-2/))
```javascript
var string_class = Java.use("java.lang.String") // get a JS wrapper for java's String class
my_class.fun.overload("java.lang.String").implementation = function (x) {
//hooking the new function
var my_string = string_class.$new("My TeSt String#####") //creating a new String by using `new` operator
console.log("Original arg: " + x)
var ret = this.fun(my_string) // calling the original function with the new String, and putting its return value in ret variable
console.log("Return value: " + ret)
return ret
}
```
### Önceden oluşturulmuş bir sınıf nesnesini almak
Oluşturulmuş bir nesnenin bazı özelliklerini çıkarmak istiyorsanız bunu kullanabilirsiniz.
Bu örnekte my_activity sınıfının nesnesini nasıl alacağınızı ve nesnenin özel bir özniteliğini yazdıracak .secret() fonksiyonunu nasıl çağıracağınızı göreceksiniz:
```javascript
Java.choose("com.example.a11x256.frida_test.my_activity", {
onMatch: function (instance) {
//This function will be called for every instance found by frida
console.log("Found instance: " + instance)
console.log("Result of secret func: " + instance.secret())
},
onComplete: function () {},
})
```
## Diğer Frida öğreticileri
- [https://github.com/DERE-ad2001/Frida-Labs](https://github.com/DERE-ad2001/Frida-Labs)
- [Part 1 of Advanced Frida Usage blog series: IOS Encryption Libraries](https://8ksec.io/advanced-frida-usage-part-1-ios-encryption-libraries-8ksec-blogs/)
## Referanslar
- [Build a Repeatable Android Bug Bounty Lab: Emulator vs Magisk, Burp, Frida, and Medusa](https://www.yeswehack.com/learn-bug-bounty/android-lab-mobile-hacking-tools)
- [Frida Gadget documentation](https://frida.re/docs/gadget/)
- [Frida releases (server binaries)](https://github.com/frida/frida/releases)
{{#include ../../../banners/hacktricks-training.md}}