ΠŸΠΎΠΌΠΎΡ‰ΡŒ Π² написании студСнчСских Ρ€Π°Π±ΠΎΡ‚
АнтистрСссовый сСрвис

РСализация Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ…

Π Π΅Ρ„Π΅Ρ€Π°Ρ‚ΠŸΠΎΠΌΠΎΡ‰ΡŒ Π² Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠΈΠ£Π·Π½Π°Ρ‚ΡŒ ΡΡ‚ΠΎΠΈΠΌΠΎΡΡ‚ΡŒΠΌΠΎΠ΅ΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹

ИспользованиС ΠΎΠ±Ρ‰Π΅ΠΉ памяти ЗапускаСмоС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π΅ΡΠΊΡƒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ ΠΈΠ· Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π΅ΡΠΊΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, которая мСняСт Π΄Π°Π½Π½Ρ‹Π΅, располоТСнныС ΠΎΠΏΡΡ‚ΡŒ ΠΆΠ΅ Π² Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π΅ΡΠΊΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅. Запустим Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π²Ρ‚ΠΎΡ€ΠΎΠΉ экзСмпляр прилоТСния. Оно Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ экзСмпляр динамичСской Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ. ΠœΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ситуации, ΠΊΠΎΠ³Π΄Π° ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‚ΠΎΡ€ΠΎΠ΅ Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½ΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ «Π·Π½Π°Π»ΠΎ», Ρ‡Ρ‚ΠΎ… Π§ΠΈΡ‚Π°Ρ‚ΡŒ Π΅Ρ‰Ρ‘ >

РСализация Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… (Ρ€Π΅Ρ„Π΅Ρ€Π°Ρ‚, курсовая, Π΄ΠΈΠΏΠ»ΠΎΠΌ, ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°Ρ)

ΠŸΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠ°Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Данная динамичСская Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°, ΠΏΠΎ ΡΡƒΡ‚ΠΈ, Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π΄Π΅Π»Π°Π΅Ρ‚. ΠŸΡ€ΠΎΡΡ‚ΠΎ ΠΏΡ€ΠΈ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, Π΅Π΅ Π²Ρ‹Π³Ρ€ΡƒΠ·ΠΊΠΈ, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π²Ρ‹Π·ΠΎΠ²Π΅ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ DLLP1 Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Π²Π°Π½ΠΎ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ΅ Windows-сообщСниС. ΠŸΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° Π²Ρ…ΠΎΠ΄Π° Π΄ΠΎΠ»ΠΆΠ½Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ Π½Π΅Π½ΡƒΠ»Π΅Π²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. ΠŸΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° DLLP1 ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠ΄ΠΈΠ½ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€, ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹ΠΉ Ρ‡Π΅Ρ€Π΅Π· стСк ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ способом.

1. bat:

C:masm32inml.exe /c /coff /DMASM dll1.asm.

C:masm32inlink.exe /subsystem:windows /DLL dll1.obj.

pause 0.

dll1.asm:

.386P.

; плоская модСль.

IFDEF MASM.

.MODEL FLAT, stdcall.

ELSE.

.MODEL FLAT.

ENDIF.

PUBLIC DLLP1.

; константы.

; сообщСния, приходящиС ΠΏΡ€ΠΈ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΠΈ.

; динамичСской Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ.

DLL_PROCESS_DETACH equ 0.

DLL_PROCESS_ATTACH equ 1.

DLL_THREAD_ATTACH equ 2.

DLL_THREAD_DETACH equ 3.

IFDEF MASM.

; MASM.

; ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΡ‹ Π²Π½Π΅ΡˆΠ½ΠΈΡ… ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€

EXTERN MessageBoxA@16:NEAR.

; Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Ρ‰ΠΈΠΊΡƒ для ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ.

includelib c: masm32libuser32.lib.

includelib c: masm32libkernel32.lib.

ELSE.

; TASM.

EXTERN MessageBoxA: NEAR.

MessageBoxA@16 = MessageBoxA.

includelib c: asmlibimport32.lib.

ENDIF.

;————————————————————————-;

; сСгмСнт Π΄Π°Π½Π½Ρ‹Ρ….

_DATA SEGMENT DWORD PUBLIC USE32 'DATA'.

TEXT1 DB 'Π’Ρ…ΠΎΠ΄ Π² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ', 0.

TEXT2 DB 'Π’Ρ‹Ρ…ΠΎΠ΄ ΠΈΠ· Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ', 0.

MS DB 'Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ ΠΈΠ· Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ', 0.

TEXT DB 'ΠŸΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° ΠΈΠ· DLL', 0.

_DATA ENDS.

; сСгмСнт ΠΊΠΎΠ΄Π°.

_TEXT SEGMENT DWORD PUBLIC USE32 'CODE'.

; [EBP+10H]; Ρ€Π΅Π·Π΅Ρ€Π²Π½Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€

; [EBP+0CH]; ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π° Π²Ρ‹Π·ΠΎΠ²Π°.

; [EBP+8]; ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ DLL-модуля.

DLLENTRY:

MOV EAX, DWORD PTR [EBP+0CH].

CMP EAX, 0.

JNE D1.

; Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ.

PUSH 0.

PUSH OFFSET MS.

PUSH OFFSET TEXT2.

PUSH 0.

CALL MessageBoxA@16.

JMP _EXIT.

