یکی از روش ها attach شدن به همه ی window ها hook کردن هست. که یک dll را به process برنامه هایی که window ساخته اند می چسبونه. برای این کار از تابع SetWindowsHookEx ویندوز می شه استفاده کرد. و حالا مشکل من
با روش زیر من یک exe که یک سری function را export می کنه را به dll تبدیل می کنم:
HRESULT MakeHookModule()
{
TCHAR szFilePath[MAX_PATH];
GetModuleFileName( NULL, szFilePath, MAX_PATH );
DWORD dwBinType;
GetBinaryType( szFilePath, &dwBinType );
if( dwBinType != SCS_32BIT_BINARY )
return E_FAIL;
wcscpy( szModulePath, szFilePath );
TCHAR* pos = wcsstr( szModulePath, TEXT(".exe") );
wsprintf( pos, TEXT(".dll") );
CopyFile( szFilePath, szModulePath, FALSE );
HANDLE hFile;
hFile = CreateFile(szModulePath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if( hFile == INVALID_HANDLE_VALUE )
return E_FAIL;
HANDLE hFileMapping;
hFileMapping = CreateFileMapping( hFile, NULL, PAGE_READWRITE, 0, 0, TEXT("HModule") );
if( hFileMapping == NULL )
{
CloseHandle( hFile );
return E_FAIL;
}
LPVOID hFileData;
hFileData = MapViewOfFileEx( hFileMapping, FILE_MAP_WRITE, 0, 0, 0, NULL );
if( hFileData == NULL )
{
CloseHandle( hFileMapping );
CloseHandle( hFile );
return E_FAIL;
}
PIMAGE_NT_HEADERS pNTHeader;
pNTHeader = ImageNtHeader( hFileData );
pNTHeader->FileHeader.Characteristics |= IMAGE_FILE_DLL;
pNTHeader->FileHeader.Characteristics ^= IMAGE_FILE_RELOCS_STRIPPED;
pNTHeader->OptionalHeader.AddressOfEntryPoint = (DWORD)__DllMain;
pNTHeader->OptionalHeader.AddressOfEntryPoint -= pNTHeader->OptionalHeader.ImageBase;
pNTHeader->OptionalHeader.ImageBase = 0x7CFE0000;
pNTHeader->OptionalHeader.DllCharacteristics = 0x140;
UnmapViewOfFile( hFileData );
CloseHandle( hFileMapping );
CloseHandle( hFile );
return S_OK;
}
این کد به من یک dll نسبتا خوب می ده که راحت LoadLibrary میشه و می شه از function هاش استفاده کرد. ولی در مورد Hook کردن, سیستم خیلی راحت هنگ می کنه. کسی می دونه کجا را من اشتباه می کنم؟