首页
社区
课程
招聘
[原创]Dll 模块隐藏技术
2010-11-6 15:30 58622

[原创]Dll 模块隐藏技术

2010-11-6 15:30
58622
Dll 模块隐藏技术
BY: tj08jx(fengxiaoxi)
;***********************************************************************
其实帖子都是这样看的少,细读的没几个,
如果你细细读完这篇文章,你会学到一下内容:
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]
2.自身文件的需要
   这个说起来比较简单,比如我的一个程序运行了,我不想让用户知道我的EXE使用了某个dll,那么同样的也需要这种隐身技术.

3. 技术实现
  (1).
   说完了这么多,该说说,到底应该怎么实现了.
   熟悉SEH的肯定对 PEB 这个结构并不陌生-- PEB (Process Environment Block)进程环境信息块,这里储存着进程的重要信息
   主要原理就是这个结构,和它的成员相关结构
   首先我们回顾一下如何找到这个结构,常见的代码是这个:

    mov   eax,fs:[30h]                ;就这一句足矣,执行后 eax --> PEB (eax指向PEB结构,即eax中是PEB结构在进程空间中的地址)
  
   熟悉TEB和SEH中反调试知识的童鞋一定对上面这个很熟悉了~~不多说了--(不懂得童鞋去学习一下SEH的相关知识你就会认清 fs 了)
   下面看一下 PEB 结构的定义 :
;=================================================================
    PEB STRUCT                                                                ; sizeof = 1E8h
        InheritedAddressSpace                        BYTE                ?        ; 0000h
        ReadImageFileExecOptions                BYTE                ?        ; 0001h
        BeingDebugged                                BYTE                ?        ; 0002h
        SpareBool                                BYTE                ?        ; 0003h
        Mutant                                        PVOID                ?        ; 0004h
        ImageBaseAddress                        PVOID                ?        ; 0008h
        Ldr                                        PVOID                ?        ; 000Ch PTR PEB_LDR_DATA
        ProcessParameters                        PVOID                ?        ; 0010h PTR RTL_USER_PROCESS_PARAMETERS
        SubSystemData                                PVOID                ?        ; 0014h
       
        ~~~~~~~~~~~~~~~~~                        ~~~~                ~~        ;PEB 结构以下部分省略
   PEB  ENDS
;==================================================================

由于PEB结构太庞大了,因此本文指截取了开头的一部分,因为我们主要使用的是它的 Ldr 成员,看见了吗? 对!,就是它在结构偏移 0Ch 处
后面已经指出了Ldr成员是一个指向 PEB_LDR_DATA 结构的指针,下面我们就得看看这个结构了:

;==================================================================
PEB_LDR_DATA STRUCT                                                        ; sizeof = 24h
        _Length                                        DWORD                ?        ; original name Length
        Initialized                                BYTE                ?        ; 04h
                                                db         3   dup(?)        ; padding
        SsHandle                                PVOID                ?        ; 08h
        InLoadOrderModuleList                        LIST_ENTRY        <>        ; 0Ch
        InMemoryOrderModuleList                        LIST_ENTRY        <>        ; 14h
        InInitializationOrderModuleList                LIST_ENTRY        <>        ; 1Ch
PEB_LDR_DATA ENDS
;==================================================================
啊哈~~~这里我们看到了想要的东西, Module 这个单词被我们发现了,ModuleList 就是模块 列表嘛~~~
InLoadOrderModuleList 就是按照模块加载顺序描述模块信息的,InMemoryOrderModuleList是按照内存中存储顺序描述,
InInitializationOrderModuleList是按照初始化dll模块的顺序描述的(你可以利用它们之一获得kernel32.dll的基址
这是许多无导入表程序的必做之事)

为了弄清Module信息究竟是怎么储存的,我们又必须知道LIST_ENTRY结构的定义
一个LIST_ENTRY结构描述了一个双链表
;======================================
LIST_ENTRY        STRUCT
        Flink        pLIST_ENTRY               
        Blink        pLIST_ENTRY
LIST_ENTRY        ENDS

pLIST_ENTRY typedef PTR LIST_ENTRY        ;pLIST_ENTRY 表示指向LIST_ENTRY结构的指针
;=====================================