D1:

CMP EAX, 1.

JNE _EXIT.

; ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ.

PUSH 0.

PUSH OFFSET MS.

PUSH OFFSET TEXT1.

PUSH 0.

CALL MessageBoxA@16.

_EXIT:

MOV EAX, 1.

RET 12.

;——————————————————-;

; [EBP+8]; ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹.

DLLP1 PROC EXPORT.

PUSH EBP.

MOV EBP, ESP.

CMP DWORD PTR [EBP+8], 1.

JNE _EX.

PUSH 0.

PUSH OFFSET MS.

PUSH OFFSET TEXT.

PUSH 0.

CALL MessageBoxA@16.

_EX:

POP EBP.

RET 4.

DLLP1 ENDP.

_TEXT ENDS.

END DLLENTRY.

Π―Π²Π½ΠΎΠ΅ связываниС Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ Π²Π½Π°Ρ‡Π°Π»Π΅ Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Π° ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ LoadLibrary. Π—Π°Ρ‚Π΅ΠΌ опрСдСляСтся адрСс ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ GetProcAddress, послС Ρ‡Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡ‚ΡŒ Π²Ρ‹Π·ΠΎΠ². Как ΠΈ ΡΠ»Π΅Π΄ΠΎΠ²Π°Π»ΠΎ ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ, MASM ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅Ρ‚ Π² Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π΅ΡΠΊΡƒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ вмСсто DLLP1 имя _DLLP1@0, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ TASM ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅Ρ‚ имя Π±Π΅Π· искаТСния. Π­Ρ‚ΠΎ я ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°ΡŽ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅. ΠœΡ‹ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Π΅ΠΌ Ρ‚Π°ΠΊΠΆΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ошибки ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ LoadLibrary ΠΈ GetProcAddress. Π’ ΡΡ‚ΠΎΠΉ связи ΡƒΠΊΠ°ΠΆΠ΅ΠΌ, ΠΊΠ°ΠΊ (Π² ΠΊΠ°ΠΊΠΎΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ) ΠΈΡ‰Π΅Ρ‚ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ функция LoadLibrary:

Π€Π°ΠΉΠ» Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈΠ· ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ ΠΏΡƒΠ½ΠΊΡ‚Π°.

Основной ΠΌΠΎΠ΄ΡƒΠ»ΡŒ:

dllex.asm:

.386P.

; плоская модСль.

.MODEL FLAT, stdcall.

; константы.

; ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΡ‹ Π²Π½Π΅ΡˆΠ½ΠΈΡ… ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€

IFDEF MASM.

;MASM.

EXTERN GetProcAddress@8:NEAR.

EXTERN LoadLibraryA@4:NEAR.

EXTERN FreeLibrary@4:NEAR.

EXTERN ExitProcess@4:NEAR.

EXTERN MessageBoxA@16:NEAR.

; Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Ρ‰ΠΈΠΊΡƒ для ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ.

includelib c: masm32libuser32.lib.

includelib c: masm32libkernel32.lib.

ELSE.

; TASM.

EXTERN GetProcAddress: NEAR.

EXTERN LoadLibraryA: NEAR.

EXTERN FreeLibrary: NEAR.

EXTERN ExitProcess: NEAR.

EXTERN MessageBoxA: NEAR.

; Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Ρ‰ΠΈΠΊΡƒ для ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ.

includelib c: asm32libimport32.lib.

GetProcAddress@8 = GetProcAddress.

LoadLibraryA@4 = LoadLibraryA.

FreeLibrary@4 = FreeLibrary.

ExitProcess@4 = ExitProcess.

MessageBoxA@16 = MessageBoxA.

ENDIF.

;————————————————————;

; сСгмСнт Π΄Π°Π½Π½Ρ‹Ρ….

_DATA SEGMENT DWORD PUBLIC USE32 'DATA'.

TXT DB 'Ошибка динамичСской Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ', 0.

MS DB 'Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅', 0.

LIBR DB 'DLL1.DLL', 0.

HLIB DD ?

IFDEF MASM.

NAMEPROC DB '_DLLP1@0', 0.

ELSE.

NAMEPROC DB 'DLLP1', 0.

ENDIF.

_DATA ENDS.

; сСгмСнт ΠΊΠΎΠ΄Π°.

_TEXT SEGMENT DWORD PUBLIC USE32 'CODE'.

START:

; Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ.

PUSH OFFSET LIBR.

CALL LoadLibraryA@4.

CMP EAX, 0.

JE _ERR.

MOV HLIB, EAX.

; ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ адрСс ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹.

PUSH OFFSET NAMEPROC.

PUSH HLIB.

CALL GetProcAddress@8.

CMP EAX, 0.

JNE YES_NAME.

; сообщСниС ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ΅.

_ERR:

PUSH 0.

PUSH OFFSET MS.

PUSH OFFSET TXT.

PUSH 0.

CALL MessageBoxA@16.

JMP _EXIT.

YES_NAME:

PUSH 1; ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€

CALL EAX.

; Π·Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ.

PUSH HLIB.

CALL FreeLibrary@4.

; Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° автоматичСски закрываСтся Ρ‚Π°ΠΊΠΆΠ΅.

; ΠΏΡ€ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π΅ ΠΈΠ· ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

; Π²Ρ‹Ρ…ΠΎΠ΄.

