当前位置:

首页 > 软件教程 > 64位与Windows内核详解

64位与Windows内核详解

继续深入学习《逆向工程核心原理》,本篇笔记聚焦于第五部分:64位&Windows内核6。一、x641、x64处理器的变化含有VA的指令大小增加了4个字节虚拟内存从4GB扩大到16GB通用寄存器的数量增加到18个,如下所示:函数调用统一为fastcall,可以传递4个参数,如下所示:栈操作不再使用PUSH/POP命令,而是通过MOV操作寄存器和指定的栈栈帧不再使用RBP,改用RSP2、PE32+PE32+是64位PE文件(1)IMAGE_NT_HEADERS主要是第三个成员不同——IMAGE_

本文目录

    继续深入学习《逆向工程核心原理》,本篇笔记聚焦于第五部分:64位 & Windows 内核6。

    一、x64

    1、x64处理器的变化

    • 含有VA的指令大小增加了4个字节
    • 虚拟内存从4GB扩大到16GB
    • 通用寄存器的数量增加到18个,如下所示:

    64位 & Windows 内核6

    • 函数调用统一为fastcall,可以传递4个参数,如下所示:

    64位 & Windows 内核6

    • 栈操作不再使用PUSH/POP命令,而是通过MOV操作寄存器和指定的栈
    • 栈帧不再使用RBP,改用RSP

    2、PE32+

    PE32+是64位PE文件

    (1)IMAGE_NT_HEADERS

    主要是第三个成员不同——IMAGE_OPTIONAL_HEADER64和IMAGE_OPTIONAL_HEADER32

    64位 & Windows 内核6

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

    64位 & Windows 内核6

    而IMAGE_OPTIONAL_HEADER变化很大:

    • Magic值从010B变为020B,作为识别32位还是64位的标志
    • BaseOfData删除了
    • ImageBase从DWORD变为ULONGLONG类型
    • 与栈和堆有关的字段也变为ULONGLONG类型

    (2)IMAGE_THUNK_DATA

    大小从4个字节变为8个字节

    64位 & Windows 内核6

    (3)IMAGE_TLS_DIRECTORY

    部分成员是VA值,扩展为8个字节

    64位 & Windows 内核6

    3、WinDbg基本指令

    64位 & Windows 内核6

    二、内核6

    kernel 6 是vista之后的系统,Win10 是kernel 10。

    1、会话

    会话:登录后的用户环境,kernel 6引入。

    • 系统会话是0,与用户会话隔离(即第一个登录的用户是会话1,而之前是会话0)
    • 但是会话1中的进程可以强行终止会话0中的进程

    2、DLL注入

    原先的用CreateRemoteThread()进行DLL注入的方法无法生效,原因是新增的API,如下:

    64位 & Windows 内核6

    对此,给出新的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 \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年发起,联合国内多所顶尖高校的研究生成立。成立以来,团队多次参与国际网络安全竞赛并取得优异成绩,积累了丰富的竞赛经验。目前,红客突击队拥有三十多名正式成员及若干预备人员,并下设数支联合分队。红客突击队始终秉持先做人后技术的宗旨,致力于打造国际顶尖的网络安全团队。

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    软件教程 kernel
    相关文章 更多
    Win11蓝屏显示KERNEL_MODE_HEAP_CORRUPTION解决方法
    Win11蓝屏显示KERNEL_MODE_HEAP_CORRUPTION解决方法

    遇到KERNEL_MODE_HEAP_CORRUPTION蓝屏问题,得按部就班地排查。首先,要关闭内存完整性,同时卸载360、火绒等第三方安全软件;接着,启用verifier抓取包含verifier的dump文件,以此来定位违规驱动;还要精简USB驱动链,并更新主板芯片组驱动;最后,运行sfc/di

    Win11蓝屏显示INVALID_KERNEL_HANDLE解决方法
    Win11蓝屏显示INVALID_KERNEL_HANDLE解决方法

    遇到INVALID_KERNEL_HANDLE蓝屏问题,需按以下步骤操作:首先,进入安全模式,卸载包含“Virtual”“Guard”等字样的可疑驱动,并禁用非系统启动项;其次,运行mdsched.exe以及MemTest86来检测内存;最后,使用PowerShell清理残留的驱动服务及注册表项。W

    KERNELPANIC常见问题及解决方案分享
    KERNELPANIC常见问题及解决方案分享

    KERNELPANIC是操作系统内核遇到致命错误时的紧急停止机制,常见于Linux、安卓和macOS。诱因包括硬件故障、驱动不兼容或内存问题等。发生时应记录错误信息并检查系统日志。排查可从硬件连接、系统恢复、内存硬盘测试入手。保持更新、定期备份及谨慎操作内核有助于降低风险,多数问题可通过系统方法解决。

    解决RHEL/CentOS/Oracle Linux 7/8 安装Openonload驱动的问题
    解决RHEL/CentOS/Oracle Linux 7/8 安装Openonload驱动的问题

    场景:Solarfare网卡安装onload-8.1.1.17驱动是报错(见红色部分),导致驱动安装失败解决方法:#kernel问题——需要通过yum安装:yuminstall-ykernel-devel后再进行驱动安装[root@localhostscripts]#./onload_installonload_install:BuildingOnload.mmakebuildtree:Nokernelbuildat‘/lib/modules/4.18.0-372.9.1.el8.x86_64

    解决kernel_security_check_failure蓝屏的17种方法
    解决kernel_security_check_failure蓝屏的17种方法

    Kernelsecuritycheckfailure(内核检查失败)就是一个比较常见的停止代码类型,可蓝屏错误出现不管是什么原因都让很多的有用户们十分的苦恼,下面就让本站来为用户们来仔细的介绍一下17种解决方法吧。kernel_security_check_failure蓝屏的17种解决方法方法1:移除全部外部设备当您使用的任何外部设备与您的Windows版本不兼容时,则可能会发生Kernelsecuritycheckfailure蓝屏错误。为此,您需要在尝试重新启动计算机之前拔下全部外部设备。步骤1、完

    解析kernel panic的原因并提供解决方案
    解析kernel panic的原因并提供解决方案

    深入探究KernelPanic并提供解决方案导言作为操作系统的核心组件,内核(Kernel)在计算机系统中起着至关重要的作用。然而,有时候在系统运行过程中会发生一种被称为KernelPanic的错误,导致系统无法正常运行。本文将深入探究KernelPanic的原因,并提供一些常见的解决方案,其中包括具体的代码示例。什么是KernelPanic?Ker

    endnote怎么调成中文 界面语言设置步骤
    endnote怎么调成中文 界面语言设置步骤

    想把 EndNote 菜单改成中文?需使用 2025.3 或更新版本。本文详解如何在 Windows 11 中检查更新、设置系统显示语言为简体中文,并通过重新登录使 EndNote 界面完全汉化。

    endnote怎么导入参考文献格式
    endnote怎么导入参考文献格式

    详解 Windows 端 EndNote 2025 如何导入期刊要求的参考文献格式。涵盖下载 .ens 文件、另存副本、勾选常用样式及在 Word 中切换输出样式的操作步骤,帮助作者快速适配投稿规范。

    typora怎么高亮 文本标记语法设置
    typora怎么高亮 文本标记语法设置

    本教程演示如何在 Windows 版 Typora 中开启 Highlight 高亮功能,通过双等号语法标记重点文本,并展示如何编辑、取消高亮及验证源码保存状态。

    讯飞智作平台 在线创作功能介绍
    讯飞智作平台 在线创作功能介绍

    了解讯飞智作平台的在线创作流程:从文字配音到数字人视频生成,再到AIGC工具箱的素材处理。通过具体案例演示如何选择合适的功能入口、调整参数及核对成品权益,适合需要快速制作音频或播报视频的用户参考。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。