API Hoking
API Hoking
وّب ٔؼٍُ فبْ ٔظبَ ٌٕ٠ٛذٚص ٠سز ٞٛػٍ ٝاٌؼذ٠ذ ِٓ ِىزجبد اٌشثػ اٌذٕ٠بِى١خ ٚاٌز ٟرسز ٞٛثذٚس٘ب ػٍٝ
ِدّٛػخ ِٓ األٚاِش إٌٔ ٚمً اٌذٚاي ٘ذٖ اٌذٚاي ٘ ٟدٚاي ٚ APIاٌز ٟرغ ًٙػٍ ٝاٌّجشِد ٓ١اٌزؼبًِ ِغ إٌظبَ
ٚاٌّغزؼًّ ٚػذَ اٌٍدٛء إٌ ٝثٕبء اٌجشاِح ِٓ اٌصفش .
ف ٟاٌسم١مخ فبْ دٚاي APIرّٕر ٌٍّجشِح اٌؼذ٠ذ ِٓ اإلِىبٔ١بد اٌز٠ ٟغزؽ١ؼ ْٛثٛاعؽزٙب رسم١ك اٌىث١ش ِٓ األِٛس
ثغٌٛٙخ فً ٔبخذ وّثبي اٌذاٌخ اٌجغ١ؽخ اٌز٠ ٟؼشفٙب اٌىً MessageBoxف ٟٙعٍٙخ االعزذػبء
٠ىف ٟدفغ اٌجبساِزشاد ٌٙب ٟ٘ٚرم َٛثبٌجبلِ ٟثال ف ٟاالعّجٍ:) Masm Syntax ) ٟ
Invoke MessageBox, HandleOfWindow, TextToShownTheBox, TitleOfBox, ButtonsInTheBox
ٌىٕٙب ف ٟخ٘ٛش٘ب ف١ٌ ٟٙغذ ثٙزٖ اٌغٌٛٙخ فٕٙبن دسٚط خبصخ رششذ فمػ رؼم١ذد ثشاِزشارٙب ......
ّ٠ىٓ االؼالع ػٓ ٘ذٖ اٌذٚاي فٍِ ٟف اٌّغبػذح Win 32.hlp
إرْ ِٓ ٕ٘ب ٔغزٕزح إْ ٕ٘بن ارصبي ث ٓ١اٌجشٔبِح ٚاٌّىزجبد اٌذٕ٠بِ١ى١خ ِٓ ٕ٘ب ثشصد إِىبٔ١خ اػزشاض
٘ذ االرصبٌٛػًّ ( HOOKص١ذ) ٌزس ً٠ٛاٌجشٔبِح إٌ ٟرٕف١ز وٛد آخش ػٛض وٛد ٚ API functionدٌه
ػٍ ٝإٌس ٛا٢ر: ٟ
ِٕٗٚفبٌٛٙن ٌ١ظ ع ٜٛػٍّ١خ اػزشاض ٌالعزذػبء ٚإػبدح رٛخ ٗٙ١إٌ ٝو ٛد ِٓ اخز١بسٔب ثس١ث ٕ٠فذ
٘زا اٌىٛد ف ٟوً ِشح ٠زُ فٙ١ب اعزذػبء اٌذاٌخ اٌّشرجؽخ ثٗ .
ٌٚؼًّ اٌٛٙن ٕ٘بن ػذح ؼشق ٔخص ِٕٙب ثبٌزوش :
1
-1إػبدح رٛخ ٗ١ػٓ ؼش٠ك رّDLL ٗ٠ٛ
رشرىض ٘ذٖ اٌؽش٠مخ ػٍ ٝرجذ Dll ً٠اٌز ٟرسز ٞٛػٍ ٝاٌذاٌخ أ ٚاٌذٚاي اٌّشاد رسٍٙ٠ٛب ثٍّف آخش ٠عُ
االوٛاد اٌزٔ ٟش٠ذ رٕف١ز٘ب فِ ٟىبْ اٌذٚاي اٌزٔ ٟش٠ذ ػًّ ٌٙ hookب ٘ذٖ اٌؽش٠مخ ٘ ٟاٌؽش٠مخ االِزً ٌىٓ ٌألعف
ف ٟٙرزؽٍت إػبدح ثٕبء ٌٍّىزجبد وٍ١ب ٘ٚذا إْ ٌُ ٠ىٓ غ١ش ِّىٓ ف١ٌ ٛٙظ ِزبزب ٌٍدّ١غ ٚدٌه
ٌٍصؼٛثخ اٌز ٟرفشظٙب ٘ذٖ اٌؽش٠مخ ٟ٘ٚ الرٕفغ ف٘ ٟذٖ اٌسبٌخ API hokingالْ اٌّىزجبد اٌزٟ
ٔزؼبًِ ِؼٙب خذ ظخّخ .
لذ ّ٠ىٓ اعزغالٌٙب ِغ ِىزجبد اٌجشاِح اٌصغ١شح اٌز ٟرسز ٞٛػٍ ٝثؼط اٌذٚاي ِٓ اخً ػًّ ٘ٛن ٌجشٔبِح ِؼ. ٓ١
.1خذٚي IAT
وّب ٔؼٍُ فبْ دٚاي APIرىِ ْٛغ إٌ٠ٛذٚص ١ٌٚظ ِغ اٌجشٔبِح ٚاٌجشٔبِح ٠م َٛثؼٍّ١خ اعز١شاد ٌٙذٖ اٌذٚاي
ِٓ ِىزجبد اٌشثػ اٌذٕ٠بِ١ى ٟاٌّٛخٛدح فٍِ ٟفبد اي . system
ٌى٠ ٟزُ اعزخذاَ ٘ذٖ اٌذٚاي ف ٟاٌجشٔبِح ٠زُ اٌزصش٠ر ثٙب ثؼذ دفغ ل ُ١اٌجبساِزشاد اال اْ ٘ذا اٌزصش٠ر ف ٟاٌسم١مخ
ٌ١ظ ع ٜٛلفضح إٌ ٝداخً اٌّىزجخ اٌز ٟرسز ٞٛػٍ ٝاٌذاٌخ ٚخّ١غ اٌجشاِح اٌز ٟرضٚد ثدذاٚي IATأرٕبء ػٍّ١خ
وِٛجٍشٓ ( )COMPILATIONزز٠ ٝزّىٓ األخ١ش ِٓ اٌٛصٛي اٌ ٝاٌؼٕب ٓ٠ٚاٌسم١م١خ ٌذٚاي داخً اٌّىزجبد
ِٚDLLدّٛع ٘ذٖ اٌمفضاد ّ٠ثً IAT
ٟ٘ٚػبدح ِب رى ْٛف ٟآخش اٌجشٔبِح أرٕبء اٌزٕم١ر وّب ٛ٠ظر اٌشىً اٌزبٌ: ٟ
ٚثبٌزبٌ ٟفبْ وً ٔذاء ٌذاٌخ ّ٠ APIش ِٓ خذٚي IATلجً أْ ٠زُ اعزذػبء ٘ذٖ اٌذٚاي.....
.2اعزغالي IAT
أظٓ أْ اٌؽش٠مخ ٚاظسخ وّب أعٍفذ اٌزوش فبْ ٌىً داٌخ لفضح ف ٚ IAT ٟثبٌزبٌٌ ٟؼًّ ٘ٛن ٌٙذٖ اٌذاٌخ
٠ىف ٟرغ١١ش ٘ذٖ اٌمفضح ِٓ اٌؼٕٛاْ اٌسم١م ٟإٌ ٝػٕٛاْ اٌىٛد اٌّشاد رٕف١زٖ ( عٍٙخ أٌ١ظ وزاٌه .)
إال أْ ٘ذٖ اٌؽش٠مخ ٘ ٟاألخش١ٌ ٜغذ ػٍّ١خ وٙٔٛب ال رّىٓ ِٓ ػًّ ٘ٚٛن إال ٌٍذٚاي اٌز ٟرٛخذ
ة ........... IAT
رشرىض ٘زٖ اٌؽش٠مخ ػض٠ض ٞاٌمبسئ ػٍ ٝرؼذِ ً٠جبشش ٌٍذاٌخ اٌّشاد ػًّ ٘ٛن ٌٙب أِ ٚب٠غّ ٝثجبرش
ز١ذ ٔم َٛثزغ١١ش األٚاِش األ ٌٝٚف ٟف ٟاٌذاٌخ ِٓ اخً رٛخ ٗ١ع١ش اٌجشٔبِح ٔس ٛاٌىٛد اٌز ٞاخزشٔبٖ
2
رُ إػبدح اٌزسىُ ٌٍجشٔبِح ِّٚب ٠جذ ٚأٔٙب اوزش ظّبٔب ِٓ إٌٛػ ٓ١األٚي ٚاٌزبٔٚ ٟاألع ًٙثؽج١ؼخ اٌسبي
ٌذا عأسوض ػٍٙ١ب فِ ٟب رجم ِٓ ٝاٌذسط الْ اعزؼّبالرٙب ِزؼذدح فِ ٟدبي إٌٙذعخ اٌؼىغ١خ فّ١ىٓ
اعزؼّبٌٙب ِٓ اخً ػًّ ٌ inline patchجشرىزش ِب ٚاْ شبء اهلل عٛف ٔأر ٟػٍ ٝرؽج١ك ٌٙذا فٟ
فه زّب٠خ ازذ اٌجشاِح .
وّب لٍٕب ِٓ لجً ٠دت ٚظغ لفضح رُ إػبدح اٌزسىُ ٌٍجشٔبِح ثؼذ ػٍ ٝإٌس ٛاٌّج ٓ١ف ٟاٌشعُ أعفٍٗ:
ٚالثذ أه ثؼذ ِؼبٕ٠زه ٌٍشعُ ارعسذ اٌفىشح اوزش ٌىٓ ٕ٘بن ثؼط األش١بء اٌزِ ٟبصاٌذ ٌُ رٛظر:
ِٓ اخً إ٠دبد ػٕٛاْ اٌذاٌخ اٌزٔ ٟش٠ذ اٌؼًّ ػٍٙ١ب ٕ٘بن ؼش٠مزبْ أِب اٌؽش٠مخ األ ٌٝٚفزشرىض ػٍٝ
اعزؼّبي اٌذاٌخ ِٓ GetModuleHandleخٍت ِمجط اٌجشٔبِح رُ اعزؼّبي اٌذاٌخGetProcAdresss
٘ٚذٖ اٌؽش٠مخ ال رٕفغ دائّب الْ اٌذاٌخ GetModuleHandleال رؼًّ إال إْ وبٔذ اٌّىزجخ ِسٍّخ
ِٚؼٕٔٛخ فِٕ ٟؽمخ اٌؼٕٔٛخ ف ٟاٌزاوشح ٚاْ ٌُ ٠ىٓ ف ٟٙرؼٛد ثمّ١خ ٚ NULLثبٌزبٌ ٟف١ٌ ٟٙغذ
ػٍّ١خ ف ٟزبٌزٕب ٌزا عٛف ٍٔدأ إٌ ٝاٌؽش٠مخ اٌثبٔ١خ ٚاٌز ٟرزّثً ف ٟاعزؼّبي اٌذاٌخ LoadLibrary
ِٓ اخً خٍت ِمجط ٍِف ( DLLعٛاء وبْ ِسّال أَ ٌُ ٠ىٓ ) رُ ٔغزؼ ٓ١ة ِٓ GetProcAdresss
اخً خٍت ػٕٛاْ اٌذاٌخ ( .زٍذ اٌّشىٍخ األ) ٌٝٚ
-2كيفيت ايجاد مكان وضع انقفزة وحى انهىك ؟
ِٓ اخً ظّبْ رسمك اٌمفضح ٔس ٛاٌٛٙن ِّٙب وبٔذ اٌظشٚف عٛف ٔٛظف اٌمفضح اٌغ١ش ششؼ١خ (الرشرجػ
ثششغ ِغجك ن testاٚ (cmp ٚاٌز ٟرسزً 5ثب٠ذ ِٓ اٌذاوشح وّب رٛظر اٌصٛسح :
3
ٔالزظ ف ٟرّز ً١اٌ١ٙىظ E9ربثزخ ف ٟوً اٌسبالد ثّٕ١ب اٌؼٕٛا ٓ٠رزغ١ش ادْ ِٓ اٌٛاظر اْ رّز ً١اٌمفضح
ف ٟاٌٙىظ ٘ E9 xxxxxٛز١ذ xxxxxرّزً ػٕٛاْ اٌمفض ٚف ٟزبٌزٕب ثذا٠خ اٌٛٙن .
ِٓ اخً ا٠دبد ػٕٛاْ اٌمفض ٔس ٛداٌخ االػزشاض ٚاٌٛٙن عٕسزبج اٌِ ٝؼشفخ ػٕٛاْ ٚ apiلذ عجك
اٌزؼشض اٌ ٝو١ف١خ رٌه عبثمب رُ ٔع١فٗ اٌ ٝخّظ ثب٠زبد اٌخبصخ ثبٌمفضح ٌٕؽشذ اٌىً ِٓ ػٕٛاْ داٌخ
االػزشاض ا ٚاٌٛٙن ٚثبٌزبٌٔ ٟىزت اٌؼاللخ اٌزبٌ١خ :
ثّب إٔب ٚظؼٕب لفضح ف ٟاٚي رؼٍّ١بد APIفبْ اٌجشٔبِح ع١زٛخٗ ِجبششح ٔس ٛاٌٛٙن ٕ٠ ٚفذ اال اْ اٌغؤاي
اٌذ٠ ٞؽشذ ٔفغٗ ٘ ٛو١ف١خ اػبدح اٌزسىُ ٌٍجشٔبِح ٚوبْ ش١ئب ٌُ ٠مغ ؟
ال رمٍك اٌسً ِٛخٛد :
اْ اٌمفضح اٌز ٟرٕفذ رسزً ِىبْ اٌىٛد االصٍٚ ٟثبٌزبٌٌ ٝزٕف١ذ اٌىٛد االصٍٚ ٟخت ػٍٕ١ب اٚال زفظ اٌزؼٍّ١بد االصٍ١خ
رُ اٌشخٛع اٌِ ٝىبٔٙب ٚرٕف١ذ٘ب ثؼذ رٕف١ذ اٌٛٙن ٚدٌه ػً إٌس ٛاالر: ٟ
4
ز١ذ ع١زُ رّش٠ش اٌىٛد ثؼذ رغ١١ش ٚظؼ١خ اٌسّب٠خ ثبعزؼّبي اٌذاٌخ VirtualProtect
مهحىظت 2
ف ٟاٌذاٌخ ٕ٠ virtualProtectجغ ٟػذَ اّ٘بي اٌجبساِزش االخ١ش الٔٗ ِ ُٙخذا ...
ِٓ اٌّالزظ ف ٟاٌذاٌز ٓ١اٌّغزؼٍّز ٓ١أٗ ٠زٛخت ادخبي اٌسدُ إٌّبعت ٌٍىٛد زز ٝرزُ اٌؼٍّ١خ ثٕدبذ ادا وٕب
ٔؼشف اٌذاٌخ فغٕسغت ز١ض ثشاِزشارٙب ٌٚىٓ ادا وبْ االِش ٠زؼٍك ثؼذح دٚاي ا ٚداٌخ رزغ١ش ثبساِزشارٙب
فغٕسزبج اٌ ٝاٌ١خ ٌسغبة زدُ اٌىٛد .
٘زا ِب رٛفشٖ ٌٕب ػذح ِىزجبد ِزٛاخذح ػٍ ٝإٌذ اٌّف٠ َٛٙصؽٍر ػٍ ٗ١ة Length Disassembler Engine
ٟ٘ٚػجبسح ػٓ اٌ١بد رم َٛثسغبة زدُ اٌىٛد ِٓٚاُ٘ االِزٍخ ٔدذ Mlde32 ٚ catchy32ثبالظبفخ
اٌ LDE64 ٝثبٌٕغجخ اٌٌ ٝغخ االعّجٍ. ٟ
اِب ٌؼشبق C++ا C ٚفٕٙبن ٠ L.D.Eذػ ٚ ZOMBIE ٝغ١شٖ وز١ش ....
ف ٟاٌّشفمبد ردذ اٌؼذ٠ذ ِٕٙب .
ج -زغبة ( Jmp2اٌؼٛدح اٌ API ٝاالصٍ١خ) :
ثّب أٗ رُ اٌزؼذ ً٠ػٍ api ٝثبظبفخ ٚ stubخّظ ثب٠زبد اٌخبصخثبٌمفضح فبٔٗ ِٓ اخً اٌشخٛع اٌ ٝاٌذاٌخ االصٍ١خ
ٚخت اصاٌخ اٌزؼذ٠الد أ ٚ stub ٞاٌمفضح ػٍ ٝإٌس ٛاٌزبٌ: ٟ
اٌسّذ هلل زٍذ خّ١غ اٌّشبوً ِبدا رجمٝ؟ ُّّ٘ ٔ ......ؼُ اٌزؽج١ك أزمً اٌ ٝاٌذسط اٌفالش ٟاٌّشفك
عزدذ ِب رش٠ذٖ ....
5