_EXIT:

PUSH 0.

CALL ExitProcess@4.

_TEXT ENDS.

END START.

1. bat:

c:masm32inml /c /coff /DMASM dllex.asm.

c:masm32inlink /subsystem:windows dllex.obj.

pause 0.

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

Рис. 2 Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹

НСявноС связываниС ΠœΡ‹ Π·Π΄Π΅ΡΡŒ рассмотрим Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ вызываСмая ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, СстСствСнно Π½Π΅ ΠΌΠ΅Π½ΡΠ΅Ρ‚ся. Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, тСкст ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ стал нСсколько ΠΏΡ€ΠΎΡ‰Π΅. Π—Π΄Π΅ΡΡŒ Π²Π°ΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ, Π²ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΡƒΡŽ ΠΈΠ· Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π΅ΡΠΊΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ ΠΊΠ°ΠΊ внСшнюю, Π°, Π²ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΡΡ‚Π°Ρ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ DLLP1.LIB.

Π€Π°ΠΉΠ» Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ самый.

dllex.asm:

.386P.

; плоская модСль.

IFDEF MASM.

.MODEL FLAT, stdcall.

ELSE.

.MODEL FLAT.

ENDIF.

; константы.

; ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΡ‹ Π²Π½Π΅ΡˆΠ½ΠΈΡ… ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€

includelib dll1.lib.

IFDEF MASM.

; MASM.

EXTERN DLLP1@0:NEAR.

EXTERN ExitProcess@4:NEAR.

; Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Ρ‰ΠΈΠΊΡƒ для ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ.

includelib c: masm32libuser32.lib.

includelib c: masm32libkernel32.lib.

ELSE.

; Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Ρ‰ΠΈΠΊΡƒ для ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ.

includelib c: asm32libimport32.lib.

EXTERN DLLP1: NEAR.

EXTERN ExitProcess: NEAR.

DLLP1@0 = DLLP1.

ExitProcess@4 = ExitProcess.

ENDIF.

;——————————————————————————;

; сСгмСнт Π΄Π°Π½Π½Ρ‹Ρ….

_DATA SEGMENT DWORD PUBLIC USE32 'DATA'.

_DATA ENDS.

; сСгмСнт ΠΊΠΎΠ΄Π°.

_TEXT SEGMENT DWORD PUBLIC USE32 'CODE'.

START:

PUSH 1; ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€

CALL DLLP1@0.

; Π²Ρ‹Ρ…ΠΎΠ΄.

_EXIT:

PUSH 0.

CALL ExitProcess@4.

_TEXT ENDS.

END START.

1. bat:

c:masm32inml /c /coff /DMASM dllex.asm.

c:masm32inlink /subsystem:windows dllex.obj.

pause 0.

Рис. 3 Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹

ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Основной процСсс ΠΈ Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π΅ΡΠΊΠ°Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎΠΆΠ΅ адрСсноС пространство.

ΠŸΡ€ΠΎΡ†Π΅ΡΡ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ адрСса строк, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ находятся Π² Π±Π»ΠΎΠΊΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… основного процСсса.

Π’ ΡΠ²ΠΎΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π² ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ процСсс адрСс строки, находящСйся Π² Π±Π»ΠΎΠΊΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… динамичСской Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ:

dll2.asm:

; динамичСская Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° DLL2.ASM.

.386P.

; плоская модСль.

IFDEF MASM.

.MODEL FLAT, stdcall.

ELSE.

.MODEL FLAT.

ENDIF.

PUBLIC DLLP1.

; константы.

; сообщСния, приходящиС ΠΏΡ€ΠΈ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΠΈ.

; динамичСской Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ.

DLL_PROCESS_DETACH equ 0.

DLL_PROCESS_ATTACH equ 1.

DLL_THREAD_ATTACH equ 2.

DLL_THREAD_DETACH equ 3.

IFDEF MASM.

; MASM.

; ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΡ‹ Π²Π½Π΅ΡˆΠ½ΠΈΡ… ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€

EXTERN MessageBoxA@16:NEAR.

; Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Ρ‰ΠΈΠΊΡƒ для ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ.

includelib c: masm32libuser32.lib.

includelib c: masm32libkernel32.lib.

ELSE.

; TASM.

EXTERN MessageBoxA: NEAR.

MessageBoxA@16 = MessageBoxA.

includelib c: asm32libimport32.lib.

ENDIF.

;————————————————————————-;

; сСгмСнт Π΄Π°Π½Π½Ρ‹Ρ….

_DATA SEGMENT DWORD PUBLIC USE32 'DATA'.

TEXT DB «Π‘Ρ‚Ρ€ΠΎΠΊΠ° Π² Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π΅ΡΠΊΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅», 0.

_DATA ENDS.

; сСгмСнт ΠΊΠΎΠ΄Π°.

_TEXT SEGMENT DWORD PUBLIC USE32 'CODE'.

; [EBP+10H]; Ρ€Π΅Π·Π΅Ρ€Π²Π½Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€

; [EBP+0CH]; ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π° Π²Ρ‹Π·ΠΎΠ²Π°.

; [EBP+8]; ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ DLL-модуля.

DLLENTRY:

MOV EAX, DWORD PTR [EBP+0CH].

CMP EAX, 0.

JNE D1.

; Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ.

