Wormwaker 2023-10-10 18:37 采纳率: 0%
浏览 27

C/C++ 64位断链隐藏DLL?

我想实现对当前进程已加载的DLL进行隐藏的功能,网上已有32位系统的代码,我想在64位系统使用。于是我对https://www.cnblogs.com/onetrainee/p/11674211.html进行了略微的更改,而且将Intel汇编语法改为AT&T语法(这样DevC++才支持)。这是目前的代码:

/* 所需要的结构体
  1. _LDR_DATA_TABLE_ENTRY 链表指向数据
  2. _PEB_LDR_DATA 表示其 PEB0x处指向的数据表
  3. _LIST_ENTRY 指针指向的链表
  都已经在winternl.h中有定义,无需手动定义
 */

typedef struct _LDR_MODULE
{
    LIST_ENTRY          InLoadOrderModuleList;
    LIST_ENTRY          InMemoryOrderModuleList;
    LIST_ENTRY          InInitializationOrderModuleList;
    void*               BaseAddress;
    void*               EntryPoint;
    ULONG               SizeOfImage;
    UNICODE_STRING   FullDllName;
    UNICODE_STRING      BaseDllName;
    ULONG               Flags;
    SHORT               LoadCount;
    SHORT               TlsIndex;
    HANDLE              SectionHandle;
    ULONG               CheckSum;
    ULONG               TimeDateStamp;
} LDR_MODULE, *PLDR_MODULE;

using QWORD= unsigned long long;
using ADDRESS = QWORD; //因为是64位系统,所以只好用这个了
bool HideModule(char* szModule)
{
    HMODULE hMod = GetModuleHandleA(szModule);
    PLIST_ENTRY Head, Cur;
    PPEB_LDR_DATA ldr;
    PLDR_MODULE ldm;
    SetColor(7,0);
        ADDRESS* PEB;
    cout<<"\n获取PEB...";
    asm volatile(
        "movq %%gs:0x60, %0\n\t"      //64位系统上0x30偏移变成了0x60
        : "=r" (PEB)
        :
        :
        );  //ChatGPT 3.5帮忙修改
    SetColor(14,0);
    cout<<"\nPEB:"<<*PEB;  //成功获取!
    ldr = ((PPEB_LDR_DATA)((BYTE*)PEB+0x0C));
    
    SetColor(6,0);
    cout<<"\nLDR="<<ADDRESS(ldr);   //成功获取!
    Head = &(ldr->InMemoryOrderModuleList);
    Cur = Head->Flink;
    SetColor(8,0);
    cout<<"\nDo...";
    do
    {
        ldm = CONTAINING_RECORD(Cur, LDR_MODULE, InLoadOrderModuleList);
        SetColor(11,0);
        cout<<"\n0 ldm="<<ADDRESS(ldm);    //输出不是空指针。
        if (hMod == ldm->BaseAddress)   //<!> 这里崩溃了!!
        {
            SetColor(14,0);
            cout<<"\n1";   //还没输出这句话就崩了
            // 三个链表同时给断掉
            ldm->InLoadOrderModuleList.Blink->Flink =
            ldm->InLoadOrderModuleList.Flink;
            ldm->InLoadOrderModuleList.Flink->Blink =
            ldm->InLoadOrderModuleList.Blink;
            
            SetColor(14,0);
            cout<<"\n2";
            //
            ldm->InInitializationOrderModuleList.Blink->Flink =
            ldm->InInitializationOrderModuleList.Flink;
            ldm->InInitializationOrderModuleList.Flink->Blink =
            ldm->InInitializationOrderModuleList.Blink;
            
            SetColor(14,0);
            cout<<"\n3";
            //
            ldm->InMemoryOrderModuleList.Blink->Flink =
            ldm->InMemoryOrderModuleList.Flink;
            ldm->InMemoryOrderModuleList.Flink->Blink =
            ldm->InMemoryOrderModuleList.Blink;
            break;
        }
        Cur = Cur->Flink;
    } while (Head != Cur);
    return true;
}    

