دروببوإكس العميل عكس الهندسة

TL ؛ د. يتحدث المقال عن التطوير العكسي لعميل Dropbox ، والتطفل على آليات التشويش وإلغاء التشفير للعميل في Python ، وكذلك تغيير البرنامج لتنشيط وظائف تصحيح الأخطاء المخفية في الوضع العادي. إذا كنت مهتمًا فقط بالكود والتعليمات المناسبة ، فانتقل إلى النهاية. في وقت كتابة هذا التقرير ، كانت الشفرة متوافقة مع أحدث إصدارات Dropbox بناءً على مترجم CPython 3.6.

مقدمة


وقد فتنت دروببوإكس لي على الفور. المفهوم لا يزال بسيطًا بشكل مخادع. هنا هو المجلد. ضع الملفات هناك. هو متزامن. الذهاب إلى جهاز آخر. تتم مزامنته مرة أخرى. المجلد والملفات ظهرت الآن هناك أيضا!

مقدار عمل الخلفية المخفية مدهش حقًا. أولاً ، لا تختفي جميع المشكلات التي يتعين عليك معالجتها عند إنشاء تطبيق متعدد الأنظمة والمحافظة عليه لأنظمة تشغيل سطح المكتب الرئيسية (OS X و Linux و Windows). أضف إلى هذا الدعم من متصفحات الويب المختلفة ، وأنظمة التشغيل المحمولة المختلفة. ونحن نتحدث فقط عن جانب العميل. أنا مهتم أيضًا بـ Dropbox backend ، والتي سمحت لي بتحقيق مثل هذه التدرجية والكمون المنخفض مع عبء العمل الثقيل بجنون الذي أنشأه نصف مليار مستخدم.

لهذه الأسباب كنت دائمًا أحب مشاهدة ما يفعله Dropbox تحت الغطاء وكيف تطورت على مر السنين. منذ حوالي ثماني سنوات ، حاولت أولاً معرفة كيف يعمل عميل Dropbox بالفعل عندما لاحظت بث حركة مرور غير معروفة أثناء وجودي في الفندق. أظهر التحقيق أن هذا جزء من ميزة Dropbox التي تسمى LanSync ، والتي تتيح لك المزامنة بشكل أسرع إذا كان لدى مضيفي Dropbox على نفس الشبكة المحلية حق الوصول إلى نفس الملفات. ومع ذلك ، لم يتم توثيق البروتوكول ، وأردت معرفة المزيد. لذلك ، قررت إلقاء نظرة بمزيد من التفصيل ، ونتيجة لذلك أجريت الهندسة العكسية للبرنامج بأكمله تقريبًا. لم يتم نشر هذه الدراسة أبدًا ، على الرغم من أنني شاركت أحيانًا بعض الملاحظات مع بعض الأشخاص.

عندما افتتحنا Anvil Ventures ، أعرب كريس وأنا عن تقديرنا لعدد من الأدوات لتخزين المستندات والمشاركة والتعاون. أحدهم ، بالطبع ، كان Dropbox ، وهذا بالنسبة لي سبب آخر لحفر الدراسات القديمة والتحقق منها في الإصدار الحالي من العميل.

فك التشفير و deobfuscation


أولاً ، قمت بتنزيل العميل لنظام Linux ووجدت بسرعة أنه كتب في Python. نظرًا لأن ترخيص Python مسموح به إلى حد ما ، فمن السهل على الأشخاص تعديل وتوزيع مترجم Python جنبًا إلى جنب مع تبعيات أخرى مثل البرامج التجارية. ثم بدأت الهندسة العكسية لفهم كيفية عمل العميل.

في ذلك الوقت ، كانت الملفات ذات الرمز الفرعي في ملف ZIP مدمجة مع ملف ثنائي قابل للتنفيذ. كان الثنائي الرئيسي مجرد مترجم Python معدّل تم تحميله من خلال التقاط آليات استيراد Python. تمت إعادة توجيه كل مكالمة استيراد لاحقة إلى هذا الملف الثنائي مع تحليل ملف ZIP. بالطبع ، من السهل استخراج الرمز البريدي هذا من الملف الثنائي. على سبيل المثال ، تقوم أداة binwalk المفيدة باستردادها بجميع ملفات .pyc المترجمة بالبايت.