JMP _EXIT.

D1:

CMP EAX, 1.

JNE _EXIT.

; ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ.

_EXIT:

MOV EAX, 1.

RET 12.

;——————————;

; адрСса ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ².

; [EBP+8].

; [EBP+0CH].

DLLP1 PROC EXPORT.

PUSH EBP.

MOV EBP, ESP.

PUSH 0.

PUSH DWORD PTR [EBP+0CH].

PUSH DWORD PTR [EBP+8].

PUSH 0.

CALL MessageBoxA@16.

POP EBP.

LEA EAX, TEXT.

RET 8.

DLLP1 ENDP.

_TEXT ENDS.

END DLLENTRY.

dllex.asm:

; основной ΠΌΠΎΠ΄ΡƒΠ»ΡŒ DLLEX2. ASM, Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ.

; ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ ΠΈΠ· Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π΅ΡΠΊΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ.

.386P.

; плоская модСль.

.MODEL FLAT, stdcall.

; константы.

; ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΡ‹ Π²Π½Π΅ΡˆΠ½ΠΈΡ… ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€

IFDEF MASM.

; MASM.

EXTERN GetProcAddress@8:NEAR.

EXTERN LoadLibraryA@4:NEAR.

EXTERN FreeLibrary@4:NEAR.

EXTERN ExitProcess@4:NEAR.

EXTERN MessageBoxA@16:NEAR.

includelib c: masm32libuser32.lib.

includelib c: masm32libkernel32.lib.

ELSE.

; TASM.

includelib c: asm32libimport32.lib.

EXTERN GetProcAddress: NEAR.

EXTERN LoadLibraryA: NEAR.

EXTERN FreeLibrary: NEAR.

EXTERN ExitProcess: NEAR.

EXTERN MessageBoxA: NEAR.

GetProcAddress@8 = GetProcAddress.

LoadLibraryA@4 = LoadLibraryA.

FreeLibrary@4 = FreeLibrary.

ExitProcess@4 = ExitProcess.

MessageBoxA@16 = MessageBoxA.

ENDIF.

;——————————————————————-;

; сСгмСнт Π΄Π°Π½Π½Ρ‹Ρ….

_DATA SEGMENT DWORD PUBLIC USE32 'DATA'.

TXT DB 'Ошибка динамичСской Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ', 0.

MS DB 'Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅', 0.

LIBR DB 'DLL2.DLL', 0.

HLIB DD ?

MS1 DB 'Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ ΠΈΠ· Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ', 0.

TEXT DB 'Π­Ρ‚ΠΎ Π² ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΌ ΠΌΠΎΠ΄ΡƒΠ»Π΅', 0.

IFDEF MASM.

NAMEPROC DB '_DLLP1@0', 0.

ELSE.

NAMEPROC DB 'DLLP1', 0.

ENDIF.

_DATA ENDS.

; сСгмСнт ΠΊΠΎΠ΄Π°.

_TEXT SEGMENT DWORD PUBLIC USE32 'CODE'.

; [EBP+10H]; Ρ€Π΅Π·Π΅Ρ€Π²Π½Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€

; [EBP+0CH]; ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π° Π²Ρ‹Π·ΠΎΠ²Π°.

; [EBP+8]; ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ DLL-модуля.

START:

; Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ.

PUSH OFFSET LIBR.

CALL LoadLibraryA@4.

CMP EAX, 0.

JE _ERR.

MOV HLIB, EAX.

; ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ адрСс.

PUSH OFFSET NAMEPROC.

PUSH HLIB.

CALL GetProcAddress@8.

CMP EAX, 0.

JNE YES_NAME.

; сообщСниС ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ΅.

_ERR:

PUSH 0.

PUSH OFFSET MS.

PUSH OFFSET TXT.

PUSH 0.

CALL MessageBoxA@16.

JMP _EXIT.

YES_NAME:

PUSH OFFSET MS1.

PUSH OFFSET TEXT.

CALL EAX.

PUSH 0.

PUSH OFFSET MS.

PUSH EAX.

PUSH 0.

CALL MessageBoxA@16.

; Π·Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ.

PUSH HLIB.

CALL FreeLibrary@4.

; Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° автоматичСски закрываСтся Ρ‚Π°ΠΊΠΆΠ΅.

; ΠΏΡ€ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π΅ ΠΈΠ· ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

; Π²Ρ‹Ρ…ΠΎΠ΄.

_EXIT:

PUSH 0.

CALL ExitProcess@4.

_TEXT ENDS.

END START.

1. bat:

c:masm32inml /c /coff /DMASM dllex2.asm.

c:masm32inlink /subsystem:windows dllex2.obj.

pause 0.

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ (Ρ‡Π°ΡΡ‚ΡŒ 1).

Рис. 4 Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ (Ρ‡Π°ΡΡ‚ΡŒ 1)

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ (Ρ‡Π°ΡΡ‚ΡŒ 2).

Рис. 5 Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ (Ρ‡Π°ΡΡ‚ΡŒ 2)

ИспользованиС рСсурсов Основной процСсс ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ рСсурсы Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Π½ΠΎΠΉ ΠΈΠΌ Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π΅ΡΠΊΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ. РСсурсы ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ ΠΎΡ‚ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π΅ΡΠΊΡƒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ, загруТая ΠΈΡ… ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ нСобходимости.

