Anti-Reverse Engineering Techniques Nedir?
Tersine mühendislik önleme teknikleri yazılımı analiz etmeyi ve anlamayı zorlaştırır.
Bir yazılım bileşeninin çalışma prensiplerini ortaya çıkarmak için tersine mühendislik süreci kullanılır.
Yazılım geliştiricileri ve sistem tasarımcıları, ürünlerini tersine mühendislik saldırılarından korumak için çeşitli teknikler kullanırlar.
Bu teknik, kaynak kodunun veya derlenmiş uygulamanın anlaşılmasını zorlaştırır.
Rephrase Kod eklemek, değişken ve işlev adlarını gizlemek veya kod akışını karıştırmak bunu başarmanın yollarından bazılarıdır.
Kod analizi ve anlaşılması, karışıklık nedeniyle zordur. 2 şekilde gerçekleştirilebilir.
Değişkenlerin, işlevlerin ve sınıf adlarının gizlenmesi nedeniyle kodun anlaşılması zordur.
Gerçek dünyada kullanılan belirsizliği giderme teknikleri ise daha karmaşık olabilir.
Rastgele karakterlerden oluşan bir dizi isme dönüştürülebilir.
Gereksiz Kod Ekleme(Adding Junk Code)
Örnek: range(15) döngüsü gereksiz yere eklendi.
Bu döngü kodun işlevini değiştirmez ancak tersine mühendisliği kandırmak için kullanılabilir.
Code Encryption (Kod Şifreleme)
Bu teknikte yazılımın önemli kısımları korunur.
Kodu anlamak zordur. Kod çeşitli güvenlik önlemleriyle korunmaktadır.Bu teknik, yazılımın bozulmasını önlemek için kullanılır.
Bu örnekte gösterilen yöntem Windows işletim sisteminde kullanılmaktadır.
Anti-Debugging teknikleri bir yazılımın geliştirilmesini durdurmak için kullanılır.
Yazılımın çalışmasını durdurmak için ek kod eklenir.
Bunun amacı tersine mühendislik sürecini geciktirmek veya önlemektir.
Tamper Detection (Müdahale Tespiti)
Bu teknikler yazılımın değiştirilip değiştirilmediğini tespit etmek için kullanılır.
Yazılımın bütünlüğü korunur ve mekanizmalar kullanılarak değişiklikler tespit edilebilir.
Dosyanın değeri hesaplanır ve beklenen değerle karşılaştırılır.
Hesaplanan değer beklenen değerle eşleşmezse dosyanın bütünlüğü tehlikeye girer.
Virtualization (Sanallaştırma)
Yazılım sanal ortamda çalıştırılır ve gerçek işletim sistemi veya donanım üzerinde çalışıyormuş gibi görünür.
Yazılımın şifresini çözmek zordur.
Anti-Disassembly Techniques (Söz Dizimi Çözümleme Karşıtı Teknikler)
Sökmeyi önleme teknikleri kodun anlaşılmasını zorlaştırır.
Talimatları değiştirmek, yanlış veya anlamsız talimatlar eklemek ve akış kontrolünü karmaşıklaştırmak, bunu gerçekleştirmek için kullanılan yöntemlerden bazılarıdır.
Anlamsız veya yanlış talimatların eklenmesi kod örneğinde gösterilmiştir.
Tersine mühendislik için işleri daha karmaşık hale getirmek amacıyla sökme işlemi sırasında talimatlar eklenir.
Bu talimatların hiçbir işlevi yoktur veya yanıltıcıdır.
Anti-Debugging tekniklerini kullanarak bir kod örneği
Yukarıdaki kod örneğinde bir senaryo sunulmuştur.
Zaman farklılığı ile çalışan bir timing attack tespiti yapılır.
Zamanlama analizini karmaşık hale getiren şey, profil oluşturma tespiti için rastgele gecikmelerin eklenmesidir.
Süreci karmaşıklaştırmak için sökme önleyici teknikler kullanılır.
Tersine mühendislik önleme teknikleri yazılımı analiz etmeyi ve anlamayı zorlaştırır.
Bir yazılım bileşeninin çalışma prensiplerini ortaya çıkarmak için tersine mühendislik süreci kullanılır.
Yazılım geliştiricileri ve sistem tasarımcıları, ürünlerini tersine mühendislik saldırılarından korumak için çeşitli teknikler kullanırlar.
Bu teknik, kaynak kodunun veya derlenmiş uygulamanın anlaşılmasını zorlaştırır.
Rephrase Kod eklemek, değişken ve işlev adlarını gizlemek veya kod akışını karıştırmak bunu başarmanın yollarından bazılarıdır.
Kod analizi ve anlaşılması, karışıklık nedeniyle zordur. 2 şekilde gerçekleştirilebilir.
Python:
def x1y2z3():
_a = 42
_b = 58
_result = _a * _b
return _result
Değişkenlerin, işlevlerin ve sınıf adlarının gizlenmesi nedeniyle kodun anlaşılması zordur.
Gerçek dünyada kullanılan belirsizliği giderme teknikleri ise daha karmaşık olabilir.
Rastgele karakterlerden oluşan bir dizi isme dönüştürülebilir.
Gereksiz Kod Ekleme(Adding Junk Code)
Python:
def mnpQRs():
_a = 1
_b = 2
# Gereksiz bir döngü ekleme
for _i in range(15):
_a += (_i * _b) % 4
# Gereksiz bir işlem ekleme
_c = 0
for _j in range(7):
_c += (_j * _a) // 3
return _c
Bu döngü kodun işlevini değiştirmez ancak tersine mühendisliği kandırmak için kullanılabilir.
Code Encryption (Kod Şifreleme)
Bu teknikte yazılımın önemli kısımları korunur.
Kodu anlamak zordur. Kod çeşitli güvenlik önlemleriyle korunmaktadır.Bu teknik, yazılımın bozulmasını önlemek için kullanılır.
Bu örnekte gösterilen yöntem Windows işletim sisteminde kullanılmaktadır.
Python:
def obfEncrypt(xyz):
# Veriyi basit bir şifreleme algoritması ile şifreleme
result = ""
for ch in xyz:
temp = chr(ord(ch) + 3) # Her karakteri üç ileri kaydır
result += temp
# Gereksiz bir döngü ekleme
junk = ""
for _ in range(5):
junk += result[::-1] # Şifrelenmiş veriyi ters çevir ve ekle
return result
def obfDecrypt(encoded):
# Şifreli veriyi çözmek için ters işlem yapma
decoded = ""
# Gereksiz bir işlem ekleme
for _ in range(5):
junk = encoded[::-1] # Şifrelenmiş veriyi ters çevir
for ch in encoded:
temp = chr(ord(ch) - 3) # Her karakteri üç geri kaydır
decoded += temp
return decoded
Yazılımın çalışmasını durdurmak için ek kod eklenir.
Bunun amacı tersine mühendislik sürecini geciktirmek veya önlemektir.
Python:
def QrXyZ():
# k32.IsDebuggerPresent() işlevi, hata ayıklama aracının varlığını kontrol eder.
import ctypes as ct
k32 = ct.windll.kernel32
dbgPresent = k32.IsDebuggerPresent()
# Eğer bir hata ayıklama aracı algılanırsa, k32.ExitProcess(0) işlevi kullanılarak program sonlandırılır.
if dbgPresent:
k32.ExitProcess(0)
# Gereksiz bir döngü ekleme
junkValue = 1
for i in range(100):
junkValue *= i + 1
return junkValue
Tamper Detection (Müdahale Tespiti)
Bu teknikler yazılımın değiştirilip değiştirilmediğini tespit etmek için kullanılır.
Yazılımın bütünlüğü korunur ve mekanizmalar kullanılarak değişiklikler tespit edilebilir.
Python:
def zYxWv():
# Dosya bütünlüğünü kontrol etmek için hash değeri kullanma
import hashlib as hsh
_hash_check = "a3b0e89c9dce382f23c9c7b1d7e7c8a9" # Örnek beklenen hash değeri
with open("data_file.bin", 'rb') as file_handle:
_data = file_handle.read()
_computed_hash = hsh.sha256(_data).hexdigest()
# Hash değerini kontrol etme
if _computed_hash != _hash_check:
print("Bütünlük ihlali tespit edildi.")
# Gereksiz bir döngü ekleme
r
Dosyanın değeri hesaplanır ve beklenen değerle karşılaştırılır.
Hesaplanan değer beklenen değerle eşleşmezse dosyanın bütünlüğü tehlikeye girer.
Virtualization (Sanallaştırma)
Yazılım sanal ortamda çalıştırılır ve gerçek işletim sistemi veya donanım üzerinde çalışıyormuş gibi görünür.
Yazılımın şifresini çözmek zordur.
Anti-Disassembly Techniques (Söz Dizimi Çözümleme Karşıtı Teknikler)
Sökmeyi önleme teknikleri kodun anlaşılmasını zorlaştırır.
Talimatları değiştirmek, yanlış veya anlamsız talimatlar eklemek ve akış kontrolünü karmaşıklaştırmak, bunu gerçekleştirmek için kullanılan yöntemlerden bazılarıdır.
Python:
def deceptiveRoutine():
# Disassembly işlemini zorlaştırmak için anlamsız talimatlar
asm_code = """
mov ebx, 0x4321
push eax
pop ebx
mov edx, 0x9876
mul edx
xor ecx, ebx
cmp eax, ecx
je near $+5
nop
nop
ret
"""
# Bu kodun Python karşılığı gerçek işlevsellik içermez, sadece temsili
pass
# Gereksiz işlem ve belirsizlik ekleme
placeholder = 0
for i in range(5):
placeholder = (placeholder + i) * 0x3f
placeholder ^= 0x1a2b
# Yine gereksiz bir hesaplama
for _ in range(3):
placeholder = ~placeholder
return placeholder
Anlamsız veya yanlış talimatların eklenmesi kod örneğinde gösterilmiştir.
Tersine mühendislik için işleri daha karmaşık hale getirmek amacıyla sökme işlemi sırasında talimatlar eklenir.
Bu talimatların hiçbir işlevi yoktur veya yanıltıcıdır.
Anti-Debugging tekniklerini kullanarak bir kod örneği
Python:
import ctypes
import time
import random
import os
# Debugger tespiti için IsDebuggerPresent() fonksiyonunu kullanma
def is_debugger_present():
kernel32 = ctypes.windll.kernel32
return kernel32.IsDebuggerPresent() != 0
if is_debugger_present():
print("Debugger tespit edildi.")
exit()
# Breakpoint tespiti için basit bir yöntem
def check_breakpoint():
try:
# Bu kod gerçek bir breakpoint tespiti yapmaz; sadece temsili bir örnektir
dummy_var = 0
if dummy_var == 0:
raise Exception("Breakpoint testi sırasında hata.")
except:
print("Breakpoint tespit edildi.")
exit()
check_breakpoint()
# Timing attack tespiti için zaman farklılığını kontrol etme
def measure_time():
start_time = time.time()
execution_time = 0
while execution_time < 5: # Belirli bir süre boyunca döngüyü çalıştır
execution_time = time.time() - start_time
measure_time()
# Profiling tespiti için rastgele gecikmeler ekleyerek zamanlama analizini zorlaştırma
def perform_sensitive_task():
print("Hassas işlem gerçekleştirildi.")
# Rastgele bir gecikme ekleme
delay = random.uniform(0.1, 0.5)
time.sleep(delay)
perform_sensitive_task()
# Anti-disassembly tekniklerini kullanarak disassembly işlemini karmaşıklaştırma
def anti_disassembly():
# Bu kod gerçek assembly kodu içermez; sadece temsili bir örnektir
junk_code = """
; Anlamsız veya hatalı assembly talimatları burada yer alır
mov ecx, 0x5678
xor eax, eax
add eax, ecx
dec eax
jmp short $+7
mov edx, 0x9abc
ret
"""
print("Assembly kodu burada yer alır.")
anti_disassembly()
Yukarıdaki kod örneğinde bir senaryo sunulmuştur.
Zaman farklılığı ile çalışan bir timing attack tespiti yapılır.
Zamanlama analizini karmaşık hale getiren şey, profil oluşturma tespiti için rastgele gecikmelerin eklenmesidir.
Süreci karmaşıklaştırmak için sökme önleyici teknikler kullanılır.


