File size: 4,055 Bytes
e015d0b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
import os
from groq import Groq

# تحميل المفاتيح من المتغيرات البيئية (التي تم وضعها في HF Secrets)
API_KEYS = [
    os.getenv("GROQ_KEY_1"),
    os.getenv("GROQ_KEY_2"),
    os.getenv("GROQ_KEY_3")
]

clients = [Groq(api_key=key) for key in API_KEYS if key]

class Agents:
    def __init__(self):
        self.client_index = 0
        
    def _get_client(self):
        # تدوير المفاتيح لتجنب حد السرعة (Rate Limiting)
        client = clients[self.client_index]
        self.client_index = (self.client_index + 1) % len(clients)
        return client

    def agent_1_binary_analyzer(self, smali_folder_path):
        """
        الوكيل 1: يبحث في ملفات Smali عن نظام التحقق
        """
        prompt = f"""
        أنت خبير في هندسة عكسية لتطبيقات أندرويد (Smali).
        تم تفكيك تطبيق (APK) إلى مجلد: {smali_folder_path}
        
        مهمتك: ابحث داخل ملفات الـ Smali عن دالة تتحقق من كلمة المرور أو الاتصال بالخادم.
        ابحث عن النصوص التالية: "VIP ACCESS", "ENTRAR", "CONECTAR", "Device:".
        
        اقرأ الكود، وحدد ما يلي في ملف Smali محدد:
        1. مكان الدالة (اسم الملف واسم الدالة، مثل: `Lcom/game/auth/Login;->verify(Ljava/lang/String;Ljava/lang/String;)Z`).
        2. هل يوجد اتصال HTTP؟ ابحث عن `invoke-virtual {p0}, Ljava/net/URL;->openConnection()Ljava/net/URLConnection;` أو طلبات الشبكة.
        3. ما هو الشرط الذي يؤدي إلى نجاح الدخول (ماذا يحدث إذا كان `if-eqz` أو `if-nez` يعيد true)؟
        
        أجب فقط بتنسيق JSON كالتالي:
        {{ 
            "found": true/false,
            "filename": "مسار الملف داخل المشروع",
            "method_signature": "اسم الدالة الكامل",
            "snippet": "أول 5 أسطر من الكود",
            "analysis": "تحليلك لما يحدث",
            "http_url": "الرابط المستخدم للتحقق إذا وجد"
        }}
        """
        
        client = self._get_client()
        try:
            chat = client.chat.completions.create(
                messages=[{"role": "user", "content": prompt}],
                model="mixtral-8x7b-32768"
            )
            return chat.choices[0].message.content
        except Exception as e:
            return f'{{"error": "AI Analysis Failed: {str(e)}"}}'

    def agent_3_patcher(self, analysis_result, file_content):
        """
        الوكيل 3: بناء على تحليل الوكيل 1، نقوم بتعديل الكود لتجاوز كلمة المرور
        """
        prompt = f"""
        أنت مطور Smali ماهر. 
        لقد قام الوكيل 1 بتحليل دالة التحقق في ملف Smali.
        التحليل الأصلي: {analysis_result}
        الكود الحالي للملف هو: {file_content}
        
        مهمتك: اكتب كود Smali معدل بالكامل (أو التعديلات اللازمة) لجعل هذه الدالة ترجع True دائماً.
        - إذا كان التحقق يستخدم `if-eqz`, قم بتغييره إلى `if-nez`.
        - أو استبدل دالة التحقق بأكملها بحيث تقوم بـ `const/4 v0, 0x1` وتعطي `return v0` في بدايتها.
        
        أعد فقط كود Smali المعدل (أو التعديلات المطلوبة) في بلوك كود.
        """
        client = self._get_client()
        try:
            chat = client.chat.completions.create(
                messages=[{"role": "user", "content": prompt}],
                model="mixtral-8x7b-32768"
            )
            return chat.choices[0].message.content
        except Exception as e:
            return f"AI Patching Failed: {str(e)}"