根据图片我们可以看出LIST_ENTRY的用法,它嵌入在一个结构类型内,Flink指向下一个这种结构类型内的LIST_ENTRY
这样由表头,就可以找到所有的data struct结构了!
啊哈~~  MSDN 又说 InMemoryOrderModuleList 指向一个 LDR_DATA_TABLE_ENTRY 结构,也就是说,我们的图片的
data struct 1,2,3  就是指 LDR_DATA_TABLE_ENTRY 结构,再看看 它的 定义:(虽然结构有点绕,别晕啊~~快胜利了)
;===========================================================
LDR_DATA_TABLE_ENTRY STRUCT
        InLoadOrderLinks                        LIST_ENTRY         ;0h
        InMemoryOrderLinks;                        LIST_ENTRY         ;8h
          InInitializationOrderLinks;                LIST_ENTRY        ;10h
        DllBase;                                dword                ;18h                ;DllBase模块基址
        EntryPoint;                                dword                ;1Ch                ;模块入口点
        SizeOfImage;                                dword                ;20h                ;模块的内存映像大小
        FullDllName;                                UNICODE_STRING        ;24h               
        BaseDllName;                                UNICODE_STRING        ;2Ch               
        Flags;                                        dword                ;34h
       
        ~~~~~~~~~~~~~~~~~~~~~~~~~~                ~~~~~~~~~        ;LDR_DATA_TABLE_ENTRY结构以下部分省略
LDR_DATA_TABLE_ENTRY ENDS
;===========================================================
怎么样?看成员名字就知道~~~~,模块信息就在此处!
可以肯定一个LDR_DATA_TABLE_ENTRY描述一个模块的信息,依靠LIST_ENTRY与下一个或前一个LDR_DATA_TABLE_ENTRY想连.
它的前三个成员都是 LIST_ENTRY 类型!,再看看上面图片,你应该明白了吧,PEB_LDR_DATA中的三个LIST_ENTRY的后继依次就是这三个
这里我们主要使用InLoadOrderModuleList这个成员来遍历模块,原因是InLoadOrderModuleList对应的嵌入在LDR_DATA_TABLE_ENTRY结构中
的InLoadOrderLinks位于结构首部,用它寻址会方便、清楚一些(当然你用其它两个,InMemoryOrderModuleList 和
InInitializationOrderModuleList也可以啊)
看这个汇编代码,我们要定位于首个LDR_DATA_TABLE_ENTRY:
       
                mov        eax,fs:[30h]                ;eax-->PEB
                mov        eax,[eax + 0Ch]                ;eax == PEB.Ldr --> PEB_LDR_DATA
                mov        eax,[eax + 0Ch]                ;eax == PEB_LDR_DATA.InLoadOrderModuleList.Flink --> LDR_DATA_TABLE_ENTRY

        OK,执行后eax中就是第一个LDR_DATA_TABLE_ENTRY结构的地址啦!!!
        3个mov指令,但是用到了好多结构啊~~~       
       
对于我们的遍历方式,第一个LDR_DATA_TABLE_ENTRY描述的应该是dll所属的EXE的信息,包括入口点,基址,文件名什么的 ~~~
到这里我们还差一小步 那就是 UNICODE_STRING 结构
;=============================================================
UNICODE_STRING STRUCT                                ;sizeof == 08h
  Length                                word        ;0h
  MaximumLength                                 word        ;02h
  Buffer                                dword        ;04h
UNICODE_STRING STRUCT        ENDS
;=============================================================
Length        指明由Buffer字段指向的UNICODE串的长度,不包括结尾的 00 00
        比如" C:\A "这个UNICODE串那么Length就是4*2==8
Buffer        指向Unicode字串的指针!

        太好了终于大功告成,解决复杂的结构了--
        现在假设我们要获得某个模块的全路径:

                mov        eax,fs:[30h]                ;eax-->PEB
                mov        eax,[eax + 0Ch]                ;eax == PEB.Ldr --> PEB_LDR_DATA
                mov        eax,[eax + 0Ch]                ;eax == PEB_LDR_DATA.InLoadOrderModuleList.Flink --> LDR_DATA_TABLE_ENTRY
                mov        eax,[eax + 24h + 4h]        ;eax == LDR_DATA_TABLE_ENTRY.FullDllName.Buffer --> 模块路径unicode串

         执行过后,eax 中存储的就是我们遍历的首个模块的模块全路径字串的地址
         也就是模块字串名称的指针.
        要访问下一个LDR_DATA_TABLE_ENTRY,在上几句代码的基础上只需这样:

                mov eax,[eax]   ;因为eax本身就是指向LIST_ENTRY结构地~~~,这样mov指令使得
                                ;当前LIST_ENTRY的Flink传送到eax,eax自然就指向下一个LDR_DATA_TABLE_ENTRY结构了~~~

  (2).
        好了说说我们的dll隐身技术,我们就是要将这里的LDR_DATA_TABLE_ENTRY.FullDllName指向的字符串清除!
