Возникла необходимость перехватить функцию GetVersionEx и скормить ей другое значение, взял пример AdwareBox и для начала поправил файл так чтобы функция просто выдавала результат False и ничего не возвращала вот конечный код: Код (Text): library AdvBox32; uses Windows; type OldCode = packed record One: dword; two: word; end; far_jmp = packed record PuhsOp: byte; PushArg: pointer; RetOp: byte; end; var JmpMbw, JmpMba: far_jmp; OldMbw, OldMba: OldCode; MbwAdr, MbaAdr: pointer; type OSVERSIONINFO = packed record dwOSVersionInfoSize:DWORD; dwMajorVersion:DWORD; dwMinorVersion:DWORD; dwBuildNumber:DWORD; dwPlatformId:DWORD; szCSDVersion:string[128]; end; function GetVersionExA(osvi:OSVERSIONINFO):boolean ; stdcall; begin MessageBox(0,'Raskolbas','Zuzukino',0); //Это потом как дебаг всунул GetVersionExA:=False; end; function GetVersionExW(osvi:OSVERSIONINFO):boolean ; stdcall; begin MessageBox(0,'Raskolbas','Zuzukino',0); //Это потом как дебаг всунул GetVersionExW:=False; end; Procedure SetHook; var hUser32: dword; Bytes: dword; begin hUser32 := GetModuleHandle('kernel32.dll'); MbwAdr := GetProcAddress(hUser32, 'GetVersionExA'); MbaAdr := GetProcAddress(hUser32, 'GetVersionExW'); ReadProcessMemory(INVALID_HANDLE_VALUE, MbwAdr, @OldMbw, SizeOf(OldCode), Bytes); ReadProcessMemory(INVALID_HANDLE_VALUE, MbaAdr, @OldMba, SizeOf(OldCode), Bytes); JmpMbw.PuhsOp := $68; JmpMbw.PushArg := @GetVersionExW; JmpMbw.RetOp := $C3; JmpMba.PuhsOp := $68; JmpMba.PushArg := @GetVersionExA; JmpMba.RetOp := $C3; WriteProcessMemory(INVALID_HANDLE_VALUE, MbwAdr, @JmpMbw, SizeOf(far_jmp), Bytes); WriteProcessMemory(INVALID_HANDLE_VALUE, MbaAdr, @JmpMba, SizeOf(far_jmp), Bytes); end; Procedure Unhook; var Bytes: dword; begin WriteProcessMemory(INVALID_HANDLE_VALUE, MbaAdr, @OldMba, SizeOf(OldCode), Bytes); WriteProcessMemory(INVALID_HANDLE_VALUE, MbwAdr, @OldMbw, SizeOf(OldCode), Bytes); end; // çàëåïà Function MessageProc(code : integer; wParam : word; lParam : longint) : longint; stdcall; begin CallNextHookEx(0, Code, wParam, lparam); Result := 0; end; Procedure SetGlobalHookProc; begin SetWindowsHookEx(WH_GETMESSAGE, @MessageProc, HInstance, 0); Sleep(INFINITE); end; // Procedure SetGlobalHook; var hMutex: dword; TrId: dword; begin hMutex := CreateMutex(nil, false, 'AdvareHook'); if GetLastError = 0 then CreateThread(nil, 0, @SetGlobalHookProc, nil, 0, TrId) else CloseHandle(hMutex); end; procedure DLLEntryPoint(dwReason: DWord); begin case dwReason of DLL_PROCESS_ATTACH: begin SetGlobalHook(); SetHook() end; DLL_PROCESS_DETACH: UnHook(); end; end; begin DllProc := @DLLEntryPoint; DLLEntryPoint(DLL_PROCESS_ATTACH); end. Тестил при помащи вот такой проги на Си: Код (Text): #include <windows.h> #include <stdio.h> int main(int argc, char* argv[]) { OSVERSIONINFO osvi; ZeroMemory(&osvi, sizeof(OSVERSIONINFO)); osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx(&osvi); printf("dwMajorVersion - %u\r\n",osvi.dwMajorVersion); printf("dwMinorVersion - %u\r\n",osvi.dwMinorVersion); printf("dwBuildNumber - %u\r\n",osvi.dwBuildNumber); printf("dwPlatformId - %u\r\n",osvi.dwPlatformId); printf("szCSDVersion - %s\r\n",osvi.szCSDVersion); return 0; } Результат странный, если чтото и перехватывется то явно не то что надо потому как версия возвращается правильная, но в списке процессов имена всех юзерей забиты квадратами. Собственно где я накосячил, и нет ли более простово способа изменить данные этого GetVersionEx(патчинг системных файлов подходит) а то все внды перерыл немогу найти где она её хранит
VBKesha Некорректен вопрос. Инфа извлекается из PEB и SharedUserData. В PEB нет проблемы подменить значение, с разделяемой памятью - без доступа к ядерной памяти нельзя писать. Каковы привилегии ?