进程中dll模块的隐藏

模块隐藏(滴水) dll注入进程是很难存活的,因为被注入的进程很容易检测到有一个DLL不是自己加载的,是别人加载的。所以我们需要将DLL隐藏起来 我们学习过API,可以枚举进程模块,那么这些API是怎么把模块查出来的呢 进程在0环有个结构体,叫EPROCESS。线程在0环有个结构体,叫ETHREAD。PEB和TEB是三环的结构体,在三环就能访问 PEB结构体的00c偏移是一个Ldr结构体 这个结构体就包括模块链... 阅读详情
 为了避免自己的某个dll模块被别人检测出来,有时候希望在自己加载一个dll之后,或者将dll注入到他人进程之后避免被检查出来。这就需要想办法抹掉这个dll的模块信息,使得Toolhelp、psapi等枚举模块的API无法枚举它。

        我们可以先简单看看Windows枚举进程内模块的办法吧:

        首先是BOOL EnumProcessModules( HANDLE hProcess, HMODULE* lphModule, DWORD cb, LPDWORD lpcbNeeded);

        EnumProcessModules实际调用EnumProcessModulesInternal进行枚举。下面是vista下psapi的代码片断:

.text:514024B8                 push    ebx

.text:514024B9                 push    18h

.text:514024BB                 lea     eax, [ebp+stProcessBasicInfo]

.text:514024BE                 push    eax

.text:514024BF                 push    ebx      ;ebx=0

.text:514024C0                 push    [ebp+hProcess]

.text:514024C3                 call    ds:__imp__NtQueryInformationProcess@20 ; NtQueryInformationProcess(x,x,x,x,x)

.text:514024C9                 cmp     eax, ebx

.text:514024CB                 jge     short loc_514024E0

        调用NtQueryInformationProcess获得ProcessBasicInformation,在PROCESS_BASIC_INFORMATION结构中取得PEB地址。然后读取指定进程PEB中的数据

text:514024E0 loc_514024E0:                           ; CODE XREF: EnumProcessModulesInternal(x,x,x,x,x)+24j

.text:514024E0                 mov     eax, [ebp+stProcessBasicInfo.PebBaseAddress]

.text:514024E3                 cmp     eax, ebx

.text:514024E5                 jnz     short loc_514024EE

.text:514024E7                 push    8000000Dh

.text:514024EC                 jmp     short loc_514024CE

.text:514024EE ; ---------------------------------------------------------------------------

.text:514024EE

.text:514024EE loc_514024EE:                           ; CODE XREF: EnumProcessModulesInternal(x,x,x,x,x)+3Ej

.text:514024EE                 push    ebx             ; lpNumberOfBytesRead

.text:514024EF                 push    4               ; nSize

.text:514024F1                 lea     ecx, [ebp+Ldr]

.text:514024F4                 push    ecx             ; lpBuffer

.text:514024F5                 add     eax, 0Ch

.text:514024F8                 push    eax             ; lpBaseAddress

.text:514024F9                 push    [ebp+hProcess] ; hProcess

.text:514024FC                 mov     edi, ds:__imp__ReadProcessMemory@20 ; ReadProcessMemory(x,x,x,x,x)

.text:51402502                 call    edi ; ReadProcessMemory(x,x,x,x,x) ; ReadProcessMemory(x,x,x,x,x)

这里读取的是PEB地址+0C处的四个字节。

通过WinDbg我们可以看看nt!_PEB的结构

0: kd> dt nt!_PEB

   +0x000 InheritedAddressSpace : UChar

   +0x001 ReadImageFileExecOptions : UChar

   +0x002 BeingDebugged    : UChar

   +0x003 SpareBool        : UChar

   +0x004 Mutant           : Ptr32 Void

   +0x008 ImageBaseAddress : Ptr32 Void

   +0x00c Ldr              : Ptr32 _PEB_LDR_DATA

   +0x010 ProcessParameters : Ptr32 _RTL_USER_PROCESS_PARAMETERS

……

