الفريق العربي للهندسة العكسية

نسخة كاملة : عمل حقن لمكتبة داخل برنامج (Injection)
أنت حالياً تتصفح نسخة خفيفة من المنتدى . مشاهدة نسخة كاملة مع جميع الأشكال الجمالية .
- المشروع يعمل على حقن مكتبة DLL داخل برنامج في الذاكرة NOTEPAD ويكتب في ملف C:\temp.txt للتاكد من نجاح العملية
- للانتباه ان هناك نسختان في وندوز للنوت باد X64 في windows\system32 و X86-32 في Windows\SysWow64
- يجب استخدام نسخ متوافقة من الحقن والبرنامج الهدف (الحقن مبني عل 64 ويمكن تغييره)
- قمت بوضع نسخة من البرامج لكل من C و ++C ، يمكن استخدام النسخة التي تريد
- استخدمت Visual Studio 2019

اتمنى ان ينال هذا المشروع الصغير اعجابكم
السلام عليكم و رحمة الله

القيت نظرة سريعة على السورس و لم اجرب عمله بعد...

استسمحك اخي بعض الأسئلة:
- لماذا قمت بتسمية الدالة بــ GetProcessId و المتغير LoadLibraryA ؟
- لماذا تعريف نوع ما ترجعه الدالة GetProcessId مختلف ؟ فوق معرفة بأن ترجع نوع DWORD و تحت معرفة ان ترجع نوع unsigned long
- وجود دالة لا يتم استدعائها ابدا const wchar_t* GetWC(const char* c)
وعليكم السلام ورحمة الله

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

بالنسبة للاسألة، التسمية متوافقة مع الغرض، فالدالة هذا هو الهدف منها والمتغير يشير الى موقع الدالة في الذاكرة.
بالسنبة للتعرف، ما شاء الله على قوة ملاحظتك، فانا قصدت ذلك لانه لا يوجد بلغة C تعريف DWORD وانما هو مقتبس من الاسمبلي وهو عبارة عن Alias ، لذا احببت الانحياز لاصل اللغة.
اما الدالة غير المستخدمة، فمن الواضح انك لم تفتح المشروع وانما فتحت الملف مباشرة، لان هذا الملف بلغة ++C والمشروع بلغة C. فانا استخدمت تقنية مختلفة بلغة ++C واحببت تركها ضمن الملفات للاستفادة والتعلم، وان اشرت لذلك في الشروحات اعلاه.

اما الفكرة فهي مباشرة ومفيدة وضرورية لكل من يبحث ويتعلم في مجال الهندسة العكسية.

ارجوا ان تكون الاجابة قد لبت طلبك

واشكر الاخ EarthMan123 على متابعته اليومية للمواضيع والمشاركة والتوضيح دون كلل او ملل ، من لا يشكر الناس لا يشكر الله
بارك الله فيك اخي على اجابتك...

بخصوص:
(09-06-2020, 07:09 AM)ExCodeMaker كتب : [ -> ]بالنسبة للاسألة، التسمية متوافقة مع الغرض، فالدالة هذا هو الهدف منها والمتغير يشير الى موقع الدالة في الذاكرة.
الاشكال هنا هو اعتمادك على تسمية قد تسبب اعتراضات خلال مرحلة البناء تسمية الدالة GetProcessId مع وجود دالة تابعة للنظام بنفس التسمية مع احترام الحروف الكبيرة و الصغيرة.

error C2373: 'GetProcessId': redefinition; different type modifiers
عند تخصيص البناء x86

warning C4273: 'GetProcessId': inconsistent dll linkage
عند تخصيص البناء x64

و عند الانتهاء من بناء التطبيق يتم رغما عنا اضافة الدالة GetProcessId في جدول التصديرات Exports
قم اخي بفحص جدول التصديرات للملف الناتج عندك.

الحل:
من GetProcessId الى getProcessId  تفي بالعرض.
نفس الشئ في اعتماد تسمية المتغيرات:
من LoadLibraryA الى lpLoadLibraryA مثلا، الحرص فقط على عدم التسمية باسماء قد تسبب اعتراضات او قد تؤدي الى سلوك خارجي مثل اضافة الدالة الى جدول التصديرات (حالة التطبيق خاصتك)
 
