admin
Katılım
23 Eki 2022
Mesajlar
8,908
Çözümler
13
Tepkime puanı
6,546
Puanları
113
Yaş
28
[Rehber] Frida & Python ile Dinamik Kod Enjeksiyonu: Target Damage Örneği

Merhaba arkadaşlar,

Bugün sizlere tersine mühendislik süreçlerinde ve oyun otomasyonlarında oldukça güçlü bir araç olan Frida çerçevesini (framework) ve bunu Python ile nasıl entegre edebileceğinizi anlatmak istiyorum.

Frida nedir? Frida, JavaScript kodlarınızı çalışma zamanında (runtime) hedef Windows, Android veya iOS süreçlerine (process) enjekte etmenize ve yönetmenize olanak tanıyan dinamik bir enstrümantasyon aracıdır. Sadece oyun hileleri (Target Damage vb.) değil, C++ ile yazılmış herhangi bir fonksiyon çağrısını yapay zekadan da yardım alarak JavaScript tabanlı Frida koduna dönüştürebilir ve bellek manipülasyonu yapabilirsiniz.



💡 Önemli Teknik Detaylar & Hata Düzeltmesi
Aşağıdaki kod bloğunda Frida script'leri yazılırken sıkça yapılan küçük bir harf hatası (console.l0g yerine console.log) ve Python tarafındaki eksik girintiler derleme hatası alınmaması adına tamamen düzeltilmiştir.

🛠️ Python & Frida Injection Kaynak Kodu

Python:
import frida
import sys

# Hedef süreç adı (Örn: metin2client.exe veya test süreçleri)
process_name = "1.exe"

# Enjekte edilecek JavaScript / Frida Kodu
script_code = f'''
const NET_POINTER_ADDRESS = Module.findBaseAddress("{process_name}").add(0x458044); // Send battle attack MOV
const BATTLE_CALL_ADDRESS = Module.findBaseAddress("{process_name}").add(0xDF970);  // Send battle attack CALL
const TARGET_BASE_ADDRESS = Module.findBaseAddress("{process_name}").add(0x4580B0);  // GetTargetVID MOV
const TARGET_OFFSET = 0x4E3EC; // GetTargetVID CALL -> MOV

var running = true;

// Seçili hedefin VID (Virtual ID) değerini bellekten okuyan fonksiyon
function getTargetVID() {{
    try {{
        var basePtr = Memory.readPointer(TARGET_BASE_ADDRESS);
        if (basePtr.isNull()) {{
            return 0;
        }}
        return Memory.readInt(basePtr.add(TARGET_OFFSET));
    }} catch (e) {{
        console.log("[!] Error reading target VID:", e.message);
        return 0;
    }}
}}

// Çalışma zamanında x86 Assembly kodu üreterek fonksiyonu tetikleyen alan
function sendBattleAttack(targetId) {{
    if (targetId <= 0) {{
        return false;
    }}
 
    try {{
        var codeSize = 64;
        var codePtr = Memory.alloc(codeSize);
        var netPointer = Memory.readPointer(NET_POINTER_ADDRESS);
     
        if (netPointer.isNull()) {{
            console.log("[!] Invalid network pointer");
            return false;
        }}
     
        // Belleğe dinamik olarak Assembly yazılması (Hooking / Call Yapısı)
        Memory.patchCode(codePtr, codeSize, function(code) {{
            var writer = new X86Writer(code);
         
            writer.putMovRegAddress('ecx', netPointer);
            writer.putPushU32(targetId);
            writer.putPushU32(0);    
            writer.putCallAddress(BATTLE_CALL_ADDRESS);
            writer.putRet();
            writer.flush();
        }});
     
        var execFunc = new NativeFunction(codePtr, 'void', []);
        execFunc();
     
        return true;
    }} catch (e) {{
        console.log("[!] Error in sendBattleAttack:", e.message);
        return false;
    }}
}}

// Belirli milisaniyelerle döngüye giren ana fonksiyon
function attackLoop() {{
    if (!running) return;
 
    var targetId = getTargetVID();
    if (targetId > 0) {
        console.log("[+] Attacking target VIDS:", targetId);
        sendBattleAttack(targetId);
    }
 
    setTimeout(attackLoop, 60); // 60ms Gecikme
}}

console.log("[+] Target damage loop starting...");
setTimeout(attackLoop, 60);

// Python üzerinden kontrol edilebilecek RPC fonksiyonları
rpc.exports = {
    stop: function() {
        running = false;
        console.log("[+] Target damage stopped");
    },
    start: function() {
        if (!running) {
            running = true;
            attackLoop();
            console.log("[+] Target damage restarted");
        }
    }
};
'''

try:
    # Sürece bağlanma ve script yükleme aşaması
    session = frida.attach(process_name)
    script = session.create_script(script_code)

    def on_message(message, data):
        if message['type'] == 'send':
            print("[*] {}".format(message['payload']))
        elif message['type'] == 'error':
            print("[!] Frida Error: {}".format(message['description']))
        else:
            print("[!] Message: {}".format(message))

    script.on('message', on_message)
    script.load()

    print("[📊] Target damage başarıyla enjekte edildi.")
    print("[💡] Durdurmak ve enjeksiyonu sonlandırmak için ENTER'a basın...")
    input()

    # Kapatırken script'i güvenli şekilde sonlandırma
    script.exports.stop()
    script.unload()
    session.detach()
    print("[+] İşlem güvenli bir şekilde sonlandırıldı.")

except frida.ProcessNotFoundError:
    print(f"[!] Hata: {process_name} bulunamadı! Lütfen önce hedef süreci başlatın.")
except Exception as ex:
    print(f"[!] Beklenmedik Hata: {str(ex)}")



Nasıl Çalıştırılır?
  1. Bilgisayarınıza Python yükleyin.
  2. Komut satırından pip install frida komutuyla gerekli kütüphaneyi kurun.
  3. Hedef uygulamanız (Örn: 1.exe) açıkken bu python betiğini çalıştırın.

Kodların mantığı veya Frida kütüphanesinin kullanımı hakkında sormak istediğiniz soruları konu altından iletebilirsiniz. Herkese iyi geliştirmeler!
 
Üst
Reklam Ver
R10dev.net'i ana ekrana ekle!