Си в delphi

Тема в разделе "WASM.BEGINNERS", создана пользователем xVlad, 9 мар 2008.

  1. xVlad

    xVlad New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2008
    Сообщения:
    4
    На сайте в статье есть сишный код. Я попробовал его перевести в delphi.
    http://wasm.ru/article.php?article=sasapi

    Код (Text):
    1. bool RemoveFWHook(char* szDllPath, char* szFuncName) // в szDllPath полный путь к DLL !
    2. {
    3.     // получаем указатель на функцию
    4.     HMODULE lpBase = LoadLibrary(szDllPath);
    5.     LPVOID lpFunc = GetProcAddress(lpBase, szFuncName);
    6.     if(!lpFunc)
    7.         return false;
    8.     // получаем RVA
    9.     DWORD dwRVA = (DWORD)lpFunc-(DWORD)lpBase;
    10.  
    11.     // проецируем файл в память
    12.     HANDLE hFile = CreateFile(szDllPath,GENERIC_READ, FILE_SHARE_READ,
    13.                         NULL, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL);
    14.     if(INVALID_HANDLE_VALUE == hFile)
    15.         return false;
    16.  
    17.     DWORD dwSize = GetFileSize(hFile, NULL);
    18.  
    19.     HANDLE hMapFile = CreateFileMapping(hFile, NULL, PAGE_READONLY|SEC_IMAGE, 0, dwSize, NULL);
    20.  
    21.     LPVOID lpBaseMap = MapViewOfFile(hMapFile, FILE_MAP_READ, 0, 0, dwSize);
    22.    
    23. // указатель на настоящую функцию
    24.     LPVOID lpRealFunc = (LPVOID)((DWORD)lpBaseMap+dwRVA);
    25.  
    26.     // изменяем права на доступ и копируем
    27.     DWORD dwOldProtect;
    28.     BOOL bRes=true;
    29.     if(VirtualProtect(lpFunc, 10, PAGE_EXECUTE_READWRITE, &dwOldProtect))
    30.     {
    31.         memcpy(lpFunc, lpRealFunc, 10);
    32.     }else{
    33.         bRes=false;
    34.     }
    35.  
    36.     UnmapViewOfFile(lpBaseMap);
    37.  
    38.     CloseHandle(hMapFile);
    39.     CloseHandle(hFile);
    40.  
    41.     return bRes;
    Мой вариант уже указанной библиотекой и функцией:
    Код (Text):
    1. procedure RemoveFWHook;
    2. type
    3.   TConnect = function (s: TSocket; var name: TSockAddr; namelen: Integer): Integer; stdcall;
    4. const
    5.   szDllPath = 'C:\WINNT\system32\wsock32.dll';
    6.   szFuncName = 'connect';
    7. var
    8.   lpBase, hFile, hMapFile: THandle;
    9.   lpFunc, lpRealFunc, lpBaseMap: Pointer;
    10.   dwRVA, dwSize, dwOldProtect: DWord;
    11.  
    12.   ConnectFunc: TConnect;
    13.   Socket: TSocket;
    14.   SockAddr: TSockAddr;
    15.   WsaData: TWsaData;  
    16. begin
    17.   lpBase := LoadLibrary(PAnsiChar(szDllPath));
    18.   lpFunc := GetProcAddress(lpBase, PAnsiChar(szFuncName));
    19.   if lpFunc = nil then
    20.   begin
    21.     ShowMessage('lpFunc = nil');
    22.     Exit;
    23.   end;
    24.   dwRVA := DWord(lpFunc) - DWord(lpBase);
    25.   hFile := CreateFile(PAnsiChar(szDllPath), GENERIC_READ, FILE_SHARE_READ,
    26.            nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
    27.  
    28.   if INVALID_HANDLE_VALUE = hFile then
    29.   begin
    30.     ShowMessage('INVALID_HANDLE_VALUE = hFile');
    31.     Exit;
    32.   end;
    33.  
    34.   dwSize := GetFileSize(hFile, nil);
    35.   hMapFile := CreateFileMapping(hFile, nil, PAGE_READONLY or SEC_IMAGE, 0, dwSize, nil);
    36.   lpBaseMap := MapViewOfFile(hMapFile, FILE_MAP_READ, 0, 0, dwSize);
    37.   lpRealFunc := Pointer(DWord(lpBaseMap) + dwRVA);
    38.  
    39. //  if VirtualProtect(lpFunc, 10, PAGE_EXECUTE_READWRITE, dwOldProtect) then
    40. //    Move(lpRealFunc, lpFunc, 10);
    41.  
    42.   UnmapViewOfFile(lpBaseMap);
    43.   CloseHandle(hMapFile);
    44.   CloseHandle(hFile);
    45.  
    46.   WSAStartup(1, WsaData);
    47.   @ConnectFunc := lpRealFunc;
    48.   ConnectFunc(Socket, SockAddr, 0);
    49. end;
    В итоге - в моем случае получаю при вызове lpRealFunc (->ConnectFunc) AV. Что тут не так?