VC隐藏DLL模块函数

以前写的一个隐藏DLL模块函数,记录下来,免得以后需要时难找。

隐藏的方法是把DLL模块的路径从进程的内存中清除掉,不过,还是有方法可以把隐藏的DLL路径找出来的,比如内存暴力搜索等。

隐藏DLL模块的路径后,会存在一些问题,比如你后面想拿DLL的路径,拿不到了,所以在隐藏之前需要把路径保存起来;还有,当程序要Load你隐藏的DLL时,会重新加载这个DLL,因为程序已经无法判断此DLL在此之前是否已经被加载过。

注意:此函数似乎对64位操作系统无效。

//  传入需要隐藏的DLL模块句柄
NTSTATUS HideModule(IN HMODULE hModule)
{
    NTSTATUS                  status 
=   - 1 ;
    DWORD                     dwReturnLen 
=   0 ;
    PLIST_ENTRY               ListHead 
=  NULL;
    PLIST_ENTRY               Current 
=  NULL;
    PPEB_LDR_DATA             pLdr 
=  NULL;
    PLDR_DATA_TABLE_ENTRY     pstEntry 
=  NULL;
    PROCESS_BASIC_INFORMATION processInfo;

    ZeroMemory(
& processInfo,  sizeof (PROCESS_BASIC_INFORMATION));
    status 
=  ZwQueryInformationProcess(
        GetCurrentProcess(), 
        ProcessBasicInformation, 
        
& processInfo, 
        
sizeof (PROCESS_BASIC_INFORMATION), 
        
& dwReturnLen);
    
if  ( ! NT_SUCCESS(status))
        
return  status;

    pLdr 
=  (PPEB_LDR_DATA)( * (PULONG)((ULONG)processInfo.PebBaseAddress  +   0x00C ));

    ListHead 
=   & pLdr -> InLoadOrderModuleList;
    Current 
=  ListHead -> Blink;
    
while  (Current  !=  ListHead)
    {
        pstEntry 
=  CONTAINING_RECORD(Current, LDR_DATA_TABLE_ENTRY, InLoadOrderLinks);
        
if  (pstEntry -> DllBase  ==  hModule)
        {
            
if  (pstEntry -> FullDllName.Length  !=   0 )
            {
                ZeroMemory(pstEntry
-> FullDllName.Buffer, pstEntry -> FullDllName.Length);
                pstEntry
-> FullDllName.Length  =   0 ;
                pstEntry
-> FullDllName.MaximumLength  =   sizeof (WCHAR);
                pstEntry
-> BaseDllName.Length  =   0 ;
                pstEntry
-> BaseDllName.MaximumLength  =   sizeof (WCHAR);
            }

            status 
=  STATUS_SUCCESS;
            
break ;
        }

        Current 
=  pstEntry -> InLoadOrderLinks.Blink;
    }

    
return  status;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值