Наша ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π²Π½Π°Ρ‡Π°Π»Π΅ Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ ΠΈΠΊΠΎΠ½ΠΊΡƒ ΠΈΠ· Ρ€Π΅ΡΡƒΡ€ΡΠΎΠ² динамичСской Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ‚ Π΅Π΅ Π½Π° ΠΎΠΊΠ½ΠΎ. Если Ρ‰Π΅Π»ΠΊΠ°Ρ‚ΡŒ Π»Π΅Π²ΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΎΠΉ ΠΌΡ‹ΡˆΠΈ, Π½Π°ΠΏΡ€Π°Π²ΠΈΠ² курсор Π½Π° ΠΎΠΊΠ½ΠΎ, Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° ΠΈΠ· Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π΅ΡΠΊΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, которая Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎ ΠΎΠ΄ΠΈΠ½, Ρ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π·Π½Π°Ρ‡ΠΎΠΊ Π½Π° ΠΎΠΊΠ½ΠΎ.

dll3.rc:

// ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹.

#define IDI_ICON1 3.

#define IDI_ICON2 10.

// ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ»ΠΈ ΠΈΠΊΠΎΠ½ΠΊΡƒ.

IDI_ICON1 ICON «ico1.ico» .

IDI_ICON2 ICON «ico2.ico» .

dllex.rc:

// ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ констант.

#define WS_SYSMENU 0×8 0000L.

#define WS_MINIMIZEBOX 0×2 0000L.

#define WS_MAXIMIZEBOX 0×1 0000L.

#define DS_3DLOOK 0×0004L.

// ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π°.

DIAL1 DIALOG 0, 0, 340, 120.

STYLE WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | DS_3DLOOK.

CAPTION «Π”ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ с ΠΈΠΊΠΎΠ½ΠΊΠΎΠΉ ΠΈΠ· Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π΅ΡΠΊΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ» .

FONT 8, «Arial» .

{.

}.

dll3.asm:

; динамичСская Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° DLL3.ASM.

.386P.

PUBLIC SETIC.

; плоская модСль.

IFDEF MASM.

.MODEL FLAT, stdcall.

ELSE.

.MODEL FLAT.

ENDIF.

; константы.

WM_SETICON equ 80h.

IFDEF MASM.

; MASM.

; ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΡ‹ Π²Π½Π΅ΡˆΠ½ΠΈΡ… ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€

EXTERN LoadIconA@8:NEAR.

EXTERN PostMessageA@16:NEAR.

; Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Ρ‰ΠΈΠΊΡƒ для ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ.

includelib c: masm32libuser32.lib.

includelib c: masm32libkernel32.lib.

ELSE.

; TASM.

; ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΡ‹ Π²Π½Π΅ΡˆΠ½ΠΈΡ… ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€

EXTERN LoadIconA: NEAR.

EXTERN PostMessageA: NEAR.

; Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Ρ‰ΠΈΠΊΡƒ для ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ.

includelib c: asmlibimport32.lib.

LoadIconA@8 = LoadIconA.

PostMessageA@16 = PostMessageA.

ENDIF.

;————————————————————————;

; сСгмСнт Π΄Π°Π½Π½Ρ‹Ρ….

_DATA SEGMENT DWORD PUBLIC USE32 'DATA'.

PRIZ DB 0.

_DATA ENDS.

; сСгмСнт ΠΊΠΎΠ΄Π°.

_TEXT SEGMENT DWORD PUBLIC USE32 'CODE'.

DLLENTRY:

MOV EAX, 1.

RET 12.

; [EBP+8].

; [EBP+0CH].

SETIC PROC EXPORT.

PUSH EBP.

MOV EBP, ESP.

; Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊΡƒΡŽ ΠΈΠΊΠΎΠ½ΠΊΡƒ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ.

CMP PRIZ, 0.

JZ IC1.

MOV PRIZ, 0.

PUSH 3.

JMP CONT.

IC1:

MOV PRIZ, 1.

PUSH 10.

CONT:

; Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ ΠΈΠΊΠΎΠ½ΠΊΡƒ ΠΈΠ· Ρ€Π΅ΡΡƒΡ€ΡΠΎΠ² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ.

PUSH DWORD PTR [EBP+0CH]; ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€

; динамичСской.

; Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ.

CALL LoadIconA@8.

; ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡ΠΎΠΊ ΠΎΠΊΠ½Π°.

PUSH EAX.

PUSH 0.

PUSH WM_SETICON.

PUSH DWORD PTR [EBP+08H]; дСскриптор ΠΎΠΊΠ½Π°.

CALL PostMessageA@16.

POP EBP.

RET 8.

SETIC ENDP.

_TEXT ENDS.

END DLLENTRY.

dllex3.asm:

; основной ΠΌΠΎΠ΄ΡƒΠ»ΡŒ DLLEX3. ASM, Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ.

; ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ ΠΈΠ· Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π΅ΡΠΊΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ.

.386P.

; плоская модСль.

IFDEF MASM.

.MODEL FLAT, stdcall.

ELSE.

.MODEL FLAT.

ENDIF.

; константы.

; сообщСниС ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ ΠΏΡ€ΠΈ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠΈ ΠΎΠΊΠ½Π°.

WM_CLOSE equ 10h.

WM_INITDIALOG equ 110h.

