rapidshell
پنج شنبه 29 فروردین 1387, 19:13 عصر
یکی از روش ها 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 کردن, سیستم خیلی راحت هنگ می کنه. کسی می دونه کجا را من اشتباه می کنم؟
با روش زیر من یک 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 کردن, سیستم خیلی راحت هنگ می کنه. کسی می دونه کجا را من اشتباه می کنم؟