Windows内核学习笔记(三)

前言

本篇并非内核学习,但有点相关,是本人看了内核区域后的遐想。
AI是一个思考的好工具,但是具体的验证还得亲为。
这样的问题我曾经也思考过,但是由于编写代码过于麻烦,而现在也该给自己一个答案了。

**图片太长,点击展开**
![image](https://img2024.cnblogs.com/blog/3336551/202502/3336551-20250225172907861-126349978.png)

尝试编码

image
image

项目结构:

  • TestDll:被修改的Dll
  • TestRunner: 运行者,旁观者
  • DllMemoryInjectTest:修改者,管理员权限

由于已知内核代码是不能修改的,但是同一个dll在代码中的情况,windows会选择隔离进程吗?
image
此处省略处理代码异常过程……
最后会给出代码

结果

image
不同程序加载相同dll,其中一个程序修改它自身内存中dll后,另一个程序不会同步修改。
当我发现修改保护不需要管理员权限时,其实就已经不抱有太大希望了
但为了完成整个程序,还是写到了最后。
dll难道都类似于include一样,每一个exe都复制自己的dll吗
image
哎,有个问题。
系统dll也适用这个条件吗?
这里的基地址完全一样。
image
注意到,用户模块的基地址也完全一样
感觉不抱希望。
不如直接用xdbg修改试试,没必要写软件了。
image
随便改了一个字节,没有同步。

思考

windows应该不会像Chromium一样,因此抱着怀疑的态度询问了AI

这篇文章中的说法是不完全准确的。在Windows系统中,DLL(动态链接库)的加载和共享机制并不是通过简单地“复制一份”来实现的,而是通过复杂的内存映射和共享机制来完成的。

关于DLL的共享机制

在Windows中,DLL文件(如kernel32.dll、ntdll.dll等)是被设计为可以被多个进程共享的。当第一个进程加载某个DLL时,系统会将DLL的代码部分加载到内存中,并为该DLL创建一个共享的内存映射。

当其他进程加载相同的DLL时,系统不会重新加载DLL的代码部分,而是直接映射到已经加载的内存区域。这意味着多个进程可以共享同一个DLL的代码部分,从而节省内存。

DLL的代码与数据分离:

DLL的代码部分(即只读的指令代码)是可以被多个进程共享的,因为代码是只读的,不会被修改。
而DLL的全局数据部分(如变量等)是每个进程独立的,系统会为每个进程创建独立的数据副本,以避免进程之间的数据冲突。

基地址相同的原因:

文章中提到“用户模块的基地址完全一样”,这是因为Windows的内存管理机制会尽量将DLL加载到相同的基地址(如果可能的话)。这是为了提高性能和兼容性,但并不意味着DLL被“复制”了。

如果由于某些原因(如地址空间冲突),DLL无法加载到预期的基地址,系统会进行重定位,但代码部分仍然可以共享。

关于文章中的实验结果

文章中提到“不同程序加载相同DLL,其中一个程序修改它自身内存中的DLL后,另一个程序不会同步修改”。这个结果是正确的,因为DLL的代码部分是只读的,一旦被修改,实际上是在修改进程的私有内存映射,而不是原始的DLL代码。其他进程仍然会看到原始的DLL代码。

代码

DllMemoryInjectTest.cpp
// Program1.cpp
#include <windows.h>
#include <stdio.h>
#include <cstring> // 用于 std::memcmp 和 std::memcpy

// 搜索函数
int searchInBuffer(const char* buf, size_t buf_size, const char* target, size_t target_size) {
    if (buf == nullptr || target == nullptr || buf_size < target_size) {
        return -1; // 参数无效或目标序列比缓冲区大
    }

    for (size_t i = 0; i <= buf_size - target_size; ++i) {
        // 使用 std::memcmp 比较目标序列
        if (std::memcmp(buf + i, target, target_size) == 0) {
            return static_cast<int>(i); // 找到匹配,返回位置
        }
    }

    return -1; // 未找到
}

int main() {
    // 加载DLL
    HMODULE hDll = LoadLibrary(L"TestDll.dll");
    if (!hDll) {
        printf("Failed to load DLL\n");
        return 1;
    }

    // 获取函数地址
    FARPROC originalFunction = GetProcAddress(hDll, "MyFunction");
    if (!originalFunction) {
        printf("Failed to get function address\n");
        FreeLibrary(hDll);
        return 1;
    }
    // 获取实际函数代码地址
    // 跳板指令格式:E9 <相对偏移量> (相对跳转)
    unsigned char* thunk = (unsigned char*)originalFunction;
    unsigned int relativeOffset = *(unsigned int*)(thunk + 1); // 获取相对偏移量
    void* actualFunction = (void*)((unsigned char*)originalFunction + relativeOffset + 5); // 计算实际函数地址

    // 调用修改后的函数
    typedef void (*Func)();
    Func function = (Func)originalFunction;
    function();

    // 尝试修改代码段的保护属性
    DWORD oldProtect;
    if (!VirtualProtect(actualFunction, 1024, PAGE_EXECUTE_READWRITE, &oldProtect)) {
        printf("Failed to change protection\n");
        FreeLibrary(hDll);
        return 1;
    }

    // 尝试修改代码
    // 新函数的机器代码(x86/x64汇编实现)
// 注意:以下代码为x86架构的实现,如果需要x64架构,需要调整机器代码
    unsigned char rawCode[] = {
        0x40, 0x55,                       // push rbp
        0x57,                             // push rdi
        0x48, 0x81, 0xEC, 0xE8, 0x00, 0x00, 0x00, // sub rsp, 0xE8
        0x48, 0x8D, 0x6C, 0x24, 0x20,     // lea rbp, [rsp+20h]
        0x48, 0x8D, 0x0D, 0x00, 0x00, 0x00, 0x00, // lea rcx, [rel fmt] (需要修正为字符串地址)
        0xE8, 0x00, 0x00, 0x00, 0x00,     // call printf (需要修正为printf地址)
        0x48, 0x8D, 0xA5, 0xC8, 0x00, 0x00, 0x00, // lea rsp, [rbp+0C8h]
        0x5F,                             // pop rdi
        0x5D,                             // pop rbp
        0xC3,                             // ret
        'M', 'o', 'd', 'i', 'f', 'i', 'e', 'd', ' ', 'F', 'u', 'n', 'c', 't', 'i', 'o', 'n', 0x00 // "Modified Function\0"
    };
    unsigned char newCodeData[] = {
        'M', 'o', 'd', 'i', 'f', 'i', 'e', 'd', ' ', 'F', 'u', 'n', 'c', 't', 'i', 'o', 'n','\n', 0x00 // "Modified Function\0"
    };
    char search2[] = { 0x5D,0xC3 };
    int index2 = searchInBuffer((char*)actualFunction, 60, search2, sizeof(search2));
    if (index2 == -1) {
        printf("err2");
        return -1;
    }
    index2 += sizeof(search2);

    char search1[] = { 0x48,0x8D,0x0D };
    int index1 = searchInBuffer((char*)actualFunction, 60, search1, sizeof(search1));
    if (index1 == -1) {
        printf("err1");
        return -1;
    }
    index1 += sizeof(search1);
    int index1_ = searchInBuffer((char*)actualFunction + index1, 60, search1, sizeof(search1));
    if (index1_ != -1) {
        index1 = index1 + index1_ + sizeof(search1);
    }

    // 修正字符串地址
    char* strLo = (char*)actualFunction + index2;
    char* ripLo = (char*)actualFunction + index1 + 4;
    int releative = strLo - ripLo;

    *(int*)((char*)actualFunction + index1) = releative;
    memcpy(strLo, newCodeData, sizeof(newCodeData));

    // 恢复保护属性
    VirtualProtect(actualFunction, 1024, oldProtect, &oldProtect);

    printf("Attempted to modify DLL code\n");

    function();

    // 保持DLL加载状态,等待用户输入
    printf("Press Enter to exit...\n");
    getchar();

    FreeLibrary(hDll);
    return 0;
}
TestRunner.cpp
// Program2.cpp
#include <windows.h>
#include <stdio.h>

int main() {
    // 加载DLL
    HMODULE hDll = LoadLibrary(L"TestDll.dll");
    if (!hDll) {
        printf("Failed to load DLL\n");
        return 1;
    }

    // 获取函数地址并调用
    typedef void (*Func)();
    Func myFunction = (Func)GetProcAddress(hDll, "MyFunction");
    if (!myFunction) {
        printf("Failed to get function address\n");
        FreeLibrary(hDll);
        return 1;
    }

    // 第一次调用:验证原始状态
    printf("Calling MyFunction (Original State):\n");
    myFunction();

    // 等待用户输入,以便程序1修改DLL代码
    printf("Press Enter to continue...\n");
    getchar();

    // 第二次调用:验证修改后的状态
    printf("Calling MyFunction (Modified State):\n");
    myFunction();

    FreeLibrary(hDll);

    printf("Press Enter to exit...\n");
    getchar();
    return 0;
}
dllmain.cpp
// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "pch.h"

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

extern "C" __declspec(dllexport) void MyFunction() {
    printf("Original Function\n");
}

image

给自己的备份(访客不可用)
-----BEGIN PGP MESSAGE-----

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
lpJU+Vdi7K9cwqxuYVjSplK9L4DAnu6N
=NDG3
-----END PGP MESSAGE-----
posted @   Timmoc  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
点击右上角即可分享
微信分享提示