手工获取kernel基地址

本文详细介绍了Windows操作系统中PEB(进程环境块)的结构及其相关内容。PEB用于存储进程的全局信息,包括进程参数、加载的数据等。文章还通过汇编指令展示了如何获取KERNEL32.DLL的基地址。

首先回顾一下几个结构:

typedef struct _RTL_USER_PROCESS_PARAMETERS
{
ULONG MaximumLength; // 00h
ULONG Length; // 04h
ULONG Flags; // 08h
ULONG DebugFlags; // 0Ch
PVOID ConsoleHandle; // 10h
ULONG ConsoleFlags; // 14h
HANDLE InputHandle; // 18h
HANDLE OutputHandle; // 1Ch
HANDLE ErrorHandle; // 20h
CURDIR CurrentDirectory; // 24h
UNICODE_STRING DllPath; // 30h
UNICODE_STRING ImagePathName; // 38h
UNICODE_STRING CommandLine; // 40h
PWSTR Environment; // 48h
ULONG StartingX; // 4Ch
ULONG StartingY; // 50h
ULONG CountX; // 54h
ULONG CountY; // 58h
ULONG CountCharsX; // 5Ch
ULONG CountCharsY; // 60h
ULONG FillAttribute; // 64h
ULONG WindowFlags; // 68h
ULONG ShowWindowFlags; // 6Ch
UNICODE_STRING WindowTitle; // 70h
UNICODE_STRING DesktopInfo; // 78h
UNICODE_STRING ShellInfo; // 80h
UNICODE_STRING RuntimeInfo; // 88h
RTL_DRIVE_LETTER_CURDIR DLCurrentDirectory[0x20]; // 90h
} RTL_USER_PROCESS_PARAMETERS, *PRTL_USER_PROCESS_PARAMETERS;

#define PEB_BASE (0x7FFDF000)

typedef struct _PEB_LDR_DATA
{
ULONG Length;
BOOLEAN Initialized;
PVOID SsHandle;
LIST_ENTRY InLoadOrderModuleList;
LIST_ENTRY InMemoryOrderModuleList;
LIST_ENTRY InInitializationOrderModuleList;
} PEB_LDR_DATA, *PPEB_LDR_DATA;

typedef VOID STDCALL (*PPEBLOCKROUTINE)(PVOID);

typedef struct _PEB
{
UCHAR InheritedAddressSpace; // 00h
UCHAR ReadImageFileExecOptions; // 01h
UCHAR BeingDebugged; // 02h
UCHAR Spare; // 03h
PVOID Mutant; // 04h
PVOID ImageBaseAddress; // 08h
PPEB_LDR_DATA Ldr; // 0Ch
PRTL_USER_PROCESS_PARAMETERS ProcessParameters; // 10h
PVOID SubSystemData; // 14h
PVOID ProcessHeap; // 18h
PVOID FastPebLock; // 1Ch
PPEBLOCKROUTINE FastPebLockRoutine; // 20h
PPEBLOCKROUTINE FastPebUnlockRoutine; // 24h
ULONG EnvironmentUpdateCount; // 28h
PVOID* KernelCallbackTable; // 2Ch
PVOID EventLogSection; // 30h
PVOID EventLog; // 34h
PPEB_FREE_BLOCK FreeList; // 38h
ULONG TlsExpansionCounter; // 3Ch
PVOID TlsBitmap; // 40h
ULONG TlsBitmapBits[0x2]; // 44h
PVOID ReadOnlySharedMemoryBase; // 4Ch
PVOID ReadOnlySharedMemoryHeap; // 50h
PVOID* ReadOnlyStaticServerData; // 54h
PVOID AnsiCodePageData; // 58h
PVOID OemCodePageData; // 5Ch
PVOID UnicodeCaseTableData; // 60h
ULONG NumberOfProcessors; // 64h
ULONG NtGlobalFlag; // 68h
UCHAR Spare2[0x4]; // 6Ch
LARGE_INTEGER CriticalSectionTimeout; // 70h
ULONG HeapSegmentReserve; // 78h
ULONG HeapSegmentCommit; // 7Ch
ULONG HeapDeCommitTotalFreeThreshold; // 80h
ULONG HeapDeCommitFreeBlockThreshold; // 84h
ULONG NumberOfHeaps; // 88h
ULONG MaximumNumberOfHeaps; // 8Ch
PVOID** ProcessHeaps; // 90h
PVOID GdiSharedHandleTable; // 94h
PVOID ProcessStarterHelper; // 98h
PVOID GdiDCAttributeList; // 9Ch
PVOID LoaderLock; // A0h
ULONG OSMajorVersion; // A4h
ULONG OSMinorVersion; // A8h
ULONG OSBuildNumber; // ACh
ULONG OSPlatformId; // B0h
ULONG ImageSubSystem; // B4h
ULONG ImageSubSystemMajorVersion; // B8h
ULONG ImageSubSystemMinorVersion; // C0h
ULONG GdiHandleBuffer[0x22]; // C4h

PVOID ProcessWindowStation; // ???
} PEB, *PPEB;

 __asm
 {
  mov eax,fs:30h//指向PEB
  mov eax,[eax+0x0c]//指向PEB 的 _PEB_LDR_DATA结构
  mov esi,[eax+0x1c]
  lodsd//是以si位首地址,每次拷贝4个字节,把这4个字节放到eax中,然后si自动+4.
   //得到KERNEL32.DLL所在LDR_MODULE结构的InInitializationOrderModuleList地址
  mov eax,[eax+0x08]//得到BaseAddress,既Kernel32.dll基址
  mov base,eax
 }