+0C处是一个_PEB_LDR_DATA结构指针,里面包含了和LDR相关的一些数据,进程的模块链表就保存在Ldr中。下面是_PEB_LDR_DATA的结构:

0: kd> dt nt!_PEB_LDR_DATA

   +0x000 Length           : Uint4B

   +0x004 Initialized      : UChar

   +0x008 SsHandle         : Ptr32 Void

   +0x00c InLoadOrderModuleList : _LIST_ENTRY

   +0x014 InMemoryOrderModuleList : _LIST_ENTRY

   +0x01c InInitializationOrderModuleList : _LIST_ENTRY

   +0x024 EntryInProgress : Ptr32 Void

其中,InLoadOrderModuleList、InMemoryOrderModuleList、InInitializationOrderModuleList就是进程当前已加载模块的链表,只是按照不同的方式排序。EnumProcessModules是通过InMemoryOrderModuleList链表枚举的,而根据Win2k代码,ToolHelp32函数是通过InLoadOrderModuleList枚举。这三个_LIST_ENTRY都是在一个RTL_PROCESS_MODULE_INFORMATION结构中的成员。这个结构在2k代码中有引用,不过没有确切的定义,下面是ReactOS中的定义,不过看起来我的vista PSAPI中使用的结构已经有所变化了,这里只作参考。

//

// Loader Data Table Entry

//

typedef struct _LDR_DATA_TABLE_ENTRY

{

    LIST_ENTRY InLoadOrderLinks;

    LIST_ENTRY InMemoryOrderModuleList;

    LIST_ENTRY InInitializationOrderModuleList;

    PVOID DllBase;

    PVOID EntryPoint;

    ULONG SizeOfImage;

    UNICODE_STRING FullDllName;

    UNICODE_STRING BaseDllName;

    ULONG Flags;

    USHORT LoadCount;

    USHORT TlsIndex;

    union

    {

        LIST_ENTRY HashLinks;

        PVOID SectionPointer;

    };

    ULONG CheckSum;

    union

    {

        ULONG TimeDateStamp;

        PVOID LoadedImports;

    };

    PVOID EntryPointActivationContext;

    PVOID PatchInformation;

} LDR_DATA_TABLE_ENTRY, *PLDR_DATA_TABLE_ENTRY;

到这里,隐藏模块的方法就已经明了了:通过PEB取得Ldr数据,拿到三个模块链表,并将要隐藏的模块断链即可。下面是主要代码实现:

BOOL HideMyself()

{

     HMODULE hMod = GetModuleHandle( _T( "ntdll.dll"));

     HMODULE hModMyself = GetModuleHandle( _T("dll.dll"));

     pfnNtQueryInformationProcess p = (pfnNtQueryInformationProcess)::GetProcAddress( hMod, "NtQueryInformationProcess");

     PROCESS_BASIC_INFORMATION stInfo = {0};

     DWORD dwRetnLen = 0;

     DWORD dw = p( GetCurrentProcess(), 0, &stInfo, sizeof(stInfo), &dwRetnLen);

     PPEB pPeb = stInfo.PebBaseAddress;

     PLIST_ENTRY ListHead, Current;

     PLDR_DATA_TABLE_ENTRY pstEntry = NULL;

     ListHead = &( stInfo.PebBaseAddress->Ldr->InLoadOrderModuleList);

     Current = ListHead->Flink;

     while ( Current != ListHead)

     {

         pstEntry = CONTAINING_RECORD( Current, LDR_DATA_TABLE_ENTRY, InLoadOrderLinks);

         //DebugOutW( L"Module:%s, base:0x%X/r/n", pstEntry->FullDllName.Buffer, pstEntry->EntryPoint);

         if ( pstEntry->DllBase == hModMyself)

         {

              pstEntry->InLoadOrderLinks.Flink->Blink = pstEntry->InLoadOrderLinks.Blink;

              pstEntry->InLoadOrderLinks.Blink->Flink = pstEntry->InLoadOrderLinks.Flink;

              DebugOut( _T( "Hide injected dll."));

              break;

         }

         Current = pstEntry->InLoadOrderLinks.Flink;

     }

     ListHead = &( stInfo.PebBaseAddress->Ldr->InMemoryOrderModuleList);

     Current = ListHead->Flink;

     while ( Current != ListHead)

     {

         pstEntry = CONTAINING_RECORD( Current, LDR_DATA_TABLE_ENTRY, InMemoryOrderModuleList);

         DebugOutW( L"Module:%s, base:0x%X/r/n", pstEntry->FullDllName.Buffer, pstEntry->EntryPoint);

         if ( pstEntry->DllBase == hModMyself)

         {

              pstEntry->InMemoryOrderModuleList.Flink->Blink = pstEntry->InMemoryOrderModuleList.Blink;

              pstEntry->InMemoryOrderModuleList.Blink->Flink = pstEntry->InMemoryOrderModuleList.Flink;

              DebugOut( _T( "Hide injected dll."));

              break;

         }

         Current = pstEntry->InMemoryOrderModuleList.Flink;

     }

     DebugOutW( L"/r/n");

     ListHead = &( stInfo.PebBaseAddress->Ldr->InInitializationOrderModuleList);

     Current = ListHead->Flink;

     while ( Current != ListHead)

     {

         pstEntry = CONTAINING_RECORD( Current, LDR_DATA_TABLE_ENTRY, InInitializationOrderModuleList);

         DebugOutW( L"Module:%s, base:0x%X/r/n", pstEntry->FullDllName.Buffer, pstEntry->EntryPoint);

         if ( pstEntry->DllBase == hModMyself)

         {

              pstEntry->InInitializationOrderModuleList.Flink->Blink = pstEntry->InInitializationOrderModuleList.Blink;

              pstEntry->InInitializationOrderModuleList.Blink->Flink = pstEntry->InInitializationOrderModuleList.Flink;

              DebugOut( _T( "Hide injected dll."));

              break;

         }

         Current = pstEntry->InInitializationOrderModuleList.Flink;

     }

     //DebugOut( _T("Out HideMyself/r/n"));

     return TRUE;

}

        这样处理之后,通过常规的枚举进程方式已经枚举不到隐藏模块,ProcessExplorer也无法枚举。但是,通过枚举进程内存空间等非常规方法,仍然是可以找到的。关于PSAPI和Toolhelp函数枚举模块的原理,可以逆向Windows代码,或者查找网上的代码看看就明白了。

恶意代码--dll动态链接库注入目标进程隐藏自身(亲测win7x86和x64有效) 0x01 dll 注入简介 所谓DLL注入就是将一个DLL放进某个进程的地址空间里,让它成为那个进程的一部分。 很多恶意代码,游戏外挂,盗号木马,顽固类病毒等程序均采用此寄生,隐藏在目标计算机之内。 0x02 dll 注入关键API VirtualAllocEx function VirtualAllocEx函数在远程进程的地址空间中分配一块内存 阅读详情

相关推荐

Dll无模块加载(二)

以 gh0st源码为例,我将服务端代码迁移了出来,因为在网上的gh0st代码基本上都是release版本的,将服务端代码取出来方便调试。 在服务端生成的dll,显示加载的话在OD中明显可以看到相关模块,所以为了达到模块隐藏的目的,需要从内存中加载相关模块,从而在OD 中看不到这个dll。 在百度上面搜索MemLoadDll找到了相关的源码,但是大部分源码调用MemLoadLi

qq_22423659的博客 1698

.dll文件存在但是不显示_一招巧妙解决U盘内文件明明存在,打开U盘而内容却不显示的问题...

大家可能都遇到过这种情况,就是说U盘中明明有文件,但是插在电脑上就是什么文件都没有,一片空白,这样的问题对于那些对文件很重要且仅保存了1份的人来说是很.kongbu.,因为U盘中的内容都是命根子。给大家介绍绝对有用的解决方法……U盘里的东西显示不出来,就是说U盘里明明有东西,但是插在电脑上却什么都不显示,查看属性确实是有东西的,这种病毒学校的机房很常见的。如果你也遇到此类情况,建议你用下面的方法试...

weixin_39562579的博客 1669

DLLFinder:使用 NtQueryVirtualMemory 枚举 DLLsModules

DLL查找器 使用 NtQueryVirtualMemory 枚举 DLL/模块 ##Summary 显示使用 NtQueryVirtualMemory 枚举内存以列出应用程序中的模块和 DLL 的基本应用程序。 总而言之,您很可能不会使用它来枚举模块,而不是扫描现实世界中的内存页面。 ##Limitations 唯一真正的限制是,如果 DLL 的 PE 标头已被剥离,它可能会失败。 唯一的其他限制是,如果将NtQueryVirtualMemory钩在SSDT中,则会导致明显的结果。

再谈隐藏进程中的DLL模块/黑月教主

 http://hi.baidu.com/_achillis/blog/item/59bf732623fbe509918f9d87.html 相当老的话题,大约一年前就写过这个东西了,不过那时候知识比较有限,也不了解内核,因此实现得很粗浅,现在再写一下,权当是对这个老问题的总结吧。先谈谈正规DLL的隐藏方法,这里说的正规DLL,是指用LoadLibrary以正常方式加载的DLL。一

lookWang的专栏 6410

滴水科技逆向工程全套课件和工具.rar

滴水科技逆向工程视频课程全套课件和配套工具,海东老师讲

自动驾驶开发者必看:nuscenes数据集23类物体标注全解析(附避坑指南)

本文深入解析nuscenes数据集的23类物体标注系统,为自动驾驶开发者提供全面的标注规范解读和实战避坑指南。涵盖多模态数据组织、类别细分规则、属性系统应用技巧以及标注质量验证方法,帮助开发者高效利用这一标杆数据集提升模型性能。

weixin_29041767的博客 258

【旧文章搬运】再谈隐藏进程中的DLL模块

原文发表于百度空间,2009-09-17========================================================================== 相当老的话题,大约一年前就写过这个东西了,不过那时候知识比较有限,也不了解内核,因此实现得很粗浅,现在再写一下,权当是对这个老问题的总结吧。先谈谈正规DLL的隐藏方法,这里说的正规DLL,是指用LoadLib...

weixin_30407099的博客 289

LCD工程师必看:Pixelclock、Mipi Clk计算全解析(附实用公式)

本文为LCD工程师详细解析了像素时钟(Pixelclock)与MIPI时钟(Mipi Clk)的核心计算方法。文章从时序参数构成入手,通过实战公式推导,系统阐述了从屏幕分辨率、刷新率到最终MIPI速率的高效计算链路,并提供了实用的调试思路与排查清单,帮助工程师快速解决画面撕裂、闪烁等常见问题。

weixin_29266679的博客 393

VC隐藏DLL模块函数

VC隐藏DLL模块函数 以前写的一个隐藏DLL模块函数,记录下来,免得以后需要时难找。 隐藏的方法是把DLL模块的路径从进程的内存中清除掉,不过,还是有方法可以把隐藏的DLL路径找出来的,比如内存暴力搜索等。 隐藏DLL模块的路径后,会存在一些问题,比如你后面想拿DLL的路径,拿不到了,所以在隐藏之前需要把路径保存起来;还有,当程序要Load你隐藏的DLL时,会重新加...

weixin_34408717的博客 110

保姆级教程:在ESXi 8.0上为NVIDIA ConnectX-5/6网卡开启SR-IOV(从BIOS到虚拟机配置)

本文提供在ESXi 8.0上为NVIDIA ConnectX-5/6网卡开启SR-IOV的详细教程,涵盖BIOS设置、固件配置、驱动优化及虚拟机部署。通过SR-IOV技术,显著提升虚拟化环境中的网络性能,适用于高性能计算、AI训练等场景。

weixin_26934905的博客 455

海思SD3403/SS928开发(二)环境搭建:从零到一构建高效开发环境的实战指南

本文详细介绍了海思SD3403/SS928开发板环境搭建的全流程,包括Ubuntu系统选择、基础配置、开发环境依赖安装、SDK工具链配置等关键步骤。通过实战经验分享,帮助开发者避免常见问题,快速构建高效开发环境,提升开发效率。

weixin_28717683的博客 286

易语言编程-x64驱动强制隐藏DLL模块技术(过第三方dll检测)

这个功能呢可以让易语言隐藏64位进程里任何dll模块,包括自己注入的dll也可以隐藏,而且是驱动级别隐藏。所以很大写DLL方式辅助的一注入DLL到游戏就被发现检测,提示第三方DLL程序,关闭后再进行游戏。并且隐藏后,任何驱动工具(包括CE工具)都无法查看枚举被隐藏的DLL文件以及找不到DLL内存区域,就算是有保护的游戏比如 dxf ,用这个功能也一样可以隐藏进程中任意DLL模块不被发现。.参数 模块句柄, 长整数型, , 要隐藏的dll或exe模块句柄。第三方DLL检测,是很多游戏都会做的,

hzw320的博客 2724

自动化学报latex模板——ctex2.4.6和ctex2.9.2直接使用步骤

自动化学报latex模板——ctex2.4.6和ctex2.9.2直接使用步骤 1.背景及问题 最近在使用自动化学报latex模板写作业时,一只对latex搞不清楚,网上关于各种版本的latex下载了一堆(比如ctex中文套装方案的各个版本及texlive+texstudio方案,中间还升级了miktex,windet等),发现都未能成功编译出来自动化学报的latex模板,反正开始头很大!!!最后终于没忍住打开了: 自动化学报官网下载模板链接,因为我就要用latex模板(不能服输!)找到的解决方案是:使用

QIANFANGshiwo的博客 7712

将dll从进程模块列表中移除并保持正常运行

将dll从进程模块列表中移除并保持正常运行,这玩意想想是挺简单,n久前byshell就用了,简单的思路就是给当前的dll内存映像做份拷贝,然后跳到那份拷贝的地址空间的代码,回头free掉原来的dll,然后马上用VirtualAlloc在原基址上申请块同样大小的空间,并将那份拷贝还原回去,再跳回去执行。完。代码写完后再实际程序中应用后发现问题,一旦调用到malloc或new的话就会崩溃,

750

11、基于多阵列电极的表面肌电信号运动估计

本文介绍了一种基于多阵列电极的表面肌电信号运动估计技术,旨在实现对手腕和手指运动的高精度估计,解决传统人机接口在操控多自由度机器人时的局限性。通过多阵列电极系统采集前臂肌肉活动信号,结合独立成分分析(ICA)和非负矩阵分解(NMF)等信号处理方法,提取肌肉协同作用,进而生成运动指令以控制机器人或假肢手。文章对比了多阵列电极与传统电极的优势,展示了运动估计算法的整体流程,并以假肢手控制为例说明其实际应用。最后探讨了该技术在测量精度、应用拓展、智能化和便携化等方面的未来发展方向。该技术为假肢控制、康复训练和人机

ik678901234的博客 87

小目标检测之改进的YOLOV11算法

MASF-YOLO通过多尺度特征聚合注意力增强自适应融合三大核心创新,显著提升了无人机视角下的小目标检测性能。

hasakie的博客 1720

易语言-易语言实现DLL的注入 与 隐藏

易语言-易语言实现DLL的注入 与 隐藏 【下载地址】易语言-易语言实现DLL的注入与隐藏 该项目专注于易语言环境下实现DLL注入与隐藏的技术,旨在帮助开发者掌握如何在不被进程检测的情况下完成DLL注入。通过本教程,您可以学习到如何利用反编译功能模块,成功隐藏注入的DLL文件,使其在XT工具中显示为红色,表明隐藏操作已生...

gitblog_06764的博客 389

SI案例分享--考虑ESD保护二极管的差分线阻抗仿真

PCB设计中的cut out参考面早已是SI评估中常用的阻抗优化方式,通过合理的仿真建模,可以提供合适的设计参考,并保持与测试结果的高度一致性。

一只豌豆象的博客 1438
上一篇: SSDT UnHook代码
下一篇: EPO 入口点模糊技术
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值