因为快照函数或其它的函数,一般都会在底层访问这个结构,在这里查询 模块 的信息,我们把它给清除了,看它还能查到了吗?

下面我们假设我们已经使用CreateRemoteThread创建一个远程线程,远程线程入口就是 LoadLibraryA 函数,传入参数就是我们的欲注入
的dll文件名,现在我们看看这个dll文件的核心代码,看它如何清除自己的FullDllName串实现隐藏:
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
DllEntry	proc	_hInstance,_dwReason,_dwReserved

		pushad
							

		mov	eax,_dwReason
		.if	eax == DLL_PROCESS_ATTACH			;Dll初始化时执行!
			push	_hInstance
			pop	hInstDll				;hInstDll保存本dll加载基址
			;------------------------------------------
			;定位eax指向首个LDR_DATA_TABLE_ENTRY结构
			;------------------------------------------
			assume	fs:nothing
			mov	eax,fs:[30h]				;eax-->PEB
			mov	eax,[eax + 0Ch]				;eax==Ldr-->PEB_LDR_DATA
			mov	eax,[eax + 0Ch]				;LoadOrderList.Flink-->LDR_DATA_TABLE_ENTRY
			;-----------------------------------------------------------
			;通过循环遍历LDR_DATA_TABLE_ENTRY结构,比较DllBase与hInstDll
			;找到描述本dll模块的LDR_DATA_TABLE_ENTRY结构
			;-----------------------------------------------------------
			@@:
			mov	ebx,[eax + 18h]				;[eax + 18h]为当前处理的模块的基址
			cmp	ebx,hInstDll				;找到本模块的LDR_DATA_TABLE_ENTRY
			jne	_No
			mov	ebx,[eax + 24h + 4]
			movzx	ecx,word ptr [eax + 24h]		;Unicode String length 获得子串长度
			mov	edi,ebx					;Unicode String Address 
			cld
			rep	stosb					;用Al的值填充
			mov	dword ptr [ebx],0			;(确保String首4个byte为0)
			jmp	@F
			_No:
			mov	eax,[eax]				;链表遍历
			jmp	@B
			@@:

		.elseif  -- - -- - - -- 
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::		

        在Dll初始化时,响应 DLL_PROCESS_ATTACH ,在这其中清除我们的“自己的名字”,来个神不知鬼不觉!,哈哈~~
        这同时也说明,初始化时,Windows已经把各结构都填写好了.
       

        做到这里我们已经能实现这样的功能,即 一般的进程查看工具看不到我们注入的dll了!
        因为我们把它要查的信息清除了!

            说到这可能有大牛说,我暴力搜索内存,匹配 MZ--PE ,看你往哪跑? 的却我是跑不了 ~~
        如果你这样做的话,首先你得知道我注入的是哪个进程,其次,你得有耐心暴力搜索,然后--- 真的被您搜到了 ---
        此时我的 dll 的代码便可以被人家随便分析啦 ~~ 一看 哈哈,原来就是清除了 某某结构的内容啊 ---
        哼! 我在你的 导出表 里找到你的 dll 名字!,然后找到你的磁盘文件,那你就任我鱼肉吧! 哈哈哈哈~~~~~

           好可怕啊~~~,是啊,用OD看看,然后静态反汇编一下,我们的代码就露馅了--唉 --
        等等!!
        要不然 我们来个 Self Modify 将dll中的这段代码 也给它清除掉,对! 还有 EXPORT 的那个 dll 名,一起除掉,
        给它来个 毁尸灭迹 O(∩_∩)O哈哈~
        说干就干,看下面代码:
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
DllEntry	proc	_hInstance,_dwReason,_dwReserved

		pushad
		mov	eax,_dwReason
		.if	eax == DLL_PROCESS_ATTACH

			push	_hInstance
			pop	hInstDll
	
		_BEGIN:
			call	@F
			@@:
			pop	eax					;eax返回@@标号处的线性地址
			sub	eax,5					;执行后eax等于_BEGIN处的线性地址
			push	eax
			mov	ebx,offset _END - offset _BEGIN
			invoke	VirtualProtect,eax,ebx,PAGE_EXECUTE_READWRITE,addr flOldProtect							;flOldProtect万万不可少
			;------------------------------------------
			;清除PEB结构中,(UNICODE STRING)FullDllName
			;------------------------------------------
			assume	fs:nothing
			mov	eax,fs:[30h]				;eax-->PEB
			mov	eax,[eax + 0Ch]				;eax==Ldr-->PEB_LDR_DATA
			mov	eax,[eax + 0Ch]				;LoadOrderList.Flink-->LDR_DATA_TABLE_ENTRY
			@@:
			mov	ebx,[eax + 18h]
			cmp	ebx,hInstDll				;找到本模块的LDR_DATA_TABLE_ENTRY
			jne	_No
			mov	ebx,[eax + 24h + 4]
			movzx	ecx,word ptr [eax + 24h]		;Unicode String length
			mov	edi,ebx					;Unicode String Address
			cld
			rep	stosb
			mov	dword ptr [ebx],0			;(确保String首4个byte为0)
			jmp	@F
			_No:
			mov	eax,[eax]
			jmp	@B
			@@:
			;---------------------------------
			;清除Dll映像中导出表中的Dll文件名
			;---------------------------------
			mov	esi,hInstDll
			add	esi,[esi + 03Ch]
			assume	esi:ptr IMAGE_NT_HEADERS
			mov	edi,[esi].OptionalHeader.DataDirectory[0].VirtualAddress
			add	edi,hInstDll
			assume	edi:ptr IMAGE_EXPORT_DIRECTORY
			mov	edi,[edi].nName
			add	edi,hInstDll					;edi-->DllName(Export)
			mov	[esp - 4*4],edi					
			xor	eax,eax
			mov	ecx,-1
			cld
			repnz	scasb						;[edi] != 0 -->> continue
			sub	edi,[esp - 4*4]					;edi == length + 1
			mov	[esp - 4*3],edi
			mov	dword ptr [esp - 4*2],PAGE_EXECUTE_READWRITE
			lea	eax,flOldProtect
			mov	[esp - 4*1],eax
			sub	esp,4*4
			call	VirtualProtect					;调用VirtualProtect更改页属性
			xor	eax,eax
			xchg	ecx,edi						;edi == length + 1			
			xchg	edi,[esp - 4*4]					;[esp - 4*4] --> DllName
			cld
			rep	stosb
			;-------------------------------------
			;将_BEGIN 与 _END 之间内容填充为int 3
			;-------------------------------------
			pop	edi
			mov	eax,0CCh
			mov	ecx,offset _END - offset _BEGIN
			cld
			rep	stosb
		_END:

			;--------------------------------------------
			;创建自定义线程,you can do anything you want
			;--------------------------------------------
			invoke	CreateThread,0,0,addr _ThreadProc,0,0,0

		.elseif eax == DLL_PROCESS_DETACH
			NOP
		.endif

		popad
		mov	eax,TRUE
		ret