WM_SETICON equ 80h.

WM_LBUTTONDOWN equ 201h.

; ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΡ‹ Π²Π½Π΅ΡˆΠ½ΠΈΡ… ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€

IFDEF MASM.

; MASM.

EXTERN PostMessageA@16:NEAR.

EXTERN GetProcAddress@8:NEAR.

EXTERN LoadLibraryA@4:NEAR.

EXTERN FreeLibrary@4:NEAR.

EXTERN ExitProcess@4:NEAR.

EXTERN GetModuleHandleA@4:NEAR.

EXTERN DialogBoxParamA@20:NEAR.

EXTERN EndDialog@8:NEAR.

EXTERN LoadIconA@8:NEAR.

; Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Ρ‰ΠΈΠΊΡƒ для ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ.

includelib c: masm32libuser32.lib.

includelib c: masm32libkernel32.lib.

ELSE.

; Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Ρ‰ΠΈΠΊΡƒ для ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ.

includelib c: asmlibimport32.lib.

EXTERN PostMessageA: NEAR.

EXTERN GetProcAddress: NEAR.

EXTERN LoadLibraryA: NEAR.

EXTERN FreeLibrary: NEAR.

EXTERN ExitProcess: NEAR.

EXTERN GetModuleHandleA: NEAR.

EXTERN DialogBoxParamA: NEAR.

EXTERN EndDialog: NEAR.

EXTERN LoadIconA: NEAR.

PostMessageA@16 = PostMessageA.

LoadIconA@8 = LoadIconA.

EndDialog@8 = EndDialog.

GetModuleHandleA@4 = GetModuleHandleA.

DialogBoxParamA@20 = DialogBoxParamA.

GetProcAddress@8 = GetProcAddress.

LoadLibraryA@4 = LoadLibraryA.

FreeLibrary@4 = FreeLibrary.

ExitProcess@4 = ExitProcess.

ENDIF.

;———————————————————————-;

; сСгмСнт Π΄Π°Π½Π½Ρ‹Ρ….

_DATA SEGMENT DWORD PUBLIC USE32 'DATA'.

LIBR DB 'DLL3.DLL', 0.

HLIB DD ?

HINST DD ?

PA DB «DIAL1», 0.

IFDEF MASM.

NAMEPROC DB «_SETIC@0», 0.

ELSE.

NAMEPROC DB «SETIC», 0.

ENDIF.

_DATA ENDS.

; сСгмСнт ΠΊΠΎΠ΄Π°.

_TEXT SEGMENT DWORD PUBLIC USE32 'CODE'.

START:

; ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ дСскриптор прилоТСния.

PUSH 0.

CALL GetModuleHandleA@4.

; ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π΄ΠΈΠ°Π»ΠΎΠ³.

MOV [HINST], EAX.

PUSH 0.

PUSH OFFSET WNDPROC.

PUSH 0.

PUSH OFFSET PA.

PUSH [HINST].

CALL DialogBoxParamA@20.

; Π²Ρ‹Ρ…ΠΎΠ΄.

_EXIT:

PUSH 0.

CALL ExitProcess@4.

; ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° ΠΎΠΊΠ½Π°.

; располоТСниС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π² ΡΡ‚Π΅ΠΊΠ΅.

; [EBP+014Н]; LPARAM.

; [EBP+10Н]; WAPARAM.

; [EBP+0CH]; MES.

; [EBP+8]; HWND.

WNDPROC PROC.

PUSH EBP.

MOV EBP, ESP.

PUSH EBX.

PUSH ESI.

PUSH EDI.

;—————————;

CMP DWORD PTR [EBP+0CH], WM_CLOSE.

JNE L1.

; Π·Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ.

; Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° автоматичСски закрываСтся Ρ‚Π°ΠΊΠΆΠ΅.

; ΠΏΡ€ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π΅ ΠΈΠ· ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

PUSH HLIB.

CALL FreeLibrary@4.

PUSH 0.

PUSH DWORD PTR [EBP+08H].

CALL EndDialog@8.

JMP FINISH.

L1:

CMP DWORD PTR [EBP+0CH], WM_INITDIALOG.

JNE L2.

; Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ.

PUSH OFFSET LIBR.

CALL LoadLibraryA@4.

MOV HLIB, EAX.

; Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ ΠΈΠΊΠΎΠ½ΠΊΡƒ.

PUSH 3; ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΈΠΊΠΎΠ½ΠΊΠΈ.

PUSH [HLIB]; ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ процСсса.

CALL LoadIconA@8.

; ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΈΠΊΠΎΠ½ΠΊΡƒ.

PUSH EAX.

PUSH 0; Ρ‚ΠΈΠΏ ΠΈΠΊΠΎΠ½ΠΊΠΈ (малСнькая).

PUSH WM_SETICON.

PUSH DWORD PTR [EBP+08H].

CALL PostMessageA@16.

JMP FINISH.

L2:

CMP DWORD PTR [EBP+0CH], WM_LBUTTONDOWN.

JNE FINISH.

; ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ адрСс ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ ΠΈΠ· Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π΅ΡΠΊΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ.

PUSH OFFSET NAMEPROC.

PUSH HLIB.

CALL GetProcAddress@8.

; Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ с Π΄Π²ΡƒΠΌΡ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ.

PUSH [HLIB].

