利用CheatEngine驱动实现内核空间任意读写
frok https://github.com/ioncodes/ceload
https://github.com/xjohjrdy/ceload
原理
ceload.exe调用CreateProcessW创建进程,将dwCreationFlags设置为CREATE_SUSPENDED状态,然后读写创建的进程空间,在原始OEP处注入shellcode.
shellcode的作用是加载loader.dll。
loader.dll中的主要步骤就是加载驱动(服务),然后将注入shellcode的位置进行恢复,以实现驱动中对调用者身份的检查。
驱动中身份检查、签名检查等部分基本没有变化,所以可以很容易适配CE7.6。
任意地址读写
CE驱动中有太多功能,可以用IOCTL_CE_READMEMORY、IOCTL_CE_WRITEMEMORY读写内存,但如果内存属性为只读,IOCTL_CE_WRITEMEMORY仍然无法写入,需要修改内存属性,但似乎没有修改内存属性的函数。
IOCTL_CE_READPHYSICALMEMORY、IOCTL_CE_WRITEPHYSICALMEMORY、IOCTL_CE_GETPHYSICALADDRESS这几个IoControlCode可以实现将内存地址转换成物理内存地址,并进行读写,可以忽略内存属性。
踩坑




部分API
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| BOOL CreateProcessW( LPCWSTR lpApplicationName, LPWSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes, LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles, DWORD dwCreationFlags, LPVOID lpEnvironment, LPCWSTR lpCurrentDirectory, LPSTARTUPINFOW lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation );
BOOL ReadProcessMemory( HANDLE hProcess, LPCVOID lpBaseAddress, LPVOID lpBuffer, SIZE_T nSize, SIZE_T *lpNumberOfBytesRead );
BOOL WriteProcessMemory( HANDLE hProcess, LPVOID lpBaseAddress, LPCVOID lpBuffer, SIZE_T nSize, SIZE_T *lpNumberOfBytesWritten );
BOOL DeviceIoControl( HANDLE hDevice, DWORD dwIoControlCode, LPVOID lpInBuffer, DWORD nInBufferSize, LPVOID lpOutBuffer, DWORD nOutBufferSize, LPDWORD lpBytesReturned, LPOVERLAPPED lpOverlapped );
|