您的位置:首页 >64位与Windows内核详解
发布于2025-09-02 阅读(0)
扫一扫,手机访问
继续深入学习《逆向工程核心原理》,本篇笔记聚焦于第五部分:64位 & Windows 内核6。
一、x64
1、x64处理器的变化


2、PE32+
PE32+是64位PE文件
(1)IMAGE_NT_HEADERS
主要是第三个成员不同——IMAGE_OPTIONAL_HEADER64和IMAGE_OPTIONAL_HEADER32

其中IMAGE_FILE_HEADER主要是Machine值变了,如下图所示:

而IMAGE_OPTIONAL_HEADER变化很大:
(2)IMAGE_THUNK_DATA
大小从4个字节变为8个字节

(3)IMAGE_TLS_DIRECTORY
部分成员是VA值,扩展为8个字节

3、WinDbg基本指令

二、内核6
kernel 6 是vista之后的系统,Win10 是kernel 10。
1、会话
会话:登录后的用户环境,kernel 6引入。
2、DLL注入
原先的用CreateRemoteThread()进行DLL注入的方法无法生效,原因是新增的API,如下:

对此,给出新的InjectDll.exe,代码语言为javascript,运行次数为0:
#include "windows.h"
#include "stdio.h"
#include "tchar.h"
BOOL SetPrivilege(LPCTSTR lpszPrivilege, BOOL bEnablePrivilege) {
TOKEN_PRIVILEGES tp;
HANDLE hToken;
LUID luid;
if( !OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,
&hToken) ) {
_tprintf(L"OpenProcessToken error: %u\n", GetLastError());
return FALSE;
}
if( !LookupPrivilegeValue(NULL, lpszPrivilege, &luid) ) {
_tprintf(L"LookupPrivilegeValue error: %u\n", GetLastError() );
return FALSE;
}
tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = luid;
if( bEnablePrivilege )
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
else
tp.Privileges[0].Attributes = 0;
if( !AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), (PTOKEN_PRIVILEGES) NULL, (PDWORD) NULL) ) {
_tprintf(L"AdjustTokenPrivileges error: %u\n", GetLastError() );
return FALSE;
}
if( GetLastError() == ERROR_NOT_ALL_ASSIGNED ) {
_tprintf(L"The token does not have the specified privilege. \n");
return FALSE;
}
return TRUE;
}
typedef DWORD (WINAPI *PFNTCREATETHREADEX)(
PHANDLE ThreadHandle,
ACCESS_MASK DesiredAccess,
LPVOID ObjectAttributes,
HANDLE ProcessHandle,
LPTHREAD_START_ROUTINE lpStartAddress,
LPVOID lpParameter,
BOOL CreateSuspended,
DWORD dwStackSize,
DWORD dw1,
DWORD dw2,
LPVOID Unknown );
BOOL IsVistaOrLater(){
OSVERSIONINFO osvi;
ZeroMemory(&osvi, sizeof(OSVERSIONINFO));
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx(&osvi);
if( osvi.dwMajorVersion >= 6 )
return TRUE;
return FALSE;
}
BOOL MyCreateRemoteThread(HANDLE hProcess, LPTHREAD_START_ROUTINE pThreadProc, LPVOID pRemoteBuf){
HANDLE hThread = NULL;
FARPROC pFunc = NULL;
if( IsVistaOrLater() ) {
pFunc = GetProcAddress(GetModuleHandle(L"ntdll.dll"), "NtCreateThreadEx");
if( pFunc == NULL ) {
printf("MyCreateRemoteThread() : GetProcAddress(\"NtCreateThreadEx\") failed!!! [%d]\n", GetLastError());
return FALSE;
}
((PFNTCREATETHREADEX)pFunc)(&hThread, 0x1FFFFF, NULL, hProcess, pThreadProc, pRemoteBuf, FALSE, NULL, NULL, NULL, NULL);
if( hThread == NULL ) {
printf("MyCreateRemoteThread() : NtCreateThreadEx() failed!!! [%d]\n", GetLastError());
return FALSE;
}
}
else {
hThread = CreateRemoteThread(hProcess, NULL, 0, pThreadProc, pRemoteBuf, 0, NULL);
if( hThread == NULL ) {
printf("MyCreateRemoteThread() : CreateRemoteThread() failed!!! [%d]\n", GetLastError());
return FALSE;
}
}
if( WAIT_FAILED == WaitForSingleObject(hThread, INFINITE) ) {
printf("MyCreateRemoteThread() : WaitForSingleObject() failed!!! [%d]\n", GetLastError());
return FALSE;
}
return TRUE;
}
BOOL InjectDll(DWORD dwPID, char *szDllName){
HANDLE hProcess = NULL;
LPVOID pRemoteBuf = NULL;
FARPROC pThreadProc = NULL;
DWORD dwBufSize = strlen(szDllName)+1;
if ( !(hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPID)) ) {
printf("[ERROR] OpenProcess(%d) failed!!! [%d]\n", dwPID, GetLastError());
return FALSE;
}
pRemoteBuf = VirtualAllocEx(hProcess, NULL, dwBufSize, MEM_COMMIT, PAGE_READWRITE);
WriteProcessMemory(hProcess, pRemoteBuf, (LPVOID)szDllName, dwBufSize, NULL);
pThreadProc = GetProcAddress(GetModuleHandle(L"kernel32.dll"), "LoadLibraryA");
if( !MyCreateRemoteThread(hProcess, (LPTHREAD_START_ROUTINE)pThreadProc, pRemoteBuf) ) {
printf("[ERROR] MyCreateRemoteThread() failed!!!\n");
return FALSE;
}
VirtualFreeEx(hProcess, pRemoteBuf, 0, MEM_RELEASE);
CloseHandle(hProcess);
return TRUE;
}
int main(int argc, char *argv[]){
SetPrivilege(SE_DEBUG_NAME, TRUE);
if( argc != 3 ) {
printf("usage : %s <pid><dll_path>\n", argv[0]);
return 1;
}
if( !InjectDll((DWORD)atoi(argv[1]), argv[2]) ) {
printf("InjectDll() failed!!!\n");
return 1;
}
printf("InjectDll() succeeded!!!\n");
return 0;
}结语
主要是因为本书编写时正值32位向64位过渡的时代,故有此章进行一些区别的介绍。
红客突击队由队长k龙于2019年发起,联合国内多所顶尖高校的研究生成立。成立以来,团队多次参与国际网络安全竞赛并取得优异成绩,积累了丰富的竞赛经验。目前,红客突击队拥有三十多名正式成员及若干预备人员,并下设数支联合分队。红客突击队始终秉持先做人后技术的宗旨,致力于打造国际顶尖的网络安全团队。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
4
5
6
7
8
9