PUSH DWORD PTR [EBP+08H].

CALL EAX.

FINISH:

POP EDI.

POP ESI.

POP EBX.

POP EBP.

MOV EAX, 0.

RET 16.

WNDPROC ENDP.

_TEXT ENDS.

END START.

1. bat:

c:masm32inml /c /coff /DMASM dllex3.asm.

c:masm32in c dllex3.rc.

c:masm32inlink /subsystem:windows dllex3. obj dllex3.res.

pause 0.

c:masm32inml /c /coff /DMASM dll3.asm.

c:masm32in c dll3.rc.

c:masm32inlink /subsystem:windows /DLL /ENTRY:DLLENTRY dll3. obj dll3.res.

pause 0.

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ (Ρ‡Π°ΡΡ‚ΡŒ 1).

Рис. 6 Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ (Ρ‡Π°ΡΡ‚ΡŒ 1)

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ (Ρ‡Π°ΡΡ‚ΡŒ 2).

Рис. 7 Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ (Ρ‡Π°ΡΡ‚ΡŒ 2)

ИспользованиС ΠΎΠ±Ρ‰Π΅ΠΉ памяти ЗапускаСмоС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π΅ΡΠΊΡƒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ ΠΈΠ· Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π΅ΡΠΊΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, которая мСняСт Π΄Π°Π½Π½Ρ‹Π΅, располоТСнныС ΠΎΠΏΡΡ‚ΡŒ ΠΆΠ΅ Π² Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π΅ΡΠΊΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅. Запустим Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π²Ρ‚ΠΎΡ€ΠΎΠΉ экзСмпляр прилоТСния. Оно Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ экзСмпляр динамичСской Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ. ΠœΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ситуации, ΠΊΠΎΠ³Π΄Π° ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‚ΠΎΡ€ΠΎΠ΅ Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½ΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ «Π·Π½Π°Π»ΠΎ», Ρ‡Ρ‚ΠΎ ΠΏΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π΅ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ прилоТСния Π΄Π°Π½Π½Ρ‹Π΅ ΡƒΠΆΠ΅ измСнились. Ясно, Ρ‡Ρ‚ΠΎ Π² ΡΡ‚ΠΎΠΌ случаС Π΄Π°Π½Π½Ρ‹Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ ΠΎΠΏΠ΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ динамичСская Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°, Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ±Ρ‰ΠΈΠΌΠΈ. ВСхничСски это дСлаСтся ΠΎΡ‡Π΅Π½ΡŒ просто.

Π£ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π° связСй LINK Π΅ΡΡ‚ΡŒ опция /section: имя, Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹, которая позволяСт ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ явно свойства Π΄Π°Π½Π½ΠΎΠΉ сСкции. Достаточно ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ сСкция — это просто сСгмСнт Π² ΡΡ‚Π°Ρ€ΠΎΠΌ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠΈ. Π’ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π΅ связСй TLINK32 Ρ‚ΠΎ ΠΆΠ΅ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„Π°ΠΉΠ»Π° .DEF.

ΠŸΠ΅Ρ€Π΅Π΄ Π²Ρ‹Ρ…ΠΎΠ΄ΠΎΠΌ ΠΈΠ· ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ динамичСской Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ измСняСтся строка, хранящаяся Π² Ρ€Π°Π·Π΄Π΅Π»ΡΠ΅ΠΌΠΎΠΉ сСкции памяти. ΠŸΡ€ΠΈ этом ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π΅ Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°Π΅Ρ‚ своСй Ρ€Π°Π±ΠΎΡ‚Ρ‹. ΠŸΡ€ΠΈ запускС Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ экзСмпляра прилоТСния Π½Π° ΡΠΊΡ€Π°Π½ выводится ΡƒΠΆΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½ΠΎΠ΅ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ строки.

dll4.asm:

; динамичСская Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° DLL4.ASM.

.386P.

; плоская модСль.

IFDEF MASM.

.MODEL FLAT, stdcall.

ELSE.

.MODEL FLAT.

ENDIF.

PUBLIC DLLP1.

IFDEF MASM.

; MASM.

; ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΡ‹ Π²Π½Π΅ΡˆΠ½ΠΈΡ… ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€

EXTERN MessageBoxA@16:NEAR.

; Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Ρ‰ΠΈΠΊΡƒ для ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ.

includelib c: masm32libuser32.lib.

includelib c: masm32libkernel32.lib.

ELSE.

; TASM.

EXTERN MessageBoxA: NEAR.

MessageBoxA@16 = MessageBoxA.

includelib c: asmlibimport32.lib.

ENDIF.

;————————————————————————-;

; сСгмСнт Π΄Π°Π½Π½Ρ‹Ρ….

_DATA SEGMENT DWORD PUBLIC USE32 'DATA'.

TEXT DB «Π’ Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π΅ΡΠΊΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅», 0.

MS DB «Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅», 0.

_DATA ENDS.

; сСгмСнт ΠΊΠΎΠ΄Π°.

_TEXT SEGMENT DWORD PUBLIC USE32 'CODE'.

; [EBP+10H]; Ρ€Π΅Π·Π΅Ρ€Π²Π½Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€

; [EBP+0CH]; ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π° Π²Ρ‹Π·ΠΎΠ²Π°.

; [EBP+8]; ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ DLL-модуля.