DllEntry	Endp
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

这最后一部分就是 Dll 的完全的核心代码啦 ~~~ 调用VirtualProtectl两次,第一次用于更改
_BEGIN与_END标号处的属性,以便毁尸灭迹填充 int 3.第二次用于更改导出表dll文件名的地方
的属性,以便将其清零.
最后程序可以创建个自定义线程,在这个线程里 you can do anything you like

;/////////////////////////////////////////////////////////////////////////////////////////////
至此,我们的工程完成啦 ~~~ ,即使搜索内存字符串也是搜不到的--因为所有的相关串都被我们毁了

##我测试环境是 Win 7,ProcessExplorer 和 360自带的 进程管理器 都查不出来 已加载的Dll模块.##
##冰刃的话说是不支持win 7 因此未测试,不知结果不敢妄言##

好了说说我们的附件:
                        你可以看到本文使用的是 MASM32 的语法
                        附件中有完整的 dll 文件的源代码,还有编译好的 dll 文件。
                        为了测试程序的方便我还特意用 ASM 写了个控制台程序,这个控制台程序是个"dll 注入器"
                        采用CreateRemoteThread的方式注入,你可以输入进程名来完成注入,以便测试我们的这个dll
                        这个控台程序的源码同样在附件中.
                   注意:注入前 dll 文件要放在 PATH 变量指定的目录中,否则LoadLibraryA找不到dll会失败
                        dll成功注入后首先会弹出个MessageBox,告诉你,它被 Loaded 了,然后 自定义线程
                        会 每隔 6 秒弹出一个 MessgeBox,告诉你 It is alive !
:由于涉及到远程注入,因此部分杀软会报毒的,如果想继续测试,请暂时关闭 进程防火墙 或 其它可能的主动防御

