delphi4arab منتديات دلفي للعرب
كيف يعمل التطبيق RunAsDate ؟ - نسخة قابلة للطباعة

+- delphi4arab منتديات دلفي للعرب (https://delphi4arab.net/forum)
+-- قسم : منتديات دلفي للعرب التعليمية (https://delphi4arab.net/forum/forumdisplay.php?fid=3)
+--- قسم : سؤال و جواب حول دلفي (https://delphi4arab.net/forum/forumdisplay.php?fid=15)
+--- الموضوع : كيف يعمل التطبيق RunAsDate ؟ (/showthread.php?tid=11670)

الصفحات: 1 2


RE: كيف يعمل التطبيق RunAsDate ؟ - AX302 - 02-12-2021

السلام عليكم 
تجربة سريعة لهدا المثال (بدون استخدام هاته المكتبة - https://github.com/darianmiller/dxInjectionDetours) , الطريقة تعمل عن طريق حقن ملف DLL في بروسس معين و ذلك DLL يحتوي على دالة Hook يقوم بتنفيذها بمجرد عمل Attach له باْي بروسس كما يتم عمل UnHook بمجرد ان البروسس قام بعمل Detach لدلك DLL , قم بعمل كومبايل ل HookTimeD4A و اضف الى جانبه HookTimeD4A.dll قم بتنفيد البرنامج و اختر على سبيل المثال GetLocalTime (البرنامج المستهدف) و قم بعمل Run , التاريخ المتغير موجود في الوحدة Hook.pas , اظن انه بامكانك ايضا عمل Global Hook لدوال النظام بدون تحديد اي هدف ..

[صورة: J7lM9fX_d.webp?maxwidth=760&fidelity=grand]


.rar   HookTime_Dll.rar (الحجم : 218.56 ك ب / التحميلات : 22)


RE: كيف يعمل التطبيق RunAsDate ؟ - larbiparadox - 03-12-2021

(02-12-2021, 06:26 PM)AX302 كتب : السلام عليكم 
تجربة سريعة لهدا المثال (بدون استخدام هاته المكتبة - https://github.com/darianmiller/dxInjectionDetours) , الطريقة تعمل عن طريق حقن ملف DLL في بروسس معين و ذلك DLL يحتوي على دالة Hook يقوم بتنفيذها بمجرد عمل Attach له باْي بروسس كما يتم عمل UnHook بمجرد ان البروسس قام بعمل Detach لدلك DLL , قم بعمل كومبايل ل HookTimeD4A و اضف الى جانبه HookTimeD4A.dll قم بتنفيد البرنامج و اختر على سبيل المثال GetLocalTime (البرنامج المستهدف) و قم بعمل Run , التاريخ المتغير موجود في الوحدة Hook.pas , اظن انه بامكانك ايضا عمل Global Hook لدوال النظام بدون تحديد اي هدف ..

[صورة: J7lM9fX_d.webp?maxwidth=760&fidelity=grand]


 النتيجة كما طلبنا ، مزال ملف dll الذي أنشأته يعتمد على اجراءات DDetours منها BeginTransaction و EndTransaction ، لكن لا يهم ، يمكننا نسخها في المشروع و حذف ملف dll

شكرا لقد وفيت

لمن يهتم هذا الموقع يشرح الكثير

كود :
https://www.ideasawakened.com/post/dll-injection-with-delphi



RE: كيف يعمل التطبيق RunAsDate ؟ - ALG2009 - 03-12-2021

السلام عليكم
هل ممكن تطبيق صغير وكيفية إضافة كود المدة الزمنية للبرنامج وكيف يتم تفعيلها بمفتاح
للأسف لا أفقه شيء في الهندسة العكسية
وهل ما قمتم به لا يمكن كسره يعني الطريقة صعبة نوعا ما


RE: كيف يعمل التطبيق RunAsDate ؟ - I3CT - 06-12-2021

السلام عليكم و رحمة الله

إقتباس : النتيجة كما طلبنا ، مزال ملف dll الذي أنشأته يعتمد على اجراءات DDetours منها BeginTransaction و EndTransaction ، لكن لا يهم ، يمكننا نسخها في المشروع و حذف ملف dll

اعتماد الــ detours لتسهيل العملية خصوصا انه يعطينا مرونة كبيرة اذا احتجنا التعامل مع ما تم تعديله من بايتات و استرجاعها او استدعاء الدوال الأصلية "بعد اعادة توجيهها" من خلال الدوال "التي تم التوجيه اليها"

بعد اطلاعي على التطبيق RunAsDate تبين لي انه يقوم بحقن مكتبة "صغيرة الحجم" و بدورها تقوم باعادة التوجيه "اعادة توجيه بسيط بكتابة اوامر قليلة في الذاكرة "قفزة"" تستبدل العنوان الأصلي للدالة المستهدفة الي عنوان دوال تابعة للمكتبة المحقونة و هذه الأخيرة تقوم بملئ الــ structure بمعلومات "تاريخ و وقت" مزيف...


.rar   injected_dlls.rar (الحجم : 3.11 ك ب / التحميلات : 11)

قائمة الدوال التي يتم اعادة توجيهها:
PHP كود :
GetSystemTime
GetLocalTime
GetSystemTimeAsFileTime
GetSystemTimePreciseAsFileTime
NtQuerySystemTime 

بعد عمل decompilation للمكتبة...
التطبيق RunAsDate لا يستعمل اي detours فقط يعتمد على استعمال دالة WriteProcessMemory لكتابة اوامر القفز من العنوان المستهدف الى العنوان الموجه اليه...

المكتبة المحقونة تقوم بـــ:
01- جلب عنوان الدالة المستهدفة.
02- جلب عنوان الدالة التي يتم التوجيه اليها.
03- تكتب في الذاكرة اوامر "قليلة جدا" التوجيه "القفزة" فقط بدون استعمال اي مكتبة جاهزة detours...
04-من خلال رقم "02" تمرر المعطيات المزيفة في structure ثم تترك سير تنفيذ اوامر البرنامج المستهدف...

إقتباس :    وهل ما قمتم به لا يمكن كسره يعني الطريقة صعبة نوعا ما
الدراسة و التجربة هدفها فهم عملية تجاوز Trial Time البسيطة و التي لا تحتوي على خدع او حيل...
ما تم نشره فوق هو محاولة تجاوز الحماية و ليس حماية تطبيق بآلية Trial Time...


RE: كيف يعمل التطبيق RunAsDate ؟ - I3CT - 12-12-2021

السلام عليكم و رحمة الله
هل من استطاع محاكاة (بدلفي) عمل مكتبة البرنامج الأصلي (التي لا تعتمد على Detours جاهز) فقط على قفزة اعادة التوجيه ؟


RE: كيف يعمل التطبيق RunAsDate ؟ - I3CT - 14-12-2021

محاكاة عمل مكتبة البرنامج الأصلي...
اوامر بسيطة بدون اضافة تحقق نجاح كل مرحلة من التنفيذ...


[صورة: WIxIrZF.gif]

PHP كود :
library HookTimeD4A;

uses
  Windows
;

procedure FakeGeSystemTime(out SytemTime: SYSTEMTIME); stdcall;
begin
  SytemTime
.wYear := 2222;
  SytemTime.wMonth := 11;
  SytemTime.wDay := 11;
  SytemTime.wHour := 11;
  SytemTime.wMinute := 11;
  SytemTime.wSecond := 11;
  SytemTime.wMilliseconds := 1111;
end;

// --- 64bit
type
  TDataToWrite 
= packed record
    MOV
: WORD;
    FakeProc: Pointer;
    JMPEAX: WORD end;

    (*
      //--- 32bit
      type
      TDataToWrite 
= packed record
      MOV
: BYTE;
      FakeProc: Pointer;
      JMPEAX: WORD
      end
;
    *)

  var
    lpNumberOfBytesWritten: SIZE_T;
    
DataToWrite: TDataToWrite;
    pGetSystemTime: Pointer;
    pGetLocalTime: Pointer;

  begin

    
// --- 64bit
    DataToWrite.MOV := $B848;

    // --- 32bit
    // DataToWrite.MOV := $B8;

    DataToWrite.FakeProc := @FakeGeSystemTime;
    DataToWrite.JMPEAX := $E0FF;

    pGetSystemTime := GetProcAddress(GetModuleHandleA('kernel32.dll'),
      'GetSystemTime');

    WriteProcessMemory(GetCurrentProcess(), pGetSystemTime, @DataToWrite,
      sizeof(DataToWrite), lpNumberOfBytesWritten);

    pGetLocalTime := GetProcAddress(GetModuleHandleA('kernel32.dll'),
      'GetLocalTime');

    WriteProcessMemory(GetCurrentProcess(), pGetLocalTime, @DataToWrite,
      sizeof(DataToWrite), lpNumberOfBytesWritten);

end. 



RE: كيف يعمل التطبيق RunAsDate ؟ - larbiparadox - 14-12-2021

(14-12-2021, 06:53 PM)I3CT كتب : محاكاة عمل مكتبة البرنامج الأصلي...
اوامر بسيطة بدون اضافة تحقق نجاح كل مرحلة من التنفيذ...


[صورة: WIxIrZF.gif]

PHP كود :
library HookTimeD4A;

uses
  Windows
;

procedure FakeGeSystemTime(out SytemTime: SYSTEMTIME); stdcall;
begin
  SytemTime
.wYear := 2222;
  SytemTime.wMonth := 11;
  SytemTime.wDay := 11;
  SytemTime.wHour := 11;
  SytemTime.wMinute := 11;
  SytemTime.wSecond := 11;
  SytemTime.wMilliseconds := 1111;
end;

// --- 64bit
type
  TDataToWrite 
= packed record
    MOV
: WORD;
    FakeProc: Pointer;
    JMPEAX: WORD end;

    (*
      //--- 32bit
      type
      TDataToWrite 
= packed record
      MOV
: BYTE;
      FakeProc: Pointer;
      JMPEAX: WORD
      end
;
    *)

  var
    lpNumberOfBytesWritten: SIZE_T;
    
DataToWrite: TDataToWrite;
    pGetSystemTime: Pointer;
    pGetLocalTime: Pointer;

  begin

    
// --- 64bit
    DataToWrite.MOV := $B848;

    // --- 32bit
    // DataToWrite.MOV := $B8;

    DataToWrite.FakeProc := @FakeGeSystemTime;
    DataToWrite.JMPEAX := $E0FF;

    pGetSystemTime := GetProcAddress(GetModuleHandleA('kernel32.dll'),
      'GetSystemTime');

    WriteProcessMemory(GetCurrentProcess(), pGetSystemTime, @DataToWrite,
      sizeof(DataToWrite), lpNumberOfBytesWritten);

    pGetLocalTime := GetProcAddress(GetModuleHandleA('kernel32.dll'),
      'GetLocalTime');

    WriteProcessMemory(GetCurrentProcess(), pGetLocalTime, @DataToWrite,
      sizeof(DataToWrite), lpNumberOfBytesWritten);

end. 

شكرا ، قفزة نوعية ، لم أقم بالبحث كما ينبغي نظرا لضيق الوقت ، الان بقي كيفية التعامل مع الموارد الاخرى كـ registry