كيف يعمل التطبيق RunAsDate ؟
#11
السلام عليكم 
تجربة سريعة لهدا المثال (بدون استخدام هاته المكتبة - 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)
:: من يملك المعلومة يملك الميدان :: 
[-] كل من 1 user says قال شكرا ل AX302 على المشاركة المفيدة
  • أبو معاذ
الرد
#12
(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
‏اللّهمّ فرّج أُموراً ضَاقت بها صُدورنا وعجزت بها حيلتنا وقلّ بها صَبرنا الّلهمّ أَسعِد قلوبنا بما أنتَ أعْلَمُ بِهِ مِنّا
[-] كل من 1 user says قال شكرا ل larbiparadox على المشاركة المفيدة
  • أبو معاذ
الرد
#13
السلام عليكم
هل ممكن تطبيق صغير وكيفية إضافة كود المدة الزمنية للبرنامج وكيف يتم تفعيلها بمفتاح
للأسف لا أفقه شيء في الهندسة العكسية
وهل ما قمتم به لا يمكن كسره يعني الطريقة صعبة نوعا ما
الرد
#14
السلام عليكم و رحمة الله

إقتباس : النتيجة كما طلبنا ، مزال ملف 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...
[-] كل من 2 users say قال شكرا ل I3CT على المشاركة المفيدة
  • larbiparadox, ALG2009
الرد
#15
السلام عليكم و رحمة الله
هل من استطاع محاكاة (بدلفي) عمل مكتبة البرنامج الأصلي (التي لا تعتمد على Detours جاهز) فقط على قفزة اعادة التوجيه ؟
الرد
#16
محاكاة عمل مكتبة البرنامج الأصلي...
اوامر بسيطة بدون اضافة تحقق نجاح كل مرحلة من التنفيذ...


[صورة: 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. 
[-] كل من 2 users say قال شكرا ل I3CT على المشاركة المفيدة
  • larbiparadox, ALG2009
الرد
#17
(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
‏اللّهمّ فرّج أُموراً ضَاقت بها صُدورنا وعجزت بها حيلتنا وقلّ بها صَبرنا الّلهمّ أَسعِد قلوبنا بما أنتَ أعْلَمُ بِهِ مِنّا
الرد


التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم