进程中dll模块的隐藏

合集下载

dll加载原理

dll加载原理

dll加载原理DLL加载原理概述•DLL(动态链接库)是一种可执行文件格式,用于存储和共享程序代码和数据。

•DLL加载是将DLL文件加载到内存并解析其导出函数的过程。

DLL的分类•内核模式DLL:运行在操作系统内核空间中,提供给操作系统使用。

•用户模式DLL:运行在应用程序进程的用户空间中,为应用程序提供功能支持。

DLL的加载方式1.隐式加载:在应用程序启动时由操作系统自动加载所需的DLL文件。

–应用程序代码中使用函数,操作系统自动在加载应用程序的同时加载其依赖的DLL。

–应用程序代码需要将DLL的路径告知操作系统,操作系统根据路径找到DLL并加载。

2.显式加载:在应用程序运行时手动加载所需的DLL文件。

–应用程序通过调用加载函数(如LoadLibrary函数)手动加载DLL。

–调用GetProcAdress函数获取DLL中函数的入口地址,从而调用DLL中的函数。

DLL的加载过程1.读取DLL文件:–操作系统通过文件系统读取DLL文件的内容。

2.根据DLL文件的导入表(Import Table)解析DLL的依赖:–导入表记录了DLL所依赖的其他DLL,以及导出函数的名称和地址。

3.加载DLL依赖的其他DLL:–递归地加载DLL所依赖的其他DLL文件。

4.解析DLL导出函数:–根据导入表中记录的函数名称,找到导出函数的入口地址。

5.将DLL文件映射到进程空间:–将DLL文件映射到进程的虚拟内存空间中,以便能够访问DLL中的代码和数据。

6.更新进程的导入表:–更新进程的导入表,将DLL中导出函数的地址填入相应的入口地址。

DLL的卸载•当不再需要某个DLL时,可以将其从内存中卸载。

•DLL卸载的条件通常是没有其他模块依赖该DLL,或者由操作系统决定。

总结•DLL加载是将DLL文件加载到内存并解析导出函数的过程。

•DLL可以通过隐式加载或显式加载的方式加载。

•DLL的加载过程包括读取DLL文件、解析依赖、加载其他DLL、解析导出函数等步骤。

vs工程运行时隐藏窗口方法

vs工程运行时隐藏窗口方法

vs工程运行时隐藏窗口方法在Visual Studio中,当我们运行一个程序时,有时候我们希望程序在后台运行,而不显示窗口。

这在一些需要静默运行的场景下非常有用,比如后台任务或者系统服务。

下面我将从多个角度来介绍在Visual Studio中实现隐藏窗口的方法。

1. 使用Windows Forms应用程序,如果你的程序是基于Windows Forms的,你可以在Main方法中设置Application.Run时传入一个隐藏的窗体,这样程序就会在后台运行而不显示窗口。

csharp.Application.Run(new HiddenForm());2. 使用Console应用程序,对于控制台应用程序,你可以在Main方法中调用Win32 API来隐藏控制台窗口。

csharp.class Program.{。

[DllImport("kernel32.dll")]static extern IntPtr GetConsoleWindow();[DllImport("user32.dll")]static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);const int SW_HIDE = 0;static void Main()。

{。

IntPtr hWnd = GetConsoleWindow();if (hWnd != IntPtr.Zero)。

{。

ShowWindow(hWnd, SW_HIDE);}。

// 其他代码。

}。

}。

3. 使用WPF应用程序,对于基于WPF的应用程序,你可以在App.xaml.cs中重写OnStartup方法,在启动时隐藏主窗口。

csharp.protected override void OnStartup(StartupEventArgs e)。

{。

base.OnStartup(e);MainWindow mainWindow = new MainWindow();mainWindow.Hide();// 其他代码。

模块隐藏三种方法

模块隐藏三种方法

摘要(转自网络):一、从PEB的Ldr链中消失引用内容lkd> dt _PEB 7ffdc000 //当前PEB的地址nt!_PEB...+0x00c Ldr : 0x001a1e90_PEB_LDR_DATA //这里指向Ldr结构lkd> dt _PEB_LDR_DATA 0x001a1e90 //这个结构里有三个链表的表头nt!_PEB_LDR_DATA+0x000 Length : 0x28+0x004 Initialized : 0x1 ''+0x008 SsHandle : (null)+0x00c InLoadOrderModuleList : _LIST_ENTRY [ 0x1a1ec0 - 0x1a34f8 ]+0x014 InMemoryOrderModuleList : _LIST_ENTRY [ 0x1a1ec8 -0x1a3500 ]+0x01c InInitializationOrderModuleList : _LIST_ENTRY [ 0x1a1f28 - 0x1a3508 ]+0x024 EntryInProgress : (null)这里看到有三个链表,其实三个链表的内容是一样的,但是链表的顺序不一样,分别按加载顺序、内存顺序、初始化顺序排列。

每一个DLL由一个LDR_DATA_TABLE_ENTRY结构描述,但是第一个结构被链入了三个链表。

取一个来看看:引用内容lkd> dt _LDR_DATA_TABLE_ENTRY 0x1a34f8nt!_LDR_DATA_TABLE_ENTRY+0x000 InLoadOrderLinks : _LIST_ENTRY [ 0x1a1e9c - 0x1a3450 ]+0x008 InMemoryOrderLinks : _LIST_ENTRY [ 0x1a1ea4 - 0x1a3458 ]+0x010 InInitializationOrderLinks : _LIST_ENTRY [ 0x1a1eac -0x1a3460 ]+0x018 DllBase : 0x20000000+0x01c EntryPoint : (null)+0x020 SizeOfImage : 0x549000+0x024 FullDllName : _UNICODE_STRING"C:\WINDOWS\system32\xpsp2res.dll"+0x02c BaseDllName : _UNICODE_STRING"xpsp2res.dll"......//省略部分内容随便取一个链表进行遍历,根据DllBase找到自己的DLL之后,从三个链中RemoveEntryList就可以了,这样所有使用PEB->Ldr结构来枚举DLL链表的就无法找到了。

在Delphi中隐藏程序进程的方法

在Delphi中隐藏程序进程的方法

在Delphi中隐藏程序进程方法[1]主要需要解决两个问题,即隐藏窗口和设定热键。

一. 隐藏窗口通过API函数GETACTIVEWINDOW获取当前窗口;函数ShowWindow(HWND,nCmdShow)的参数nCmdShow取SW_HIDE时将之隐藏,取SW_SHOW时将之显示。

例如:showwindow(getactivewindow,sw_hide)。

隐藏好窗体后,须记住窗体句柄以便恢复。

二. 键盘监控为了实现键盘监控须用到钩子。

以下是程序的源文件:一、创建一个动态链接库unit HKHide; //链接库中的Unit文件interfaceusesWindows, Messages, sysutils;varhNextHookHide: HHook;HideSaveExit: Pointer;hbefore:longint;function KeyboardHookHandler(iCode: Integer;wParam: WPARAM;lParam: LPARAM): LRESULT; stdcall; export;function EnableHideHook: BOOL; export;function DisableHideHook: BOOL; export;procedure HideHookExit; far;implementationfunction KeyboardHookHandler(iCode: Integer;wParam: WPARAM;lParam: LPARAM): LRESULT; stdcall; export;const _KeyPressMask = $80000000;varf:textfile;temp:string;beginResult := 0;If iCode < 0 ThenbeginResult := CallNextHookEx(hNextHookHide, iCode, wParam, lParam); Exit;end;//侦测 Ctrl + Alt + F12 组合键if ((lParam and _KeyPressMask) = 0) //按下时生效and (GetKeyState(vk_Control) < 0)and (getkeystate(vk_menu)<0)and (wParam = vk_F12) thenbeginResult := 1;//文件不存在则创建if not fileexists('c:\test.txt') thenbeginassignfile(f,'c:\test.txt');rewrite(f);writeln(f,0);closefile(f);endelsebeginassignfile(f,'c:\test.txt');reset(f);readln(f,temp);hbefore:=strtoint(temp);beginhbefore:=getactivewindow;temp:=inttostr(hbefore);rewrite(f);writeln(f,temp);closefile(f);ShowWindow(hbefore, SW_HIDE);end;end; //end if FileExists(....)endelse beginshowwindow(hbefore,SW_SHOW);rewrite(f);writeln(f,0);closefile(f);end;//end if Ctrl+Alt+F12按键end;function EnableHideHook: BOOL; export;beginResult := False;if hNextHookHide <> 0 then Exit;// 挂上 WH_KEYBOARD 这型的 HOOK, 同时, 传回值必须保留下 // 来, 免得 HOOK 呼叫链结断掉hNextHookHide := SetWindowsHookEx(WH_KEYBOARD,KeyboardHookHandler,HInstance,0);Result := hNextHookHide <> 0;end;function DisableHideHook: BOOL; export;beginif hNextHookHide <> 0 thenbeginResult:=True;UnhookWindowshookEx(hNextHookHide); // 解除 Keyboard Hook hNextHookHide:=0;endelseResult:=False;end;procedure HideHookExit;begin// 如果忘了解除 HOOK, 自动代理解除的动作if hNextHookHide <> 0 then DisableHideHook;ExitProc := HideSaveExit;end;end.library HKPHide; //动态链接库工程文件usesHKHide in HKHide.pas;exportsEnableHideHook,DisableHideHook;beginhNextHookHide := 0;hbefore:=0;HideSaveExit := ExitProc;ExitProc := @HideHookExit;end.//文件制作好后先Build All编译成HKPHide.dll。

电脑进程隐藏方法

电脑进程隐藏方法

电脑进程隐藏方法
1、方法比较简单,首先,你需要在网上搜索相关的隐藏进程的第三方软件工具。

这里就以HideToolz为例子,你在浏览器上输入“HideToolz”就会出现相关的官方下载界面,下载并将这个软件安装到你的电脑当中。

2、下载完后,电脑桌面上就会显示出一个HideToolz的压缩包,鼠标选中这个压缩包,双击打开这个压缩包。

然后在压缩包中找到该软件的应用程序,就能够进入到这个软件了。

通过这个软件,你可以看到目前电脑正在运行的软件有哪些、一共有多少软件是电脑当下所在运行的。

3、做完上面的步骤后,现在就开始隐藏电脑的进程。

找到电脑键盘上Ctrl + Alt +【启动任务管理器】,这几个按键,同时按下去,接着在HideToolz软件上面找到你即将要将其隐藏的运行程序,鼠标放在你要进行隐藏的程序上面,然后点击右键,选择隐藏。

做完这个步骤后,你可以进入到人物管理器里面,看看程序是否已经成功隐藏了。

被成功隐藏的程序是不会出现在任务管理器里面的。

4、最后,在隐藏了相关的运行程序之后,如果你想要将隐藏的程序再次调处来,那么你则需要再次打开HideToolz这个软件,在里面找到已经隐藏的程序,并且鼠标放在隐藏的程序上,单击右键,选择“显示”这个按钮,那么随后你就又能在任务管理器中看到该运行
的进程了!
5、除了利用上面说的第三方软件进行隐藏进程,其他不利用第三方软件隐藏进程的方法也有。

但是相对来说步骤复杂一些。

Dll 模块隐藏技术

Dll 模块隐藏技术

Dll模块隐藏技术学习各种外挂制作技术,马上去百度搜索"魔鬼作坊"点击第一个站进入、快速成为做挂达人。

如果你细细读完这篇文章,你会学到一下内容:1.PEB,TEB,LDR_DATA_TABLE_ENTRY等数据结构2.自己覆盖掉自己执行过的一段代码3.调试这个Dll你会发现DLL_PROCESS_ATTACH中的代码在OD首次停下即加载停止时已经执行完了!多么美妙啊!哈哈,OD不会发现你执行了什么4.本例最后附件有个ASM的控制台程序,用SDK编写,你可以学到用汇编写一个基本的控制台程序的格式5.最后那个控制台源码还包含完整的CreateRemoteThread注入进程的写法本文主要讲的是怎样隐藏一个dll模块,这里说的隐藏是指,dll被加载后怎样使它用一般的工具无法检测出来。

为什么要这么做呢?1.远程线程中的应用(1)大家都知道,远程线程注入主要有两种一种是直接copy母体中预注入的代码到目标进程地址空间(WriteProcessMemory),然后启动注入的代码(CreateRemoteThread),这种远程线程一旦成功实现,那么它只出现在目标进程的内存中,并没有对应的磁盘文件,堪称进程隐藏中的高招,可是缺点就是,你必须要在注入代码中对所有直接寻址的指令进行修正,这可是个力气活,用汇编写起来很烦。

(2)另一种更为常用的方法是注入一个dll文件到目标进程,这种方法的实现可以是以一个消息Hook为由进行注入,或者仍然使用CreateRemoteThread,这种方法的优点是Dll文件自带重定位表,也就是说你不必再为修正直接寻址指令而烦恼了!,dll自己会重定位!~~~嗯,真是不错的方法---可是我们说它不如上面说的方法牛。

为什么?因为它的致命伤就是可以用进程管理工具看见被加载的dll文件名、文件路径。

这真是太不爽了,因为只要用户看看模块列表很容易发现可疑模块!,再依据名字,找到路径,定位文件---dll文件就这样暴露了.这样也就不是很完美的隐藏进程。

基于DLL的进程隐藏技术研究

基于DLL的进程隐藏技术研究


引言

立 的 线 程 ) 享 地 址 空 间 以及 其 他 资 源 。 过 C etR moehed也 同 共 通 rae e tT ra 样 可 以在 另 一 个 进 程 内创 建 新 线 程 . 创 建 的远 程 线 程 同 样 可 以共 享 被 在 操 作 系 统 中 , 程 是 程 序 运 行 的 实 例 . 个 进 程 都 有 自身 的 进 远 程 进 程 的地 址 空 间 , 以 , 建 一 个 远 程 线 程 , 入 远 程 进 程 的 内存 进 每 所 创 进 程 环, 可记 为 E RO E S 而 每 个 进 程 都 拥 有 各 自线 程 , 程 的执 行 和 地 址 空 间 , 拥 有 了 该 远 程 进 程 的 权 限 , 以 在 监 视 模 块 被 恶 意 终 止 P C S。 进 就 可 调 度是 以 线 程 为 基 础 的 。 每个 线 程 也 有 各 自的 线 程 环 K E 可 记 为 时 及 时重 新 启 动 。 且 T B,
的 成员 :
T p d fsr c y e e tu tEPROC Sf ES
模 块 插 入 到 epoe. e中 , 以 较 好 得 隐藏 、 护 模 块 本 身 。 其 实 现 xlrr x e 可 保 步骤为 : ① 通 过 O e Poes函数 打开 试 图嵌 入 的 进 程 ,因 为 需 要 写 入 远 pn r s c 程 进 程 的 内 存 地 址 空 间 . 以必 须 申请 足 够 的 权 限 , 括 远 程 创 建 线 所 包

K R C S c; 术在 结 构 中 的偏 移 量 为 0 0 0 * P O E S P t, x0 0 /
D WOR nq ePo esI; D U iu rcs / 表 了 进 程 的 i* d *代 d/

进程隐藏的方法

进程隐藏的方法

进程隐藏的方法最基本的隐藏:不可见窗体+隐藏文件木马程序无论如何神秘,但归根究底,仍是Win32平台下的一种程序。

Windows下常见的程序有两种:1.Win32应用程序(Win32 Application),比如QQ、Office等都属于此行列。

2.Win32控制台程序(Win32 Console),比如硬盘引导修复程序FixMBR。

其中,Win32应用程序通常会有应用程序界面,比如系统中自带的"计算器"就有提供各种数字按钮的应用程序界面。

木马虽然属于Win32应用程序,但其一般不包含窗体或隐藏了窗体(但也有某些特殊情况,如木马使用者与被害者聊天的窗口),并且将木马文件属性设置为"隐藏",这就是最基本的隐藏手段,稍有经验的用户只需打开"任务管理器",并且将"文件夹选项"中的"显示所有文件"勾选即可轻松找出木马,于是便出现了下面要介绍的"进程隐藏"技术。

第一代进程隐藏技术:Windows 98的后门在Windows 98中,微软提供了一种能将进程注册为服务进程的方法。

尽管微软没有公开提供这种方法的技术实现细节(因为Windows的后续版本中没有提供这个机制),但仍有高手发现了这个秘密,这种技术称为RegisterServiceProcess。

只要利用此方法,任何程序的进程都能将自己注册为服务进程,而服务进程在Windows 98中的任务管理器中恰巧又是不显示的,所以便被木马程序钻了空子。

要对付这种隐藏的木马还算简单,只需使用其他第三方进程管理工具即可找到其所在,并且采用此技术进行隐藏的木马在Windows 2000/XP(因为不支持这种隐藏方法)中就得现形!中止该进程后将木马文件删除即可。

可是接下来的第二代进程隐藏技术,就没有这么简单对付了。

第二代进程隐藏技术:进程插入在Windows中,每个进程都有自己的私有内存地址空间,当使用指针(一种访问内存的机制)访问内存时,一个进程无法访问另一个进程的内存地址空间,就好比在未经邻居同意的情况下,你无法进入邻居家吃饭一样。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

进程中dll模块的隐藏为了避免自己的某个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+0×000 InheritedAddressSpace : UChar+0×001 ReadImageFileExecOptions : UChar+0×002 BeingDebugged : UChar+0×003 SpareBool : UChar+0×004 Mutant : Ptr32 Void+0×008 ImageBaseAddress : Ptr32 Void+0×00c Ldr : Ptr32 _PEB_LDR_DATA+0×010 ProcessParameters : Ptr32 _RTL_USER_PROCESS_PARAMETERS……+0C处是一个_PEB_LDR_DATA结构指针,里面包含了和LDR相关的一些数据,进程的模块链表就保存在Ldr中。

下面是_PEB_LDR_DATA的结构:0: kd> dt nt!_PEB_LDR_DATA+0×000 Length : Uint4B+0×004 Initialized : UChar+0×008 SsHandle : Ptr32 Void+0×00c InLoadOrderModuleList : _LIST_ENTRY+0×014 InMemoryOrderModuleList : _LIST_ENTRY+0×01c InInitializationOrderModuleList : _LIST_ENTRY+0×024 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数据,拿到三个模块链表,并将要隐藏的模块断链即可。

下面是主要代码实现:BOOLHideMyself(){HMODULEhMod = GetModuleHandle( _T( “ntdll.dll”));HMODULEhModMyself = GetModuleHandle( _T(“dll.dll”));pfnNtQueryInformationProcessp =(pfnNtQueryInformationProcess)::GetProcAddress( hMod, “NtQueryInformationProcess”) ;PROCESS_BASIC_INFORMATIONstInfo = {0};DWORDdwRetnLen = 0;DWORDdw = p( GetCurrentProcess(), 0, &stInfo, sizeof(stInfo), &dwRetnLen);PPEBpPeb = stInfo.PebBaseAddress;PLIST_ENTRYListHead, Current;PLDR_DATA_TABLE_ENTRYpstEntry = NULL;ListHead = &( stInfo.PebBaseAddress->Ldr->InLoadOrderModuleList);Current = ListHead->Flink;while ( Current != ListHead){pstEntry = CONTAINING_RECORD( Current, LDR_DATA_TABLE_ENTRY, InLoad OrderLinks);//DebugOutW( L”Module:%s, base:0x%Xrn”, 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, InMem oryOrderModuleList);DebugOutW( L“Module:%s,base:0x%Xrn”, pstEntry->FullDllName.Buffer, pstEntry->EntryPoint);if ( pstEntry->DllBase == hModMyself){pstEntry->InMemoryOrderModuleList.Flink->Blink = pstEntry->InMemoryOrderMo duleList.Blink;pstEntry->InMemoryOrderModuleList.Blink->Flink = pstEntry->InMemoryOrderMo duleList.Flink;DebugOut( _T( “Hide injected dll.”));break;}Current = pstEntry->InMemoryOrderModuleList.Flink;}DebugOutW( L“rn”);ListHead = &( stInfo.PebBaseAddress->Ldr->InInitializationOrderModuleList);Current = ListHead->Flink;while ( Current != ListHead){pstEntry = CONTAINING_RECORD( Current, LDR_DATA_TABLE_ENTRY, InInitiali zationOrderModuleList);DebugOutW( L“Module:%s,base:0x%Xrn”, pstEntry->FullDllName.Buffer, pstEntry->EntryPoint);if ( pstEntry->DllBase == hModMyself){pstEntry->InInitializationOrderModuleList.Flink->Blink = pstEntry->InInitializationO rderModuleList.Blink;pstEntry->InInitializationOrderModuleList.Blink->Flink = pstEntry->InInitializationO rderModuleList.Flink;DebugOut( _T( “Hide injected dll.”));break;}Current = pstEntry->InInitializationOrderModuleList.Flink;}//DebugOut( _T(”Out HideMyselfrn”));returnTRUE;}这样处理之后,通过常规的枚举进程方式已经枚举不到隐藏模块,ProcessExplorer也无法枚举。

相关文档
最新文档