ثم لم أستطع كسر التشفير لملفات .pyc ، لكن في النهاية أخذت الكائن العام في مكتبة Python القياسية وأعدت ترجمته ، وأضخته في الخلف من الداخل. الآن وبعد أن قام عميل Dropbox بتحميل هذا الكائن ، يمكنني بسهولة تنفيذ كود Python التعسفي في مترجم يعمل. على الرغم من أنني اكتشفت هذا بمفردي ، فقد استخدم فلوريان ليدا ونيكولاس راف الطريقة نفسها في عرض تقديمي عن Hack.lu في عام 2012.

كشفت القدرة على استكشاف ومعالجة التعليمات البرمجية قيد التشغيل في Dropbox كثيرًا. استخدم الرمز العديد من الحيل الواقية ليجعل من الصعب تفريغ كائنات التعليمات البرمجية . على سبيل المثال ، في مترجم CPython العادي ، يكون من السهل استرداد رمز فرعي مترجم يمثل دالة. مثال بسيط:

>>> def f(i=0): ... return i * i ... >>> f.__code__ <code object f at 0x109deb540, file "<stdin>", line 1> >>> f.__code__.co_code b'|\x00|\x00\x14\x00S\x00' >>> import dis >>> dis.dis(f) 2 0 LOAD_FAST 0 (i) 2 LOAD_FAST 0 (i) 4 BINARY_MULTIPLY 6 RETURN_VALUE >>> 

ولكن في الإصدار المترجم من Objects / codeobject.c ، co_code إزالة خاصية co_code من القائمة المفتوحة. تبدو قائمة الأعضاء هذه عادةً مثل هذا:

  static PyMemberDef code_memberlist[] = { ... {"co_flags", T_INT, OFF(co_flags), READONLY}, {"co_code", T_OBJECT, OFF(co_code), READONLY}, {"co_consts", T_OBJECT, OFF(co_consts), READONLY}, ... }; 

اختفاء خاصية co_code يجعل من المستحيل تفريغ هذه الكائنات التعليمات البرمجية.

بالإضافة إلى ذلك ، تمت إزالة مكتبات أخرى ، مثل مفكك Python القياسي. في النهاية ، ما زلت أتمكن من تفريغ كائنات التعليمات البرمجية في الملفات ، لكن ما زلت لا أستطيع إلغاء ترجمتها. استغرق الأمر بعض الوقت قبل أن أدرك أن رموز التشغيل التي يستخدمها مترجم Dropbox لا تتطابق مع رموز التشغيل القياسية لبيثون. وبالتالي ، كان من الضروري فهم الشفرات الجديدة من أجل إعادة كتابة كائنات الشفرة مرة أخرى في الرمز الثنائي الأصلي لبيثون.

خيار واحد هو إعادة تعيين شفرة التشغيل. حسب علمي ، تم تطوير هذه التقنية بواسطة ريتش سميث وتم تقديمها في Defcon 18 . في هذا الحديث ، أظهر أيضًا أداة pyREtic لهندسة Python bytecode الهندسية العكسية في الذاكرة. يبدو أن شفرة pyREtic مدعومة بشكل ضعيف ، وتستهدف الأداة ثنائيات Python 2.x "القديمة". للتعرف على التقنيات التي ابتكرها ريتش ، يوصى بشدة بمراقبة أدائه.

تأخذ طريقة ترجمة شفرة التشغيل جميع كائنات الشفرة في مكتبة Python القياسية وتقارنها بالكائنات المستخرجة من ثنائي Dropbox. على سبيل المثال ، كائنات التعليمات البرمجية من hashlib.pyc أو socket.pyc ، والتي توجد في المكتبة القياسية. لنفترض أنه إذا كانت شفرة التشغيل 0x43 تتوافق مع 0x21 0x21 غير المشفرة ، فيمكننا تدريجًا إنشاء جدول ترجمة لإعادة كتابة كائنات التعليمات البرمجية. يمكن بعد ذلك تمرير كائنات التعليمات البرمجية هذه من خلال أداة فك شفرة Python. لتفريغ ، لا تزال بحاجة إلى مترجم تصحيح مع كائن co_code الصحيح.