虽然没有直接的引用提供获取游戏基地址的代码示例,但可以参考一些通用的编程思路。在Windows系统下,通常会使用Windows API函数来实现获取进程和模块基地址的操作,以下是一个使用Python和`psutil`、`ctypes`库的示例代码: ```python import psutil import ctypes from ctypes import wintypes # 定义Windows API函数 kernel32 = ctypes.WinDLL('kernel32', use_last_error=True) OpenProcess = kernel32.OpenProcess OpenProcess.argtypes = [wintypes.DWORD, wintypes.BOOL, wintypes.DWORD] OpenProcess.restype = wintypes.HANDLE CloseHandle = kernel32.CloseHandle CloseHandle.argtypes = [wintypes.HANDLE] CloseHandle.restype = wintypes.BOOL EnumProcessModulesEx = kernel32.EnumProcessModulesEx EnumProcessModulesEx.argtypes = [wintypes.HANDLE, wintypes.LPVOID, wintypes.DWORD, wintypes.LPDWORD, wintypes.DWORD] EnumProcessModulesEx.restype = wintypes.BOOL GetModuleFileNameExW = kernel32.GetModuleFileNameExW GetModuleFileNameExW.argtypes = [wintypes.HANDLE, wintypes.HMODULE, wintypes.LPWSTR, wintypes.DWORD] GetModuleFileNameExW.restype = wintypes.DWORD PROCESS_QUERY_INFORMATION = 0x0400 PROCESS_VM_READ = 0x0010 LIST_MODULES_ALL = 0x00000003 def get_process_base_address(process_name): for proc in psutil.process_iter(['name']): if proc.info['name'] == process_name: process_id = proc.pid process_handle = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, False, process_id) if process_handle: module_array = (wintypes.HMODULE * 1024)() bytes_needed = wintypes.DWORD() if EnumProcessModulesEx(process_handle, ctypes.byref(module_array), ctypes.sizeof(module_array), ctypes.byref(bytes_needed), LIST_MODULES_ALL): module_count = bytes_needed.value // ctypes.sizeof(wintypes.HMODULE) if module_count > 0: base_address = module_array[0] module_name = ctypes.create_unicode_buffer(260) if GetModuleFileNameExW(process_handle, base_address, module_name, ctypes.sizeof(module_name)): print(f"Process: {process_name}, Base Address: {hex(base_address)}") CloseHandle(process_handle) return base_address CloseHandle(process_handle) return None # 使用示例 game_process_name = "your_game.exe" base_address = get_process_base_address(game_process_name) if base_address: print(f"Game base address: {hex(base_address)}") else: print("Game process not found.") ``` ### 代码解释 1. **导入必要的库**:使用`psutil`库来遍历系统中的进程,使用`ctypes`库来调用Windows API函数。 2. **定义Windows API函数**:定义了`OpenProcess`、`CloseHandle`、`EnumProcessModulesEx`和`GetModuleFileNameExW`等函数。 3. **遍历进程**:使用`psutil.process_iter`遍历系统中的所有进程,找到指定名称的进程。 4. **打开进程**:使用`OpenProcess`函数打开进程,获取进程句柄。 5. **枚举模块**:使用`EnumProcessModulesEx`函数枚举进程中的模块,获取模块句柄数组。 6. **获取基地址**:获取模块句柄数组中的第一个元素,即为进程的基地址。 7. **关闭句柄**:使用`CloseHandle`函数关闭进程句柄。 ### 注意事项 - 请将`your_game.exe`替换为实际的游戏进程名称。 - 运行该代码需要管理员权限。 - 该代码仅适用于Windows系统。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值