(09-06-2020, 07:09 AM)ExCodeMaker كتب : [ -> ]بالسنبة للتعرف، ما شاء الله على قوة ملاحظتك، فانا قصدت ذلك لانه لا يوجد بلغة C تعريف DWORD وانما هو مقتبس من الاسمبلي وهو عبارة عن Alias ، لذا احببت الانحياز لاصل اللغة.
في الأصل، unsigned long و DWORD (احرف كبيرة) هما نفس الشئ:
typedef unsigned long       DWORD;

الاشكال هو منهجي في طريقة كتابة تعريف نفس الدالة بكتابة مختلفة في نفس السورس حتى و ان كان الاختلاف شكلا و ليس مضمونا.

بالمناسبة جربت المثال و عمل عندي بنجاح، فقط:
1- يجب تشغيل notepad كمسؤول لكي يتم منحه صلاحيات الكتابة في السواقة "C"
2- و بما ان متسوى notepad اصبح مستوى مسؤول، فانه طبعا يجب رفع مستوى تشغيل التطبيق بنفس المستوى.

احببت ارفاق الملفات (لم اغير اي شئ في السورس الأصلي سوى تسمية الدالة getProcessId )(x86 و x64) التنفيذية، تشغيلها لا يحتاج الى dependencies مثبتة على النظام لكي تشتغل.
السلام عليكم
مشكور على الموضوع
صراحة انا لم ابرمج في لغة C و C++ منذ ايام الدراسة لكن كنت اطلع على الملف بشكل سريع ولفت نظري شيء

هنا انت قمت بعمل function اسمها CreateRemoteThreadInject ترجع int 
int CreateRemoteThreadInject(unsigned long ID, const char* dll)

ولكن بعد ذلك اذا لم يجد process ID لاحظت انها ترجع false وهذا bool وليس int
اليس من الافضل في هذه الحالة ان ترجع bool بالشكل التالي
bool CreateRemoteThreadInject(unsigned long ID, const char* dll)

وليس هكذا 
int CreateRemoteThreadInject(unsigned long ID, const char* dll)

(ربما اكون مخطأ والبرنامج يعمل بشكل عادي من دون مشاكل لأن false وtrue هم في النهاية 0 و1 اترك ذلك للمختصين في البرمجة)

الكود الأصلي في الملف
 
int CreateRemoteThreadInject(unsigned long ID, const char* dll)

{
    //Declare the handle of the process.
    void *Process;

    //Declare the memory we will be allocating
    void *Memory;

    //Declare LoadLibrary
    void *LoadLibraryA;

    void *thread=NULL;
    unsigned long threadID;
   

    //If there's no process ID we return false.
    if (!ID)
    {
        return false;
    }
(09-06-2020, 04:19 PM)kOuD3LkA كتب : [ -> ](ربما اكون مخطأ والبرنامج يعمل بشكل عادي من دون مشاكل لأن false وtrue هم في النهاية 0 و1 اترك ذلك للمختصين في البرمجة)

0 = false
أي قيمة عدا الصفر = true
بالنسبة ل GetProcessId كلامك صحيح، في نسخة ++C لا يوجد اشكال فهي مقبولة Overloaded ، وعندما نقلتها الى نسخة C كان يجب تغييرها كما ذكرت
السلام عليكم 


هل يوجد TUT شرح 

وشكرا
(09-06-2020, 04:19 PM)kOuD3LkA كتب : [ -> ]int CreateRemoteThreadInject(unsigned long ID, const char* dll)

{
//Declare the handle of the process.
void *Process;

//Declare the memory we will be allocating
void *Memory;

//Declare LoadLibrary
void *LoadLibraryA;

void *thread=NULL;
unsigned long threadID;


//If there's no process ID we return false.
if (!ID)
{
return false;
}

هناك بعض الملاحظات:
1. نوع القيمة المرجعة CreateRemoteThreadInject
 ينبغي أن نستخدم return 0; بدلاً من return false; لأن الدالة تُرجِع قيمة من النوع int.
2.  استخدام void * ليس الأمثل دائمًا  . ينبغي أن نستخدم الأنواع المناسبة مثل HANDLE في حالة Process و FARPROC في حالة LoadLibraryA.
3.عند تخصيص الذاكرة في عملية أخرى ، يجب استخدام دالة VirtualAllocEx

والله أعلم rose