خيار آخر هو اختراق تنسيق التسلسل. في بيثون ، يسمى التسلسل حشد . لم تنجح عملية إزالة تسلسل الملفات المظلمة بالطريقة المعتادة. عندما عكس الهندسة الثنائية في IDA Pro ، اكتشفت خطوة فك التشفير. على حد علمي ، كان أول من نشر شيئًا علنيًا حول هذا الموضوع هو هاجن فريتش في مدونته . هناك يشير إلى التغييرات في الإصدارات الجديدة من Dropbox (عندما تحول Dropbox من Python 2.5 إلى Python 2.7). الخوارزمية تعمل على النحو التالي:

  • عند فك ملف pyc ، تتم قراءة رأس لتحديد إصدار الحشد. لم يتم توثيق هذا التنسيق ، باستثناء تنفيذ CPython نفسه.
  • يحدد التنسيق قائمة الأنواع المشفرة فيها. أنواع True ، False ، floats ، وما إلى ذلك ، ولكن الأهم هو نوع code object بيثون أعلاه ، code object .
  • عند تحميل code object ، يتم أولاً قراءة قيمتين إضافيتين من ملف الإدخال.
  • أول واحد هو قيمة random 32 بت.
  • والثاني هو قيمة length 32 بت تشير إلى حجم كائن التعليمات البرمجية المتسلسلة.
  • ثم يتم rand قيم rand length إلى دالة RNG بسيطة تنشئ seed .
  • يتم تسليم هذه البذرة إلى دوامة مرسين ، والتي تولد أربع قيم 32 بت.
  • مجتمعة ، توفر هذه القيم الأربع مفتاح تشفير للبيانات المتسلسلة. ثم تقوم خوارزمية التشفير بفك تشفير البيانات باستخدام خوارزمية التشفير الصغير .

في الكود الخاص بي ، كتبت إجراء فك الارتباط Python من البداية. الجزء الذي يقوم بفك تشفير كائنات التعليمات البرمجية يشبه الجزء أدناه. تجدر الإشارة إلى أنه يجب استدعاء هذه الطريقة بشكل متكرر. كائن المستوى الأعلى لملف pyc هو كائن رمز يحتوي على كائنات رمز ، والتي يمكن أن تكون فئات أو وظائف أو lambdas. في المقابل ، يمكن أن تحتوي أيضًا على أساليب أو وظائف أو lambdas. هذه كلها كائنات رمز أسفل التسلسل الهرمي!

  def load_code(self): rand = self.r_long() length = self.r_long() seed = rng(rand, length) mt = MT19937(seed) key = [] for i in range(0, 4): key.append(mt.extract_number()) # take care of padding for size calculation sz = (length + 15) & ~0xf words = sz / 4 # convert data to list of dwords buf = self._read(sz) data = list(struct.unpack("<%dL" % words, buf)) # decrypt and convert back to stream of bytes data = tea.tea_decipher(data, key) data = struct.pack("<%dL" % words, *data) 

تعني القدرة على فك تشفير كائنات التعليمات البرمجية أنه بعد إلغاء تسلسل الإجراءات ، تحتاج إلى إعادة كتابة رمز البايت الفعلي. تحتوي كائنات التعليمات البرمجية على معلومات حول أرقام الأسطر والثوابت ومعلومات أخرى. co_code الفعلي الفعلي موجود في كائن co_code . عندما قمنا ببناء جدول ترجمة شفرة التشغيل ، يمكننا ببساطة استبدال قيم Dropbox المبهمة بمكافئات Python 3.6 القياسية.

الآن كائنات التعليمات البرمجية في تنسيق Python 3.6 المعتاد ، ويمكن تمريرها إلى برنامج إلغاء ترجمته. نمت جودة أدوات فك الشفرة من بيثون بشكل كبير بفضل مشروع R. Bernstein's uncompyle6 . أعطى برنامج Decompilation نتيجة جيدة ، وكنت قادراً على تجميع كل شيء معًا في أداة تقوم بفك تشفير الإصدار الحالي من عميل Dropbox إلى أقصى حد.

إذا استنسخت هذا المستودع واتبعت الإرشادات ، فستكون النتيجة شيء مثل هذا:

  ...
     __main__ - INFO - تم إلغاء ترجمته بنجاح إلى برنامج الإسقاط / العميل / الميزات / browse_search / __ init __. pyc
     __main__ - INFO - فك تشفير ، الترقيع و decompiling _bootstrap_overrides.pyc
     __main__ - INFO - تم إلغاء ترجمة _bootstrap_overrides.pyc بنجاح
     __main__ - INFO - معالجة الملفات 3713 (3591 decompiled بنجاح ، فشل 122)
     opcodemap - تحذير - عدم كتابة مخطط شفرة التشغيل حيث لم يتم تعيين الكتابة الفوقية 

هذا يعني أن لديك الآن دليل out/ إصدار بإصدار decompiled من التعليمات البرمجية المصدر Dropbox.