[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界

上传的附件:
收藏
点赞7
打赏
分享
最新回复 (52)
雪    币: 38
活跃值: (48)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
风萧兮 1 2010-11-6 16:19
2
0
写的 怎么没人来看呢~~~~
上传的附件:
雪    币: 81
活跃值: (40)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
寻梦小子 1 2010-11-6 17:19
3
0
楼主我**。。
雪    币: 34
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
mszjk 2010-11-6 18:01
4
0
lz忘记抹_LDR_DATA_TABLE_ENTRY中的HashLinks了...
雪    币: 38
活跃值: (48)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
风萧兮 1 2010-11-6 21:57
5
0
偶? 对这个 HashLink 成员不是很了解 ---

它指向什么呢 -- 、
雪    币: 38
活跃值: (48)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
风萧兮 1 2010-11-6 22:02
6
0


这是什么意思呢???
雪    币: 359
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
wzanthony 2010-11-7 01:21
7
0
LZ抹自己信息的那段貌似可以直接改DLL实现,不需要在运行状态动态修改。
隐藏DLL还有一种方法就是把DLL直接FreeLibrary掉,呵呵。
呃,我不是在说笑话,我的意思是把DLL的内容复制下来,再把它FreeLibrary掉。
我在别人帖子里面发过,不过貌似没人看这个,可能大家都有自己觉得好用的方法吧。
http://bbs.pediy.com/showthread.php?t=59932&page=4的50L。
雪    币: 38
活跃值: (48)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
风萧兮 1 2010-11-7 01:51
8
0
嗯--直接抹掉真的可以呀~~~

那个 FreeLoadLibry 的我知道些 -
雪    币: 34
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
mszjk 2010-11-7 01:52
9
0
HashLink跟LdrpHashTable有关,谷歌LdrpHashTable
雪    币: 2134
活跃值: (14)
能力值: (RANK:170 )
在线值:
发帖
回帖
粉丝
Aker 4 2010-11-7 13:03
10
0
pe头抹掉才可以防止暴力搜索
雪    币: 38
活跃值: (48)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
风萧兮 1 2010-11-7 14:58
11
0
抹掉PE头 程序执行会出错的 ---

调用某些API的时候 ~~~

现在的这个 dll 就算搜索到了 我觉得也没事儿 --

因为 它还是不知道 我的 dll 的名字 ~~ 找不到 我的磁盘 文件 ~~~
雪    币: 370
活跃值: (15)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
快雪时晴 4 2010-11-7 15:08
12
0
tag: HIDE DLL 隐藏 动态链接库
雪    币: 306
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
tfzxyinhao 2010-11-7 15:25
13
0
楼主能共享下怎么把dll注入进去不被杀软发现的方法吗
雪    币: 394
活跃值: (131)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
jgaoabc 1 2010-11-8 09:24
14
0
学习了,没看懂,标记下
雪    币: 2321
活跃值: (4028)
能力值: ( LV12,RANK:530 )
在线值:
发帖
回帖
粉丝
熊猫正正 9 2010-11-8 09:43
15
0
汇编,I like it~~
雪    币: 9
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
深一海 2010-11-9 21:18
16
0
学习........
雪    币: 38
活跃值: (48)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
风萧兮 1 2010-11-9 23:30
17
0
白旗~
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
longsir 2010-11-10 00:06
18
0
我顶.....................

雪    币: 794
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
Winker 8 2010-11-10 01:34
19
0


隐藏dll模块过xuetr的路过。。。
雪    币: 3166
活跃值: (2291)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
上网鱼 2010-11-10 09:27
20
0
也做过类似的方法。。不过对于资源比较复杂的DLL不知道LZ的这个方法兼容好不。复杂点的似乎要先挂起全部线程才合适
雪    币: 253
活跃值: (169)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
sharenpk 2010-11-21 01:10
21
0
过不了 xuetr ,啥都能看见。。。。。
雪    币: 2371
活跃值: (2237)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
gtict 2010-11-21 04:14
22
0
对文件proc函数还是不理解,,我用MSDN都查不到,网上都是Linux下说明,,咋整
雪    币: 38
活跃值: (48)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
风萧兮 1 2010-11-21 04:21
23
0
你是指 这个“DllEntry        proc        _hInstance,_dwReason,_dwReserved”
吗?

这是 dll 文件的 入口函数
雪    币: 1140
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
reinharddm 2010-11-21 08:13
24
0
暂时水平还不够,看不懂此文章,支持楼主,日后来学习!
雪    币: 171
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
hucaiyu 2010-11-22 03:45
25
0
好像没隐藏成功 查的到
游客
登录 | 注册 方可回帖
返回