Π―Π²Π½ΡΠΉ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄. ΠΡΠ»ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ ΠΏΠ΅ΡΠ΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π±ΡΡΠ΅ΡΠ° ΠΈΠ·Π²Π΅ΡΡΠ΅Π½ Π°Π΄ΡΠ΅Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ Π½Π°Π³ΡΡΠ·ΠΊΠΈ, ΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ Π΅ΠΌΡ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ ΡΠ²Π½ΠΎΠ³ΠΎ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄Π° (direct jump). ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΡΠΉ ΠΊΠΎΠ΄ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ Π½Π°Π³ΡΡΠ·ΠΊΠΈ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π·Π°Π³ΡΡΠΆΠ΅Π½ Π² ΠΎΠ±Π»Π°ΡΡΡ ΡΡΠ΅ΠΊΠ°. ΠΠ΅ΡΠΌΠΎΡΡΡ Π½Π° ΡΠΎ ΡΡΠΎ Π°Π΄ΡΠ΅Ρ ΡΡΠ΅ΠΊΠ° ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ Π½Π΅ΡΡΡΠ΄Π½ΠΎ, ΠΏΡΠΈ ΡΠ²Π½ΠΎΠΌ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄Π΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ ΠΎΡΠΈΠ±ΠΊΠΈ. ΠΠΎ-ΠΏΠ΅ΡΠ²ΡΡ , Π°Π΄ΡΠ΅Ρ ΡΡΠ΅ΠΊΠ° ΠΌΠΎΠΆΠ΅Ρ ΠΎΠΊΠ°Π·Π°ΡΡΡΡ Π½ΡΠ»Π΅Π²ΡΠΌ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΡΡΠ΅Π±ΠΎΠ²Π°ΡΡΡΡ ΡΠ°Π·ΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ Π² ΠΏΠ°ΠΌΡΡΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ Π½Π°Π³ΡΡΠ·ΠΊΠΈ Π΄ΠΎ Π·Π°Π³ΡΡΠ·ΡΠΈΠΊΠ°, ΡΠΎΠΊΡΠ°ΡΠ°Ρ Π΄ΠΎΡΡΡΠΏΠ½ΡΡ ΠΊΠΎΠ΄Ρ ΠΏΠ°ΠΌΡΡΡ. ΠΠΎ-Π²ΡΠΎΡΡΡ , Π°Π΄ΡΠ΅Ρ ΡΠ°Π·ΠΌΠ΅ΡΠ΅Π½ΠΈΡ Π² ΠΏΠ°ΠΌΡΡΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ Π½Π°Π³ΡΡΠ·ΠΊΠΈ ΠΌΠΎΠΆΠ΅Ρ ΠΌΠ΅Π½ΡΡΡΡΡ, ΠΏΠΎΡΡΠΎΠΌΡ Π½ΡΠΆΠ½ΠΎ ΡΡΠΈΡΡΠ²Π°ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π°Π΄ΡΠ΅ΡΠ° ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄Π°. Π‘ΠΏΠΎΡΠΎΠ± ΡΠ²Π½ΠΎΠ³ΠΎ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄Π° ΠΏΡΠΎΡΡ Π΄Π»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ. Π ΡΠΎΠΌΡ ΠΆΠ΅ ΡΡΡΠ΅ΡΡΠ²ΡΡΡ Ρ ΠΈΡΡΠΎΡΠΌΠ½ΡΠ΅ ΡΠΏΠΎΡΠΎΠ±Ρ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠΈΠ΅ ΡΠΏΡΠΎΡΡΠΈΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π°Π΄ΡΠ΅ΡΠ° (ΡΠΌ. ΡΠ΅ΠΊΡΠΈΡ Β«ΠΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ ΠΊΠΎΠΌΠ°Π½Π΄ NOPΒ»). Π Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²Π΅ ΡΠ»ΡΡΠ°Π΅Π² Π² ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΠ΅ UNIX Π°Π΄ΡΠ΅Ρ ΡΡΠ΅ΠΊΠ° Π½Π΅Π½ΡΠ»Π΅Π²ΠΎΠΉ, ΠΏΠΎΡΡΠΎΠΌΡ Π΄Π»Ρ Π½Π΅Π΅ ΠΎΠΏΠΈΡΡΠ²Π°Π΅ΠΌΡΠΉ ΡΠΏΠΎΡΠΎΠ± ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΈΡ. Π Π½Π°ΠΊΠΎΠ½Π΅Ρ, Π΅ΡΠ»ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΡΠΉ ΠΊΠΎΠ΄ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ Π½Π°Π³ΡΡΠ·ΠΊΠΈ ΡΠ°Π·ΠΌΠ΅ΡΠ΅Π½ Π²Π½Π΅ ΡΡΠ΅ΠΊΠ°, ΡΠΎ ΡΠΏΠΎΡΠΎΠ± ΡΠ²Π½ΠΎΠ³ΠΎ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄Π° Π²Π½Π΅ ΠΊΠΎΠ½ΠΊΡΡΠ΅Π½ΡΠΈΠΈ.
ΠΠ΅ΡΠ²Π½ΡΠΉ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄. Π Π΅Π³ΠΈΡΡΡ ESP ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ Π½Π° ΡΠ΅ΠΊΡΡΠ΅Π΅ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² ΡΡΠ΅ΠΊΠ΅. Π‘ΠΏΠΎΡΠΎΠ± Π½Π΅ΡΠ²Π½ΠΎΠ³ΠΎ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄Π°(blind return) ΠΎΡΠ½ΠΎΠ²Π°Π½ Π½Π°ΡΠΎΠΌ, ΡΡΠΎ Π»ΡΠ±Π°Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π° ret, Π²ΡΠΏΠΎΠ»Π½ΠΈΠ² ΡΠ°ΠΊ Π½Π°Π·ΡΠ²Π°Π΅ΠΌΠΎΠ΅ Π²ΡΡΠ°Π»ΠΊΠΈΠ²Π°Π½ΠΈΠ΅ Π΄Π°Π½Π½ΡΡ ΠΈΠ· ΡΡΠ΅ΠΊΠ°, Π·Π°Π³ΡΡΠ·ΠΈΡ Π² ΡΠ΅Π³ΠΈΡΡΡ EIP Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΈΠ· ΠΎΠ±Π»Π°ΡΡΠΈ, Π½Π° ΠΊΠΎΡΠΎΡΡΡ ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ ΡΠ΅Π³ΠΈΡΡΡ ESP. Π‘ΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎ ΡΠΎ, ΡΡΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π° ret Π·Π°Π³ΡΡΠ·ΠΈΡ Π² ΡΠ΅Π³ΠΈΡΡΡ EIP Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Ρ Π²Π΅ΡΡΠΈΠ½Ρ ΡΡΠ΅ΠΊΠ°, ΠΊΠΎΡΠΎΡΠΎΠ΅ Π±ΡΠ΄Π΅Ρ ΠΏΡΠΎΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠΈΡΠΎΠ²Π°Π½ΠΎ ΠΊΠ°ΠΊ Π°Π΄ΡΠ΅Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°. ΠΡΠ»ΠΈ Π°ΡΠ°ΠΊΡΡΡΠΈΠΉ ΡΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠ΄ΠΌΠ΅Π½ΠΈΡΡ ΡΠΎΡ ΡΠ°Π½Π΅Π½Π½ΠΎΠ΅ Π² ΡΡΠ΅ΠΊΠ΅ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ ΡΠ΅Π³ΠΈΡΡΡΠ° EIP Π½Π° Π°Π΄ΡΠ΅Ρ ΡΠ²ΠΎΠ΅ΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΡΠΎ ΠΏΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π΅ ret Π΅ΠΉ Π±ΡΠ΄Π΅Ρ ΠΏΠ΅ΡΠ΅Π΄Π°Π½ΠΎ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅.
Π ΡΡΠ΄Π΅ ΡΠΏΠΎΡΠΎΠ±ΠΎΠ² ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠΌΡ ΠΊΠΎΠ΄Ρ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ Π½Π°Π³ΡΡΠ·ΠΊΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ ΡΠ΅Π³ΠΈΡΡΡΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ° Π΄Π»Ρ ΡΠΊΠ°Π·Π°Π½ΠΈΡ Π½Π° ΠΎΠ±Π»Π°ΡΡΡ Π΄Π°Π½Π½ΡΡ Π² ΡΡΠ΅ΠΊΠ΅. Π Π΅Π³ΠΈΡΡΡ EIP ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎ Π½Π΅Π΄ΠΎΡΡΡΠΏΠ΅Π½, ΠΏΠΎΡΡΠΎΠΌΡ Π½Π΅Π»ΡΠ·Ρ ΠΏΠΎΠ΄ΠΌΠ΅Π½Π΅Π½Π½ΡΠΉ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ ΡΠ΅ΠΊΡΡΠ΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ Π·Π°Π³ΡΡΠ·ΠΈΡΡ Π² ΡΠ΅Π³ΠΈΡΡΡ EIP ΠΈ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΠΈΠΌ Π΄Π»Ρ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅, ΠΊΠ°ΠΊ ΡΡΠΎ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½Π° ΡΠΈΡ. 8.20. ΠΠ»Ρ Π·Π°Π³ΡΡΠ·ΠΊΠΈ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ ΡΠ΅ΠΊΡΡΠ΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ Π² ΡΠ΅Π³ΠΈΡΡΡ EIP ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ ΡΠ΅ΠΊΡΡΠ΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΊΠ°Π·ΡΠ²Π°ΡΡ Π½Π° ΡΠ΅Π°Π»ΡΠ½ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ, ΠΊΠ°ΠΊ ΡΡΠΎ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½Π° ΡΠΈΡ. 8.21.
Π ΠΈΡ. 8.20. Π ΡΠ΅Π³ΠΈΡΡΡ Π½Π΅Π»ΡΠ·Ρ Π·Π°Π³ΡΡΠ·ΠΈΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄ΡΠ ΠΈΡ. 8.21. Π£ΠΊΠ°Π·Π°ΡΠ΅Π»Ρ ΠΊΠΎΠΌΠ°Π½Π΄Ρ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΊΠ°Π·ΡΠ²Π°ΡΡ Π½Π° ΡΠ΅Π°Π»ΡΠ½ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ
Π‘ΠΊΡΡΡΡΠΉ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄. ΠΡΠ»ΠΈ Ρ ΡΠ°Π½ΠΈΠΌΠΎΠ΅ Π½Π° Π²Π΅ΡΡΠΈΠ½Π΅ ΡΡΠ΅ΠΊΠ° Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ Π°Π΄ΡΠ΅ΡΠΎΠΌ Π°ΡΠ°ΠΊΡΠ΅ΠΌΠΎΠ³ΠΎ Π±ΡΡΠ΅ΡΠ°, ΡΠΎ Π΄Π»Ρ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠΌΡ ΠΊΠΎΠ΄Ρ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ Π½Π°Π³ΡΡΠ·ΠΊΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΡΠΏΠΎΡΠΎΠ±ΠΎΠΌ ΡΠΊΡΡΡΠΎΠ³ΠΎ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄Π° (pop return). Π‘ΠΏΠΎΡΠΎΠ± ΡΠΊΡΡΡΠΎΠ³ΠΎ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄Π° ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π·Π°Π³ΡΡΠ·ΠΈΡΡ Π² ΡΠ΅Π³ΠΈΡΡΡ EIP Π½ΡΠΆΠ½ΡΠΉ Π°Π΄ΡΠ΅Ρ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ ΠΊΠΎΠΌΠ°Π½Π΄ pop, Π·Π°Π²Π΅ΡΡΠ°ΡΡΠ΅ΠΉΡΡ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ ret, ΠΊΠ°ΠΊ ΡΡΠΎ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½Π° ΡΠΈΡ. 8.22. ΠΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ ΠΊΠΎΠΌΠ°Π½Π΄ pop Π²ΡΡΠ°Π»ΠΊΠΈΠ²Π°Π΅Ρ ΠΈΠ· ΡΡΠ΅ΠΊΠ° Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ Π΄ΠΎ ΡΠ΅Ρ ΠΏΠΎΡ, ΠΏΠΎΠΊΠ° Π½Π΅ ΠΏΡΠΈΠ΄Π΅Ρ ΠΎΡΠ΅ΡΠ΅Π΄Ρ Π½ΡΠΆΠ½ΠΎΠ³ΠΎ Π°Π΄ΡΠ΅ΡΠ°, ΠΊΠΎΡΠΎΡΡΠΉ ΠΈ Π·Π°Π³ΡΡΠΆΠ°Π΅ΡΡΡ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ ret Π² ΡΠ΅Π³ΠΈΡΡΡ EIP. Π‘ΠΏΠΎΡΠΎΠ± ΡΠ΅Π»Π΅ΡΠΎΠΎΠ±ΡΠ°Π·Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ, Π΅ΡΠ»ΠΈ ΠΈΡΠΊΠΎΠΌΡΠΉ Π°Π΄ΡΠ΅Ρ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ Π½Π΅Π΄Π°Π»Π΅ΠΊΠΎ ΠΎΡ Π²Π΅ΡΡΠΈΠ½Ρ ΡΡΠ΅ΠΊΠ°. ΠΠ°ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎ, ΡΠΏΠΎΡΠΎΠ± ΡΠΊΡΡΡΠΎΠ³ΠΎ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ Π² ΠΎΠ±ΡΠ΅Π΄ΠΎΡΡΡΠΏΠ½ΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ ΠΏΠ΅ΡΠ΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π±ΡΡΠ΅ΡΠ° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ ΡΠ΅ΡΠ²Π΅ΡΠ° ΠΠ½ΡΠ΅ΡΠ½Π΅Ρ IIS.
Π ΠΈΡ. 8.22. ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄ pop ΠΈ ret Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ Π°Π΄ΡΠ΅ΡΠ° ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄Π°β pop EAX 58
β pop EBX 5B
β pop ECX 59
β pop EDX 5A
β pop EBP 5D
β pop ESI 5E
β pop EDI 5F
β ret C3ΠΠ΅ΡΠ΅Ρ ΠΎΠ΄ ΠΏΠΎ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠΌΡ ΡΠ΅Π³ΠΈΡΡΡΠ°. Π‘ΠΏΠΎΡΠΎΠ± ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄Π° ΠΏΠΎ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠΌΡ ΡΠ΅Π³ΠΈΡΡΡΠ° (call register) ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ, Π΅ΡΠ»ΠΈ Π² ΡΠ΅Π³ΠΈΡΡΡΠ΅ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡΡΡ Π°Π΄ΡΠ΅Ρ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΠ³ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ Π½Π°Π³ΡΡΠ·ΠΊΠΈ. Π ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π² ΡΠ΅Π³ΠΈΡΡΡ EIP Π·Π°Π³ΡΡΠΆΠ°Π΅ΡΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΠΏΡΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ call EDX, call EDI ΠΈΠ»ΠΈ ee ΡΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½ΡΠ° (Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ ΡΠ΅Π³ΠΈΡΡΡΠ°, Π² ΠΊΠΎΡΠΎΡΡΠΉ Π·Π°Π³ΡΡΠΆΠ΅Π½ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ).
β call EAX FF D0
β call EBX FF D3
β call ECX FF D1
β call EDX FF D2
β call ESI FF D6
β call EDI FF D7
β call ESP FF D4ΠΡΠΈ ΠΏΡΠΎΡΠΌΠΎΡΡΠ΅ ΠΏΠ°ΠΌΡΡΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠ° ΠΈΠ· Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ KERNEL32. DLL Π±ΡΠ»ΠΈ Π½Π°ΠΉΠ΄Π΅Π½Ρ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡΠΈΠ΅ ΠΏΠ°ΡΡ ΡΠ΅ΡΡΠ½Π°Π΄ΡΠ°ΡΠ΅ΡΠΈΡΠ½ΡΡ Π±Π°ΠΉΡΠΎΠ²:
77F1A2F7 FF D0 call EAX
77F76231 FF D0 call EAX
7FFD29A7 FF D0 call EAX ; a whole block of this pattern exists
7FFD2DE3 FF E6 jmp ESI ; a whole block of this pattern exists
7FFD2E27 FF E0 jmp EAX ; a whole block of this pattern exists
77F3D793 FF D1 call ECX
77F7CEA7 FF D1 call ECX
77F94510 FF D1 call ECX
77F1B424 FF D3 call EBX
77F1B443 FF D3 call EBX
77F1B497 FF D3 call EBX
77F3D8F3 FF D3 call EBX
77F63D01 FF D3 call EBX
77F9B14F FF D4 call ESP
77F020B0 FF D6 call ESI
77F020D5 FF D6 call ESI
77F02102 FF D6 call ESI
77F27CAD FF D6 call ESI
77F27CC2 FF D6 call ESI
77F27CDB FF D6 call ESI
77F01089 FF D7 call EDI
77F01129 FF D7 call EDI
77F01135 FF D7 call EDIΠΡΠΈ ΠΏΠ°ΡΡ ΡΠ΅ΡΡΠ½Π°Π΄ΡΠ°ΡΠ΅ΡΠΈΡΠ½ΡΡ Π±Π°ΠΉΡΠΎΠ² ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½Ρ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π² Π»ΡΠ±ΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅. ΠΠΎ ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π½Π°ΠΉΠ΄Π΅Π½Π½ΡΠ΅ ΠΏΠ°ΡΡ ΡΠ΅ΡΡΠ½Π°Π΄ΡΠ°ΡΠ΅ΡΠΈΡΠ½ΡΡ Π±Π°ΠΉΡΠΎΠ² β ΡΠ°ΡΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° ΡΠ΄ΡΠ° Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°Π΅ΠΌΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ DLL, ΡΠΎ ΠΎΠ±ΡΡΠ½ΠΎ ΠΎΠ½ΠΈ Π½Π°Ρ ΠΎΠ΄ΡΡΡΡ ΠΏΠΎ ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΌ Π°Π΄ΡΠ΅ΡΠ°ΠΌ ΠΏΠ°ΠΌΡΡΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΆΠ΅ΡΡΠΊΠΎ Π·Π°ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°ΡΡ. ΠΠΌΠ΅ΠΉΡΠ΅ Π² Π²ΠΈΠ΄Ρ, ΡΡΠΎ Π² ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ Π²Π΅ΡΡΠΈΡΡ Windows ΠΈ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π²Π΅ΡΡΠΈΡΡ ΡΠ»ΡΠΆΠ΅Π±Π½ΡΡ ΠΏΠ°ΠΊΠ΅ΡΠΎΠ² Service Pack ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡΡ ΠΎΡΠ»ΠΈΡΠ°ΡΡΡΡ. ΠΠ΅ΡΠ΅Ρ ΠΎΠ΄ ΠΏΠΎ ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠΎ Π·Π°ΠΏΠΈΡΠ°Π½Π½ΠΎΠΌΡ Π² ΡΡΠ΅ΠΊ Π°Π΄ΡΠ΅ΡΡ. Π‘ΠΏΠΎΡΠΎΠ± ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄Π° ΠΏΠΎ ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠΎ Π·Π°ΠΏΠΈΡΠ°Π½Π½ΠΎΠΌΡ Π² ΡΡΠ΅ΠΊ Π°Π΄ΡΠ΅ΡΡ (push return) ΡΠ»Π΅Π³ΠΊΠ° ΠΎΡΠ»ΠΈΡΠ°Π΅ΡΡΡ ΠΎΡ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅Π³ΠΎ, Ρ ΠΎΡΡ ΠΈ Π² Π½Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, ΡΠΎΡ ΡΠ°Π½Π΅Π½Π½ΠΎΠ΅ Π² ΡΠ΅Π³ΠΈΡΡΡΠ΅. Π Π°Π·Π»ΠΈΡΠΈΠ΅ ΡΠΎΡΡΠΎΠΈΡ Π² ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ Π²ΠΌΠ΅ΡΡΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ret ΠΊΠΎΠΌΠ°Π½Π΄Ρ call. ΠΡΠ»ΠΈ ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎ, ΡΡΠΎ Π°Π΄ΡΠ΅Ρ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄Π° Π·Π°Π³ΡΡΠΆΠ΅Π½ Π² ΡΠ΅Π³ΠΈΡΡΡ EAX, EBX, ECX, EDX, EBP, ESI ΠΈΠ»ΠΈ EDI, Π½ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Ρ call Π½Π°ΠΉΡΠΈ Π½Π΅ ΡΠ΄Π°Π΅ΡΡΡ, ΡΠΎ ΠΏΠΎΠΏΡΠΎΠ±ΡΠΉΡΠ΅ Π½Π°ΠΉΡΠΈ Π² Π΄Π²ΠΎΠΈΡΠ½ΠΎΠΌ ΠΊΠΎΠ΄Π΅ ΠΏΠ°ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄ push <ΡΠ΅Π³ΠΈΡΡΡ> ΠΈ ret.
β push EAX 50
β push EBX 53
β push ECX 51
β push EDX 52
β push EBP 55
β push ESI 56
β push EDI 57
β ret C3Π Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°Π΅ΠΌΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ΅ Kernel32.DLL ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡΠΈΠ΅ ΠΏΠ°ΡΡ ΡΠ΅ΡΡΠ½Π°Π΄ΡΠ°ΡΠ΅ΡΠΈΡΠ½ΡΡ Π±Π°ΠΉΡΠΎΠ²:
77F3FD18 push EDI
77F3FD19 ret
(?)
77F8E3A8 push ESP
77F8E3A9 retΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΏΠΎΠΈΡΠΊΠ° ΡΠΎΡΠ΅ΠΊ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄Π° Findjmp. ΠΠ° ΡΠΈΡΡΠ½ΠΊΠ΅ 8.23 ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½Π° Π½Π΅Π±ΠΎΠ»ΡΡΠ°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°, ΠΊΠΎΡΠΎΡΠ°Ρ ΡΠΊΠ°Π½ΠΈΡΡΠ΅Ρ Π΄Π²ΠΎΠΈΡΠ½ΡΠΉ ΠΊΠΎΠ΄ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°Π΅ΠΌΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ. ΠΡ ΠΎΠ΄Π½ΡΠΌΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°ΠΌΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΡΠ²Π»ΡΡΡΡΡ ΠΈΠΌΡ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°Π΅ΠΌΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ ΠΈ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΡΠ΅Π³ΠΈΡΡΡΠ° ΠΈΠ· ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ. ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΈΡΠ΅Ρ Ρ Π°ΡΠ°ΠΊΡΠ΅ΡΠ½ΡΠ΅ Π΄Π»Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΠΌΡΡ ΡΠΏΠΎΡΠΎΠ±ΠΎΠ² ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΠΈ ΡΠ΅ΡΡΠ½Π°Π΄ΡΠ°ΡΠ΅ΡΠΈΡΠ½ΡΡ ΡΠΈΡΡ Π² ΡΠ°Π·ΠΌΠ΅ΡΠ΅Π½Π½ΠΎΠΌ Π² ΠΏΠ°ΠΌΡΡΠΈ Π΄Π²ΠΎΠΈΡΠ½ΠΎΠΌ ΠΊΠΎΠ΄Π΅ Π·Π°Π΄Π°Π½Π½ΠΎΠΉ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°Π΅ΠΌΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ. ΠΠ½Π° ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΡΠΏΠΎΡΠΎΠ±Ρ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΏΠΎ ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠΎ Π·Π°ΠΏΠΈΡΠ°Π½Π½ΠΎΠΌΡ Π² ΡΡΠ΅ΠΊ Π°Π΄ΡΠ΅ΡΡ (push return), ΠΏΠΎ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠΌΡ ΡΠ΅Π³ΠΈΡΡΡΠ° (call register) ΠΈ ΡΠ²Π½ΡΠΉ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄ ΠΏΠΎ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠΌΡ ΡΠ΅Π³ΠΈΡΡΡΠ° (jump register).
Π ΠΈΡ. 8.23. ΠΡΡ ΠΎΠ΄Π½ΡΠΉ ΡΠ΅ΠΊΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Findjmp.cΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΈΡΠ΅Ρ Π² Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°Π΅ΠΌΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄Π°, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π² ΡΠ²ΠΎΠΈΡ ΡΠ΅Π»ΡΡ . ΠΠΏΠΎΠ»Π½Π΅ Π²Π΅ΡΠΎΡΡΠ½ΠΎ, ΡΡΠΎ Π΄Π»Ρ ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠΎΠ² Ρ ΠΏΠ΅ΡΠ΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ Π±ΡΡΠ΅ΡΠ° ΠΏΠΎΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡΠ΅Π΅ ΠΌΠ΅ΡΡΠΎ Π΄Π»Ρ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΠΎΠΌΡ ΠΊΠΎΠ΄Ρ, Π°Π΄ΡΠ΅Ρ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ Π·Π°Π³ΡΡΠΆΠ΅Π½ Π² ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ ΡΠ΅Π³ΠΈΡΡΡ. ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΏΠΎΠ΄ΡΠΊΠ°ΠΆΠ΅Ρ ΠΏΠΎΡΠ΅Π½ΡΠΈΠ°Π»ΡΠ½ΠΎΠ΅ ΠΌΠ΅ΡΡΠΎ Π·Π°Π³ΡΡΠ·ΠΊΠΈ Π² ΡΠ΅Π³ΠΈΡΡΡ EIP Π°Π΄ΡΠ΅ΡΠ° Π½ΡΠΆΠ½ΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ.
ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π»Π΅Π³ΠΊΠΎ Π°Π΄Π°ΠΏΡΠΈΡΡΠ΅ΡΡΡ Π΄Π»Ρ ΠΏΠΎΠΈΡΠΊΠ° Π΄ΡΡΠ³ΠΈΡ ΡΠΏΠΎΡΠΎΠ±ΠΎΠ² ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄Π° ΠΈΠ»ΠΈ ΠΎΠ±ΡΠ°Π·ΡΠΎΠ² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° Π² Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°Π΅ΠΌΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ΅ DLL. Π Π½Π°ΡΡΠΎΡΡΠ΅Π΅ Π²ΡΠ΅ΠΌΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΠΏΠΎΠΈΡΠΊ ΡΠ»Π΅Π΄ΡΡΡΠΈΡ ΠΊΠΎΠΌΠ°Π½Π΄:
1) jmp reg;
2) call reg;
3) push reg / ret.
ΠΡΠ΅Ρ ΠΈΡ ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½ΡΠ΅Ρ ΠΎΠ±ΡΠΈΠΉ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ: Π² ΡΠ΅Π³ΠΈΡΡΡ EIP Π·Π°Π³ΡΡΠΆΠ°Π΅ΡΡΡ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ ΡΠ΅Π³ΠΈΡΡΡΠ° reg. ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΡΠ°ΠΊΠΆΠ΅ ΡΠ°ΡΠΏΠΎΠ·Π½Π°Π΅Ρ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΡΠ΅Π³ΠΈΡΡΡΡ:
β’ EAX;
β’ EBX;
β’ ECX;
β’ EDX;
β’ ESI;
β’ EDI;
β’ ESP;
β’ EBP.
ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠ΅ΡΡΡ ΠΊΠ°ΠΊ ΠΊΠΎΠ½ΡΠΎΠ»ΡΠ½ΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° Π»ΡΠ±ΠΎΠΉ ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ΅, ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΠ΅ΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ 32-ΡΠ°Π·ΡΡΠ΄Π½ΡΡ Windows-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π½Π°ΠΉΠ΄Π΅Π½ΠΎ Π² ΡΠ°Π·Π΄Π΅Π»Π΅ ΡΠ°ΠΉΡΠ° ΠΈΠ·Π΄Π°ΡΠ΅Π»ΡΡΡΠ²Π° www.syngress.com/solutions, ΠΏΠΎΡΠ²ΡΡΠ΅Π½Π½ΠΎΠΌ ΠΊΠ½ΠΈΠ³Π΅.
ΠΠΎΠ΄ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° usage() Π²ΡΠ²ΠΎΠ΄ΠΈΡ Π² ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠ΅ ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎ Π²ΡΠ²ΠΎΠ΄Π° (ΠΊΠΎΠ½ΡΠΎΠ»Ρ ΠΈΠ»ΠΈ ΠΏΡΠΈΠ½ΡΠ΅Ρ) ΠΊΡΠ°ΡΠΊΡΡ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΡ ΠΏΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ.void usage()
{
printf(βFindJmp usage\nfindjmp DLL reg\nEx: findjmp
KERNEL32.DLL ESP\nβ);
exit (0);
}
/*The findjmp function is the workhorse. It loads the
requested dll, and searches for specific patterns for jmp
reg, push reg ret, and call reg.*/
void findjmp(char *dll,char *reg)
{
/* patterns for jmp ops */
BYTE jmppat[8][2]= {{0xFF,0xE0},{0xFF,0xE3},{0xFF,0xE1},
{0xFF,0xE2},{0xFF,0xE6},{0xFF,0xE7},
{0xFF,0xE4},{0xFF,0xE5}};
/* patterns for call ops */
BYTE callpat[8][2]= {{0xFF,0xD0},{0xFF,0xD3},{0xFF,0xD1},
{0xFF,0xD2},{0xFF,0xD6},{0xFF,0xD7},
{0xFF,0xD4},{0xFF,0xD5}};
/* patterns for pushret ops */
BYTE pushretpat[8][2]= {{0x50,0xC3},{0x53,0xC3},{0x51,0xC3},
{0x52,0xC3},{0x56,0xC3},{0x57,0xC3},
{0x54,0xC3},{0x55,0xC3}};
/*base pointer for the loaded DLL*/
HMODULE loadedDLL;
/*current position within the DLL */
BYTE *curpos;
/* decimal representation of passed register */
DWORD regnum=GetRegNum(reg);
/*accumulator for addresses*/
DWORD numaddr=0;
/*check if register is useable*/
if(regnum == -1)
{
/*it didnβt load, time to bail*/
printf(βThere was a problem understanding the
register.\nβ\
βPlease check that it is a correct IA32 register
name\nβ\
βCurrently supported are:\n β\
βEAX, EBX, ECX, EDX, ESI, EDI, ESP, EBP\nβ\
);
exit(-1);
}
loadedDLL=LoadLibraryA(dll);
/* check if DLL loaded correctly*/
if(loadedDLL == NULL)
{
/*it didnβt load, time to bail*/
printf(βThere was a problem Loading the requested
DLL.\nβ\
βPlease check that it is in your path and readable\nβ );
exit(-1);
}
else
{
/*we loaded the dll correctly, time to scan it*/
printf(βScanning %s for code useable with the %s
register\nβ,
dll,reg);
/*set curpos at start of DLL*/
curpos=(BYTE*)loadedDLL;