Spaces:
Build error
Build error
| 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)}" |