如何隐藏导入表

本文探讨了如何隐藏PE文件的导入表,通过修改PE结构并利用LdrLoadDll函数动态加载DLL。通过研究PEB和LDR_DATA_TABLE_ENTRY结构,找到了在没有导入表的情况下调用DLL函数的方法。然而,这种方法在不同操作系统环境下可能存在兼容性问题。
摘要由CSDN通过智能技术生成

当有人问我这个问题的时候,我真的是一脸懵逼,我只知道编译的时候尽量少的引用dll可以减少导入表的量。

后来尝试一个正常的程序,将PE结构的导入表大小和位置全部设置为0:
该程序只负责调用MessageBox(实际是MessaheBoxW,或者MessageBoxA,但是大家都懂,不作区分):
这里写图片描述

正常的导入表

将导入表RVA和大小设置为0

然后运行,炸掉了,很正常:
这里写图片描述

看来不会是一个特别简单的问题。

经过研究,是要通过PEB来自己找了。首先看这个程序依赖的DLL:
这里写图片描述

由于MessageBox是User32.dll导出的,所以,会依赖User32.dll,为了尽量减少DLL依赖,因此重新写一段代码:
重新写的代码
这段代码,设置了入口点,并将编译器优化关掉。

编译后重新看依赖DLL:
这里写图片描述
这里写图片描述

好了至此导入表没了,那我们怎么调用其它的函数呢?
使用OD加载后,查看可执行模块:
这里写图片描述

发现默认就有几个dll。这时候就有一个关键的函数LdrLoadDll,该函数声明如下:

NTSTATUS NTAPI LdrLoadDll(
	IN PWCHAR               PathToFile OPTIONAL,
	IN ULONG                Flags OPTIONAL,
	IN PUNICODE_STRING      ModuleFileName,
	OUT PHANDLE             ModuleHandle);

这个函数和LoadLibrary是一样的效果。这个函数在ntdll.dll中导出:
这里写图片描述

我们能看到,代码就算不依赖任何DLL,程序加载后,还是会有几个DLL会一同加载,而ntdll.dll也在其中;因此思路就有了,只需要程序运行后,找到ntdll.dll然后就能找到LdrLoadDll了。-

##接下来是找ntdll.dll
运行在应用层的程序,通过fs寄存器可以拿到很多

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值