Всем Доброго Времени Суток! Написал небольой DLL, чтобы внедрить его в блокнот. Сама DLL выглядит так: Код (Text): format PE GUI 4.0 DLL include 'win32ax.inc' lf1 LOGFONT \ 12,7,\ ;lfHeight & lfWidth 0,0,\ ;lfEscapement(наклон отн. Х в 10х градуса) & lfOrientation FW_NORMAL,0,0,0,\ ;lfWeight & lfItalic & lfUnderline & lfStrikeOut RUSSIAN_CHARSET,\ ;lfCharSet OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,\ ;lfOutPrecision & lfClipPrecision & lfQuality FF_MODERN+FIXED_PITCH,\ ;lpPitchAndFamily ;FIXED_PITCH=моноширинный=красивосорцен Ж) "Tw Cen MT" ;lfFaceName lf2 LOGFONT \ 12,7,\ ;lfHeight & lfWidth 0,0,\ ;lfEscapement(наклон отн. Х в 10х градуса) & lfOrientation FW_NORMAL,0,TRUE,0,\ ;lfWeight & lfItalic & lfUnderline & lfStrikeOut RUSSIAN_CHARSET,\ ;lfCharSet OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,\ ;lfOutPrecision & lfClipPrecision & lfQuality FF_MODERN+FIXED_PITCH,\ ;lpPitchAndFamily ;FIXED_PITCH=моноширинный=красивосорцен Ж) "courier new" msg db 'fedcb9870',0 hw rd 1 retval dd 1 DUP(?) buff db 32 DUP(?) entry $ cmp dword [esp+8], DLL_PROCESS_ATTACH jnz lb ;invoke ShellExecute,NULL,NULL,'notepad.exe',NULL,NULL,SW_SHOW ;--------помещаем текст-------------------------- invoke MessageBox,HWND_DESKTOP," После нажатия ОК откроется шрифт по настройкам меню",invoke GetCommandLine,MB_OK ;invoke FindWindowExA,<invoke FindWindow,'notepad',0>,0,'edit',0 add [retval],eax mov [hw],eax invoke SendMessageA,[hw],WM_SETTEXT,0,msg invoke MessageBox,0,"stop","stop",MB_OK ;---------проверяем------------------------------- add [retval],eax ;| invoke wsprintfA,buff,"eax=%d",[retval] ;| invoke MessageBox,HWND_DESKTOP,buff,"Вывод ",0;| ;------------------------------------------------- ;--------первый вариант шрифта--------------------- invoke MessageBox,HWND_DESKTOP,"После нажатия ОК откроется изменённый шрифт(первый вариант)",invoke GetCommandLine,MB_OK invoke CreateFontIndirectA,lf1 ;---------проверяем------------------------------------------- mov [retval],eax ;| invoke wsprintfA,buff,"CreateFontIndirectA(lf1)=%d",[retval] ;| invoke MessageBox,HWND_DESKTOP,buff,"Вывод ",0 ;| ;------------------------------------------------------------- invoke SendMessageA,[hw],WM_SETFONT,eax,TRUE ;---------проверяем------------------------------------- mov [retval],eax ;| invoke wsprintfA,buff," SendMessageA(lf1)=%d",[retval] ;| invoke MessageBox,HWND_DESKTOP,buff,"Вывод ",0 ;| ;------------------------------------------------------- invoke DeleteObject,lf1 ;-------второй вариант шрифта----------------------------- invoke MessageBox,HWND_DESKTOP,"После нажатия ОК откроется изменённый шрифт(второй вариант)",invoke GetCommandLine,MB_OK invoke CreateFontIndirectA,lf2 ;---------проверяем------------------------------------------- mov [retval],eax ;| invoke wsprintfA,buff,"CreateFontIndirectA(lf2)=%d",[retval] ;| invoke MessageBox,HWND_DESKTOP,buff,"Вывод ",0 ;| ;------------------------------------------------------------- invoke SendMessageA,[hw],WM_SETFONT,eax,TRUE ;---------проверяем------------------------------------- mov [retval],eax ;| invoke wsprintfA,buff," SendMessageA(lf1)=%d",[retval] ;| invoke MessageBox,HWND_DESKTOP,buff,"Вывод ",0 ;| ;------------------------------------------------------- invoke DeleteObject,lf2 ;--------завершаем работу--------- lb: mov eax, 1 retn 0Ch section '.idata' import data readable library kernel,'KERNEL32.DLL',\ user,'USER32.DLL',\ shell,'SHELL32.DLL',\ gdi,'GDI32.DLL' import kernel,\ GetCommandLine,'GetCommandLineA',\ ExitProcess,'ExitProcess' import user,\ MessageBox,'MessageBoxA',\ FindWindowExA,'FindWindowExA',\ FindWindow,'FindWindowA',\ wsprintfA,'wsprintfA',\ SendMessageA,'SendMessageA' import shell,\ ShellExecute,'ShellExecuteA' import gdi,\ CreateFontIndirectA,'CreateFontIndirectA',\ DeleteObject,'DeleteObject' section '.edata' export data readable section '.reloc' fixups data discardable А программа, запускающая процесс и внедряющая в него код, выглядит так: Код (Text): format PE GUI 4.0 include 'win32ax.inc' .data ProcessName db 'C:\Windows\notepad.exe', 0 DllName db 'progDLL.DLL', 0 NameSize = $-DllName hFile rd 1 ;хендл файла mem rd 1 ;хранит адрес на свободную память size rd 1 ;размер DLL-ки p_info PROCESS_INFORMATION ;информация о процессе s_info STARTUPINFO ;тоже .code start: ;---заполняем s_info--------------------------------- mov [s_info.cb],sizeof.STARTUPINFO ;| mov [s_info.hStdError],0 ;| mov [s_info.hStdOutput],0 ;| mov [s_info.hStdInput],0 ;| mov [s_info.dwFlags],100h ; STARTF_USESTDHANDLES| ;---------------------------------------------------- ; процесс для инжекта invoke CreateProcess,"C:\Windows\notepad.exe",NULL,NULL,NULL,FALSE,NORMAL_PRIORITY_CLASS,NULL,NULL, s_info, p_info ;-------------алгоритм получения размера файла----------------- invoke CreateFile,DllName,GENERIC_READ,FILE_SHARE_READ,NULL,\ ;| OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL ;| mov [hFile],eax ;теперь у нас есть хендл файла ;| invoke GetFileSize,[hFile],NULL ;| mov [size],eax ;и размер ;| ;----------------------------------------------------------------- ;--------------------инжект процесса notepad------------------------------- invoke VirtualAllocEx,[p_info.hProcess],0,[size],MEM_COMMIT+MEM_RESERVE,PAGE_EXECUTE_READWRITE mov [mem], eax invoke WriteProcessMemory,[p_info.hProcess],[mem], DllName, NameSize, 0 invoke CreateRemoteThread, [p_info.hProcess], 0, 0, [LoadLibrary],[mem], 0, 0 invoke CloseHandle,[p_info.hProcess] @@: ret .end start Но вылетает системное сообщение с заголовком "Ошибочный образ", и в нём говорится, что моя DLL не предназначена для Windows или содержит ошибку. Я уверен что виновата DLL. Что же в ней может быть не так?
Разкомментил строку в DLL с поиском окна. Текст программа нормально вписала, создала первый шрифт. Но при отправке шрифта invoke SendMessageA,[hw],WM_SETFONT,eax,TRUE Блокнот просто перестаёт отвечать, даже не знаю в чём здесь могжет быть ошибка.
Заработал!! И первый шрифт и второй прописывает!! Я, по правде, думал что именно eax это не затрагивает, но сейчас на практике убедился в обратном.