تمكين دروببوإكس التتبع


في المصدر المفتوح ، بدأت أبحث عن شيء مثير للاهتمام ، وجذبت انتباهي الجزء التالي. يتم تثبيت معالجات التتبع في out/dropbox/client/high_trace.py فقط في حالة عدم تجميد التجميع أو عدم تعيين المفتاح السحري أو ملف تعريف الارتباط الذي يقيد الوظائف في السطر 1430 .

  1424 def install_global_trace_handlers(flags=None, args=None): 1425 global _tracing_initialized 1426 if _tracing_initialized: 1427 TRACE('!! Already enabled tracing system') 1428 return 1429 _tracing_initialized = True 1430 if not build_number.is_frozen() or magic_trace_key_is_set() or limited_support_cookie_is_set(): 1431 if not os.getenv('DBNOLOCALTRACE'): 1432 add_trace_handler(db_thread(LtraceThread)().trace) 1433 if os.getenv('DBTRACEFILE'): 1434 pass 

يشير ذكر البنيات المجمدة إلى تصميمات التصحيح الداخلية لـ Dropbox. وأعلى قليلاً في نفس الملف يمكنك أن تجد مثل هذه الخطوط:

  272 def is_valid_time_limited_cookie(cookie): 273 try: 274 try: 275 t_when = int(cookie[:8], 16) ^ 1686035233 276 except ValueError: 277 return False 278 else: 279 if abs(time.time() - t_when) < SECONDS_PER_DAY * 2 and md5(make_bytes(cookie[:8]) + b'traceme').hexdigest()[:6] == cookie[8:]: 280 return True 281 except Exception: 282 report_exception() 283 284 return False 285 286 287 def limited_support_cookie_is_set(): 288 dbdev = os.getenv('DBDEV') 289 return dbdev is not None and is_valid_time_limited_cookie(dbdev) build_number/environment.py 

كما ترون من طريقة limited_support_cookie_is_set على السطر 287 ، يتم تمكين التتبع فقط إذا تم تعيين متغير البيئة المسمى DBDEV بشكل صحيح على ملفات تعريف الارتباط ذات العمر المحدود. حسنا هذا مثير للاهتمام! والآن نحن نعرف كيفية إنشاء ملفات تعريف الارتباط محدودة الوقت. بناءً على الاسم ، يمكن لمهندسي Dropbox إنشاء ملفات تعريف الارتباط هذه ، ثم تمكين التتبع مؤقتًا في بعض الحالات عندما يكون ذلك مطلوبًا لدعم العملاء. بعد إعادة تشغيل Dropbox أو إعادة تشغيل جهاز الكمبيوتر ، حتى إذا كان ملف تعريف الارتباط المحدد لا يزال في مكانه ، فسوف تنتهي صلاحيته تلقائيًا. أفترض أن هذا يجب أن يمنع ، على سبيل المثال ، تدهور الأداء بسبب التتبع المستمر. كما أنه يجعل من الصعب عكس مهندس Dropbox.

ومع ذلك ، يمكن لبرنامج نصي صغير ببساطة إنشاء ملفات تعريف الارتباط هذه وتعيينها باستمرار. شيء مثل هذا:

  #!/usr/bin/env python3 def output_env(name, value): print("%s=%s; export %s" % (name, value, name)) def generate_time_cookie(): t = int(time.time()) c = 1686035233 s = "%.8x" % (t ^ c) h = md5(s.encode("utf-8?") + b"traceme").hexdigest() ret = "%s%s" % (s, h[:6]) return ret c = generate_time_cookie() output_env("DBDEV", c) 

ثم يتم إنشاء ملف تعريف ارتباط قائم على الوقت:

  $ python3 setenv.py DBDEV=38b28b3f349714; export DBDEV; 

ثم قم بتحميل إخراج هذا البرنامج النصي بشكل صحيح في البيئة وتشغيل عميل Dropbox.

  $ eval `python3 setenv.py` $ ~/.dropbox-dist/dropbox-lnx_64-71.4.108/dropbox 

وهذا يشمل إخراج التتبع ، مع التنسيق الملونة وكل ذلك. يبدو مثل هذا العميل غير المسجل:



تطبيق قانون جديد