DLLENTRY:

MOV EAX, 1.

RET 12.

;————————-;

;адрСса ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ².

DLLP1 PROC EXPORT.

PUSH EBP.

MOV EBP, ESP.

PUSH 0.

PUSH OFFSET MS.

PUSH OFFSET TEXT.

PUSH 0.

CALL MessageBoxA@16.

; ΠΈΠ·ΠΌΠ΅Π½ΠΈΠΌ строку, Ρ€Π°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½Π½ΡƒΡŽ Π² Ρ€Π°Π·Π΄Π΅Π»ΡΠ΅ΠΌΠΎΠΉ памяти.

MOV TEXT,'И'.

MOV TEXT+1,'Π·'.

POP EBP.

RET.

DLLP1 ENDP.

_TEXT ENDS.

END DLLENTRY.

dllex4.asm:

; основной ΠΌΠΎΠ΄ΡƒΠ»ΡŒ DLLEX4. ASM, Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ.

; ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ ΠΈΠ· Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π΅ΡΠΊΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ.

.386P.

; плоская модСль.

.MODEL FLAT, stdcall.

; константы.

; ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΡ‹ Π²Π½Π΅ΡˆΠ½ΠΈΡ… ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€

IFDEF MASM.

; MASM.

EXTERN GetProcAddress@8:NEAR.

EXTERN LoadLibraryA@4:NEAR.

EXTERN FreeLibrary@4:NEAR.

EXTERN ExitProcess@4:NEAR.

EXTERN MessageBoxA@16:NEAR.

; Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Ρ‰ΠΈΠΊΡƒ для ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ.

includelib c: masm32libuser32.lib.

includelib c: masm32libkernel32.lib.

ELSE.

; Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ ΠΊΠΎΠΏΠΎΠ½ΠΎΠ²Ρ‰ΠΈΠΊΡƒ для ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ.

includelib c: asmlibimport32.lib.

EXTERN GetProcAddress: NEAR.

EXTERN LoadLibraryA: NEAR.

EXTERN FreeLibrary: NEAR.

EXTERN ExitProcess: NEAR.

EXTERN MessageBoxA: NEAR.

GetProcAddress@8 = GetProcAddress.

LoadLibraryA@4 = LoadLibraryA.

FreeLibrary@4 = FreeLibrary.

ExitProcess@4 = ExitProcess.

MessageBoxA@16 = MessageBoxA.

ENDIF.

;————————————————-;

; сСгмСнт Π΄Π°Π½Π½Ρ‹Ρ….

_DATA SEGMENT DWORD PUBLIC USE32 'DATA'.

TXT DB 'Ошибка динамичСской Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ', 0.

MS DB 'Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅', 0.

LIBR DB 'DLL4.DLL', 0.

HLIB DD ?

IFDEF MASM.

NAMEPROC DB '_DLLP1@0', 0.

ELSE.

NAMEPROC DB 'DLLP1', 0.

ENDIF.

_DATA ENDS.

; сСгмСнт ΠΊΠΎΠ΄Π°.

_TEXT SEGMENT DWORD PUBLIC USE32 'CODE'.

; [EBP+10H]; Ρ€Π΅Π·Π΅Ρ€Π²Π½Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€

; [EBP+0CH]; ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π° Π²Ρ‹Π·ΠΎΠ²Π°.

; [EBP+8]; ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ DLL-модуля.

START:

; Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ.

PUSH OFFSET LIBR.

CALL LoadLibraryA@4.

CMP EAX, 0.

JE _ERR.

MOV HLIB, EAX.

; ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ адрСс.

PUSH OFFSET NAMEPROC.

PUSH HLIB.

CALL GetProcAddress@8.

CMP EAX, 0.

JNE YES_NAME.

; сообщСниС ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ΅.

_ERR:

PUSH 0.

PUSH OFFSET MS.

PUSH OFFSET TXT.

PUSH 0.

CALL MessageBoxA@16.

JMP _EXIT.

YES_NAME:

CALL EAX.

PUSH 0.

PUSH OFFSET MS.

PUSH OFFSET MS.

PUSH 0.

CALL MessageBoxA@16.

; Π·Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ.

; Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° автоматичСски закрываСтся Ρ‚Π°ΠΊΠΆΠ΅.

; ΠΏΡ€ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π΅ ΠΈΠ· ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

PUSH OFFSET NAMEPROC.

PUSH HLIB.

CALL FreeLibrary@4.

; Π²Ρ‹Ρ…ΠΎΠ΄.

_EXIT:

PUSH 0.

CALL ExitProcess@4.

_TEXT ENDS.

END START.

1. bat:

c: asmin asm32 /ml dll4.asm.

c: asmin link32 -aaTpd dll4. obj, dll4.def.

c: asmin asm32 /ml dllex4.asm.

c: asmin link32 -aa dllex4.obj.

pause 0.

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ (Ρ‡Π°ΡΡ‚ΡŒ 1).

Рис. 8 Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ (Ρ‡Π°ΡΡ‚ΡŒ 1)

Рис. 9 Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ (Ρ‡Π°ΡΡ‚ΡŒ 2)

ΠŸΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ вСсь тСкст
Π—Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Ρ„ΠΎΡ€ΠΌΡƒ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Ρ€Π°Π±ΠΎΡ‚ΠΎΠΉ