فهم Smali: لغة التجميع لـ Dalvik VM
دليل شامل لفهم بنية ملفات Smali وكيفية قراءتها وتعديلها لإجراء اختبارات الاختراق على تطبيقات أندرويد بشكل احترافي.
.class public Lcom/example/app/MainActivity;
.super Landroid/app/Activity;
.method public onCreate(Landroid/os/Bundle;)V
.registers 2
.param p1, "savedInstanceState"
invoke-super {p0, p1}, Landroid/app/Activity;->onCreate(Landroid/os/Bundle;)V
const/4 v0, 0x0
# التحقق من صلاحية الترخيص
invoke-virtual {p0}, Lcom/example/app/MainActivity;->checkLicense()Z
move-result v0
if-eqz v0, :cond_invalid
invoke-virtual {p0}, Lcom/example/app/MainActivity;->loadMainContent()V
return-void
:cond_invalid
invoke-virtual {p0}, Lcom/example/app/MainActivity;->showTrialExpired()V
return-void
.end method
import subprocess
import re
def extract_smali(apk_path: str) -> dict:
"""استخراج ملفات Smali من APK باستخدام apktool"""
result = subprocess.run(
['apktool', 'd', apk_path, '-o', 'output/', '-f'],
capture_output=True, text=True
)
if result.returncode != 0:
raise RuntimeError(f"فشل التفكيك: {result.stderr}")
smali_files = {}
import os
for root, _, files in os.walk('output/smali'):
for f in files:
if f.endswith('.smali'):
path = os.path.join(root, f)
with open(path, 'r', encoding='utf-8') as fh:
smali_files[path] = fh.read()
return smali_files
# مثال على الاستخدام
files = extract_smali('target_app.apk')
print(f"✓ تم استخراج {len(files)} ملف Smali")