كل هذا مضحك قليلا. عند دراسة الرمز الذي تم فك out/build_number/environment.pyc ، out/build_number/environment.pyc . هناك وظيفة تتحقق من تثبيت مفتاح سحري معين. هذا المفتاح ليس مرمّزًا في الشفرة ، لكنه يُقارن بتجزئة SHA-256. هنا هو مقتطف المقابلة.

  1 import hashlib, os 2 from typing import Optional, Text 3 _MAGIC_TRACE_KEY_IS_SET = None 4 5 def magic_trace_key_is_set(): 6 global _MAGIC_TRACE_KEY_IS_SET 7 if _MAGIC_TRACE_KEY_IS_SET is None: 8 dbdev = os.getenv('DBDEV') or '' 9 if isinstance(dbdev, Text): 10 bytes_dbdev = dbdev.encode('ascii') 11 else: 12 bytes_dbdev = dbdev 13 dbdev_hash = hashlib.sha256(bytes_dbdev).hexdigest() 14 _MAGIC_TRACE_KEY_IS_SET = dbdev_hash == 'e27eae61e774b19f4053361e523c771a92e838026da42c60e6b097d9cb2bc825' 15 return _MAGIC_TRACE_KEY_IS_SET 

تسمى هذه الطريقة عدة مرات من أماكن مختلفة في الكود للتحقق مما إذا كان مفتاح التتبع السحري مضبوطًا أم لا. حاولت كسر تجزئة SHA-256 باستخدام القوة الغاشمة لجون ذا ريبر ، لكنني استغرقت عملية البحث البسيطة وقتًا طويلاً للغاية ، ولم أستطع تقليل عدد الخيارات بسبب عدم وجود تخمينات بشأن المحتوى. في Dropbox ، يمكن للمطوّرين الحصول على مفتاح تطوير مُرمّم ثابت ، يتم تثبيته عند الضرورة ، مع تنشيط وضع "المفتاح السحري" للعميل للبحث عن المفقودين.

هذا أزعجني لأنني أردت إيجاد طريقة سريعة وسهلة لإطلاق Dropbox مع مجموعة المفاتيح هذه للبحث عن المفقودين. لذلك كتبت إجراءًا منظمًا يقوم بإنشاء ملفات pyc مشفرة وفقًا لتشفير Dropbox. وبالتالي ، كنت قادراً على إدخال الرمز الخاص بي أو مجرد استبدال التجزئة أعلاه. يوجد هذا الكود في مستودع جيثب في ملف patchzip.py . نتيجة لذلك ، يتم استبدال التجزئة ANVILVENTURES SHA-256 الخاصة ANVILVENTURES . ثم يتم إعادة تشفير كائن الشفرة ووضعه في الرمز البريدي ، حيث يتم تخزين كل الشفرة المشوشة. هذا يسمح لك بالقيام بما يلي:

  DBDEV $ = ANVILVENTURES؛  تصدير DBDEV ؛
     $ ~ / .dropbox-dist / dropbox-lnx_64-71.4.108 / dropbox 

يتم الآن عرض جميع وظائف تصحيح الأخطاء عند النقر بزر الماوس الأيمن على أيقونة Dropbox في علبة النظام.



عند دراسة المصادر dropbox/webdebugger/server.py ، في ملف dropbox/webdebugger/server.py ، اكتشفت طريقة تسمى is_enabled . يبدو أنه يتحقق مما إذا كان سيتم تمكين مصحح أخطاء الويب المدمج أم لا. أولاً وقبل كل شيء ، يتحقق من المفتاح السحري المذكور. بما أننا ANVILVENTURES التجزئة SHA-256 ، يمكننا ببساطة تعيين القيمة على ANVILVENTURES . يتحقق الجزء الثاني في السطور 201 و 202 لمعرفة ما إذا كان هناك متغير بيئة يسمى DB<x> له x مساوٍ للتجزئة SHA-256. تحدد قيمة البيئة ملفات تعريف الارتباط محدودة الوقت ، كما رأينا بالفعل.

  191 @classmethod 192 def is_enabled(cls): 193 if cls._magic_key_set: 194 return cls._magic_key_set 195 else: 196 cls._magic_key_set = False 197 if not magic_trace_key_is_set(): 198 return False 199 for var in os.environ: 200 if var.startswith('DB'): 201 var_hash = hashlib.sha256(make_bytes(var[2:])).hexdigest() 202 if var_hash == '5df50a9c69f00ac71f873d02ff14f3b86e39600312c0b603cbb76b8b8a433d3ff0757214287b25fb01' and is_valid_time_limited_cookie(os.environ[var]): 203 cls._magic_key_set = True 204 return True 205 206 return False 

