Неполучается поправить AdwareBox из статьи по API Hook.

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

  1. VBKesha

    VBKesha New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2004
    Сообщения:
    39
    Возникла необходимость перехватить функцию GetVersionEx и скормить ей другое значение, взял пример AdwareBox и для начала поправил файл так чтобы функция просто выдавала результат False и ничего не возвращала вот конечный код:
    Код (Text):
    1. library AdvBox32;
    2.  
    3. uses Windows;
    4.  
    5. type
    6.  OldCode = packed record
    7.   One: dword;
    8.   two: word;
    9.  end;
    10.  
    11.  
    12. far_jmp = packed record
    13.   PuhsOp: byte;
    14.   PushArg: pointer;
    15.   RetOp: byte;
    16.  end;
    17.  
    18. var
    19.  JmpMbw, JmpMba: far_jmp;
    20.  OldMbw, OldMba: OldCode;
    21.  MbwAdr, MbaAdr: pointer;
    22.  
    23. type
    24. OSVERSIONINFO = packed record
    25.     dwOSVersionInfoSize:DWORD;
    26.     dwMajorVersion:DWORD;
    27.     dwMinorVersion:DWORD;
    28.     dwBuildNumber:DWORD;
    29.     dwPlatformId:DWORD;
    30.     szCSDVersion:string[128];
    31. end;
    32.  
    33.  
    34.  
    35.  
    36. function GetVersionExA(osvi:OSVERSIONINFO):boolean ; stdcall;
    37. begin
    38. MessageBox(0,'Raskolbas','Zuzukino',0); //Это потом как дебаг всунул
    39. GetVersionExA:=False;
    40. end;
    41.  
    42. function GetVersionExW(osvi:OSVERSIONINFO):boolean ; stdcall;
    43. begin
    44. MessageBox(0,'Raskolbas','Zuzukino',0); //Это потом как дебаг всунул
    45. GetVersionExW:=False;
    46. end;
    47.  
    48. Procedure SetHook;
    49. var
    50.  hUser32: dword;
    51.  Bytes: dword;
    52. begin
    53.   hUser32 := GetModuleHandle('kernel32.dll');
    54.   MbwAdr  := GetProcAddress(hUser32, 'GetVersionExA');
    55.   MbaAdr  := GetProcAddress(hUser32, 'GetVersionExW');
    56.   ReadProcessMemory(INVALID_HANDLE_VALUE, MbwAdr, @OldMbw, SizeOf(OldCode), Bytes);
    57.   ReadProcessMemory(INVALID_HANDLE_VALUE, MbaAdr, @OldMba, SizeOf(OldCode), Bytes);
    58.   JmpMbw.PuhsOp  := $68;
    59.   JmpMbw.PushArg := @GetVersionExW;
    60.   JmpMbw.RetOp   := $C3;
    61.   JmpMba.PuhsOp  := $68;
    62.   JmpMba.PushArg := @GetVersionExA;
    63.   JmpMba.RetOp   := $C3;
    64.   WriteProcessMemory(INVALID_HANDLE_VALUE, MbwAdr, @JmpMbw, SizeOf(far_jmp), Bytes);
    65.   WriteProcessMemory(INVALID_HANDLE_VALUE, MbaAdr, @JmpMba, SizeOf(far_jmp), Bytes);
    66. end;
    67.  
    68. Procedure Unhook;
    69. var
    70.  Bytes: dword;
    71. begin
    72.   WriteProcessMemory(INVALID_HANDLE_VALUE, MbaAdr, @OldMba, SizeOf(OldCode), Bytes);
    73.   WriteProcessMemory(INVALID_HANDLE_VALUE, MbwAdr, @OldMbw, SizeOf(OldCode), Bytes);
    74. end;
    75.  
    76. // çàëåïà
    77. Function MessageProc(code : integer; wParam : word;
    78.                     lParam : longint) : longint; stdcall;
    79. begin
    80.  CallNextHookEx(0, Code, wParam, lparam);
    81.  Result := 0;
    82. end;
    83.  
    84. Procedure SetGlobalHookProc;
    85. begin
    86.  SetWindowsHookEx(WH_GETMESSAGE, @MessageProc, HInstance, 0);
    87.  Sleep(INFINITE);
    88. end;
    89. //
    90.  
    91. Procedure SetGlobalHook;
    92. var
    93.  hMutex: dword;
    94.  TrId: dword;
    95. begin
    96.  hMutex := CreateMutex(nil, false, 'AdvareHook');
    97.  if GetLastError = 0 then
    98.  CreateThread(nil, 0, @SetGlobalHookProc, nil, 0, TrId) else
    99.  CloseHandle(hMutex);
    100. end;
    101.  
    102. procedure DLLEntryPoint(dwReason: DWord);
    103. begin
    104.   case dwReason of
    105.     DLL_PROCESS_ATTACH: begin
    106.                           SetGlobalHook();
    107.                           SetHook()
    108.                         end;
    109.     DLL_PROCESS_DETACH: UnHook();
    110.   end;
    111. end;
    112.  
    113.  
    114. begin
    115.  DllProc := @DLLEntryPoint;
    116.  DLLEntryPoint(DLL_PROCESS_ATTACH);
    117. end.
    Тестил при помащи вот такой проги на Си:
    Код (Text):
    1. #include <windows.h>
    2. #include <stdio.h>
    3.  
    4. int main(int argc, char* argv[])
    5. {
    6.     OSVERSIONINFO osvi;
    7.  
    8.     ZeroMemory(&osvi, sizeof(OSVERSIONINFO));
    9.     osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
    10.  
    11.     GetVersionEx(&osvi);
    12.  
    13.     printf("dwMajorVersion - %u\r\n",osvi.dwMajorVersion);
    14.     printf("dwMinorVersion - %u\r\n",osvi.dwMinorVersion);
    15.     printf("dwBuildNumber  - %u\r\n",osvi.dwBuildNumber);
    16.     printf("dwPlatformId   - %u\r\n",osvi.dwPlatformId);
    17.     printf("szCSDVersion   - %s\r\n",osvi.szCSDVersion);
    18.  
    19.     return 0;
    20. }
    Результат странный, если чтото и перехватывется то явно не то что надо потому как версия возвращается правильная, но в списке процессов имена всех юзерей забиты квадратами. Собственно где я накосячил, и нет ли более простово способа изменить данные этого GetVersionEx(патчинг системных файлов подходит) а то все внды перерыл немогу найти где она её хранит :dntknw:
     
  2. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    VBKesha
    Некорректен вопрос. Инфа извлекается из PEB и SharedUserData. В PEB нет проблемы подменить значение, с разделяемой памятью - без доступа к ядерной памяти нельзя писать. Каковы привилегии ?
     
  3. VBKesha

    VBKesha New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2004
    Сообщения:
    39
    Привелегии.....прога просто запускается от админа.