我比较菜,没学过汇编,连汇编语法转换都是问ChatGPT的(
ChatGPT3.5拒绝提供完整代码,说断链不道德(doge)祖母入睡法试过了没用
程序在输出0 ldm之后,输出1之前崩溃(代码中已标出)。

带佬们帮帮忙,在下感激不尽!!

  • 写回答

1条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2023-10-11 19:53
    关注

    引自强大而免费的微信小程序:皆我百晓生。


    根据您提供的代码,我有几点建议和注意事项:

    1. 在64位系统上,找到PEB(进程环境块)的偏移发生了变化。在64位系统上,PEB的偏移为0x60,而不是0x30。

    2. 在64位系统上,指针的大小需要使用QWORD或ADDRESS(unsigned long long)来表示,因为指针的大小为8个字节。

    3. 使用AT&T汇编语法时,内联汇编语句应该包含在asmvolatile之间,并使用双引号引起来。

    4. 在使用CONTAINING_RECORD宏时,需要确保提供正确的链表指针和结构体中的链表名称。

    5. 在断开链表时,需要确保使用正确的Blink和Flink指针。根据您提供的代码中的注释,您已经使用了正确的指针。

    下面是对代码进行的修改建议:

    #include <windows.h>
    #include <iostream>
    #include <winternl.h>
    
    using namespace std;
    
    typedef struct _LDR_MODULE
    {
        LIST_ENTRY          InLoadOrderModuleList;
        LIST_ENTRY          InMemoryOrderModuleList;
        LIST_ENTRY          InInitializationOrderModuleList;
        void*               BaseAddress;
        void*               EntryPoint;
        ULONG               SizeOfImage;
        UNICODE_STRING      FullDllName;
        UNICODE_STRING      BaseDllName;
        ULONG               Flags;
        SHORT               LoadCount;
        SHORT               TlsIndex;
        HANDLE              SectionHandle;
        ULONG               CheckSum;
        ULONG               TimeDateStamp;
    } LDR_MODULE, *PLDR_MODULE;
    
    using QWORD = unsigned long long;
    using ADDRESS = QWORD;
    
    bool HideModule(char* szModule)
    {
        HMODULE hMod = GetModuleHandleA(szModule);
        PLIST_ENTRY Head, Cur;
        PPEB_LDR_DATA ldr;
        PLDR_MODULE ldm;
        QWORD* PEB;
    
        cout << "\n获取PEB...";
        asm volatile (
            "movq %%gs:0x60, %0\n\t"
            : "=r" (PEB)
            :
            :
        );
        cout << "\nPEB:" << *PEB;
    
        ldr = reinterpret_cast<PPEB_LDR_DATA>(static_cast<BYTE*>(PEB) + 0x0C);
        cout << "\nLDR=" << reinterpret_cast<ADDRESS>(ldr);
    
        Head = &(ldr->InMemoryOrderModuleList);
        Cur = Head->Flink;
    
        cout << "\nDo...";
        do
        {
            ldm = CONTAINING_RECORD(Cur, LDR_MODULE, InMemoryOrderModuleList);
            cout << "\n0 ldm=" << reinterpret_cast<ADDRESS>(ldm);
    
            if (hMod == ldm->BaseAddress)
            {
                cout << "\n1";
                ldm->InLoadOrderModuleList.Blink->Flink = ldm->InLoadOrderModuleList.Flink;
                ldm->InLoadOrderModuleList.Flink->Blink = ldm->InLoadOrderModuleList.Blink;
    
                cout << "\n2";
                ldm->InInitializationOrderModuleList.Blink->Flink = ldm->InInitializationOrderModuleList.Flink;
                ldm->InInitializationOrderModuleList.Flink->Blink = ldm->InInitializationOrderModuleList.Blink;
    
                cout << "\n3";
                ldm->InMemoryOrderModuleList.Blink->Flink = ldm->InMemoryOrderModuleList.Flink;
                ldm->InMemoryOrderModuleList.Flink->Blink = ldm->InMemoryOrderModuleList.Blink;
    
                break;
            }
            Cur = Cur->Flink;
        } while (Head != Cur);
        
        return true;
    }
    

    请注意,这只是根据您提供的代码进行的修改。这个函数用于隐藏已加载的DLL。但是需要注意,在操作系统中隐藏系统DLL可能会导致系统不稳定或不可预测的行为,因此应谨慎使用。建议仅在测试或开发环境中使用此功能。

    评论

报告相同问题?

问题事件

  • 创建了问题 10月10日

悬赏问题

  • ¥15 求解O-S方程的特征值问题给出边界层布拉休斯平行流的中性曲线
  • ¥15 谁有desed数据集呀
  • ¥20 手写数字识别运行c仿真时,程序报错错误代码sim211-100
  • ¥15 关于#hadoop#的问题
  • ¥15 (标签-Python|关键词-socket)
  • ¥15 keil里为什么main.c定义的函数在it.c调用不了
  • ¥50 切换TabTip键盘的输入法
  • ¥15 可否在不同线程中调用封装数据库操作的类
  • ¥15 微带串馈天线阵列每个阵元宽度计算
  • ¥15 keil的map文件中Image component sizes各项意思