باستخدام نفس التقنية تمامًا ، واستبدال هذا التجزئة بـ SHA-256 الذي تم استخدامه من قبل ، يمكننا الآن تغيير نص setenv المكتوب مسبقًا إلى شيء مثل هذا:

  $ cat setenv.py … c = generate_time_cookie() output_env("DBDEV", "ANVILVENTURES") output_env("DBANVILVENTURES", c) $ python3 setenv.py DBDEV=ANVILVENTURES; export DBDEV; DBANVILVENTURES=38b285c4034a67; export DBANVILVENTURES $ eval `python3 setenv.py` $ ~/.dropbox-dist/dropbox-lnx_64-71.4.108/dropbox 

كما ترون ، بعد بدء تشغيل العميل ، يتم فتح منفذ TCP جديد للاستماع. لن يتم فتحه إذا لم يتم تعيين متغيرات البيئة بشكل صحيح.

  $ netstat --tcp -lnp |  grep دروببوإكس
     tcp 0 0 127.0.0.1:4242 0.0.0.0:* LISTEN 1517 / dropbox 

علاوة على ذلك ، يمكنك العثور على واجهة WebSocket في ملف webpdb.pyc . هذا هو مجمع للأدوات المساعدة القياسية بيثون pdb . يتم الوصول إلى الواجهة عبر خادم HTTP على هذا المنفذ. دعنا نثبت عميل websocket ونجربه :

  $ websocat -t ws: //127.0.0.1: 4242 / pdb
     --Return--
    
     > /home/gvb/dropbox/webdebugger/webpdb.pyc(101)run()-> لا شيء
     >
     (Pdb) من build_number.environment استيراد magic_trace_key_is_set كـ ms
     (Pdb) ms ()
     صحيح 

وبالتالي ، لدينا الآن مصحح أخطاء كامل في العميل ، والذي يعمل في جميع النواحي الأخرى كما كان من قبل. يمكننا تنفيذ كود Python التعسفي ، تمكنا من تمكين قائمة تصحيح الأخطاء الداخلية ووظائف التتبع. كل هذا سيساعد كثيرا في مزيد من التحليل لعميل Dropbox.

استنتاج


تمكنا من إجراء هندسة عكسية لـ Dropbox ، وكتابة أدوات فك التشفير والحقن التي تعمل مع عملاء Dropbox الحاليين استنادًا إلى Python 3.6. نحن عكس تصميم وظائف خفية الفردية وتفعيلها. من الواضح أن المصحح سيساعد حقًا في زيادة القرصنة. خاصة مع عدد من الملفات التي لا يمكن فك شفرتها بنجاح بسبب عيوب decompyle6.

قانون


يمكن العثور على الكود على جيثب . تعليمات للاستخدام هناك. يحتوي هذا المستودع أيضًا على الكود القديم المكتوب في عام 2011. يجب أن يعمل مع بعض التعديلات فقط ، شريطة أن يكون لدى شخص ما إصدارات قديمة من Dropbox بناءً على Python 2.7.

يحتوي المستودع أيضًا على برامج نصية لبث أكواد التشغيل ، وتعليمات لإعداد متغيرات بيئة Dropbox وكل ما هو ضروري لتغيير الملف المضغوط.

شكر


بفضل براين اوف انفيل فنتشرز لمراجعتها استمر العمل على هذا الرمز لعدة سنوات ، من وقت لآخر قمت بتحديثه ، وقدم طرقًا جديدة وأعد كتابة الأجزاء لاستعادتها للعمل على إصدارات جديدة من Dropbox.

كما ذكرنا سابقًا ، فإن نقطة الانطلاق الكبرى لتطبيقات بيثون الهندسية العكسية هي عمل ريتش سميث وفلوريان ليدوكس ونيكولاس راف ، بالإضافة إلى هاغن فريتش. لا سيما أن عملهم مناسب للتطوير العكسي لأحد تطبيقات Python الأكبر في العالم - عميل Dropbox.

تجدر الإشارة إلى أن عملية فك شفرة بيثون قد تقدمت بشكل كبير بفضل مشروع uncompyle6 بقيادة R. Bernstein. وقد جمع هذا decompiler وتحسين العديد من decompilers بيثون مختلفة.

أيضا شكرا جزيلا للزملاء براين وأوستن وستيفان وكريس لمراجعته هذا المقال.

Source: https://habr.com/ru/post/ar452276/


All Articles