- 1、本文档共6页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
输入表隐藏加密的原理和手工实现
输入表隐藏、加密的原理和手工实现
一、前言:现在对输入表的查杀已经成为杀毒软件杀毒的一个重要方面,没有一个杀毒软件不把输入表作为查杀的对象,通常的输入表移位、重建已经不能作为免杀的重要手段,可以说杀毒软件也在逐步进步,而我先前倡导的输入表按序号重建也因为存在系统兼容性问题不能作为输入表免杀的手段。如何改变输入表部分的内容与结构,使其与原先的不同,这就是本文要探讨的问题。
二、目的:通过本文的学习,可以掌握手工导入输入表和手工加密输入表函数的名称的办法,并能学习到汇编语言的精辟。
三、基本知识
在开始之前,我们先来了解二个kernel32.dll的函数的使用方法,即:kernel32.LoadLibraryA和kernel32.GetProcAddress,它们是本文要用到的二个关键函数。具体的函数介绍可以看看这篇文章:《3个脱壳相关的重要函数介绍》/showthread.php?threadid=20230
1、LoadLibraryA函数
LoadLibrary函数是把指定的可执行模块映射进调用进程的地址空间。通俗的说,如程序需要调用ole32.dll里面的CreateStreamOnHGlobal函数,首先应该用LoadLibraryA函数找到ole32.dll的句柄。然后根据这个句柄用GetProcAddress找到CreateStreamOnHGlobal的内存指针。
它有一个参数,即动态链接库名称的内存地址。汇编语言是这样实现的(以前面为例):
PUSH /向ole32.dll名称。
CALL DWORD PTR DS: /LoadLibraryA的内存指针。
结果放在EAX里面,返回值为模块句柄。
2、GetProcAddress函数
GetProcAddress函数返回指定的输出动态链接库内的函数地址。它有二个参数。汇编语言是这样实现的(以前面为例):
PUSH 1001888C //1001888C指向CreateStreamOnHGlobal名称。
PUSH EAX //EAX的值为LoadLibraryA的返回值,即ole32.dll的句柄。
CALL DWORD PTR DS:[1001999C] //1001999C为GetProcAddress函数的内存指针。
结果也放在EAX里面,返回值为DLL输出函数的内存地址。
四、输入表加密工具的原理和优缺点
我在之前的免杀文章中采用了一个加密工具,可以用来加密EXE的输入表,通过这个工具加密之后,整个输入表大部分消失了,只剩下kernel32.dll和它的二个API函数,就是上面介绍的二个,LoadLibraryA函数和GetProcAddress函数。它加密的原理就是采用LoadLibraryA函数和GetProcAddress函数在程序中用代码把加密的输入表DLL的名称以及API函数的名称和内存指针恢复,用汇编语言实现是很简单的。
这个加密工具的缺点是只能加密部分EXE文件(虽然我对加密工具进行了一个修正,但据反映,有些EXE文件还是不能用来加密输入表),不能加密DLL文件。而且用这个工具加密后再通过我的改壳免杀处理服务端的方法已经被瑞星关注了,瑞星就杀在加壳后的输入表GetProcAddress函数上。
五、手工编写输入表隐藏和加密代码
现在开始本文的重点,就是用手工编写代码改变输入表的结构,隐藏部分输入表。我们以Pcshare中的PcMain.dll为例,为什么采用这个做为例子,因为下一个教程我准备出DLL改壳免杀的教程,用这个教程为下一个教程做铺垫。
我做二个示范,分别属于二种情况,一种是隐藏输入表中链接库DLL和其所有API函数,另外一种是只隐藏链接库DLL中的某一个API函数。至于加密函数名称,可以采用我的输出表加密函数名称的办法(双字节异或加密),这里不做介绍了,一般采用隐藏输入表就可以达到免杀的目的。
PcMain.dll中ole32.dll只有一个函数CreateStreamOnHGlobal,把ole32.dll和其CreateStreamOnHGlobal隐藏, 另外隐藏shell32.dll中的ShellExecuteA函数。
1、加空区段。作为代码写入的区域。记住程序原入口点为100116E3。
2、写入代码。一般采用PUSHAD开始,POPAD结束,以避免不必要的错误。同时采用CALL(下一句的地址)和POP结构实现程序的自定位,通过内存的相对位置使程序也能用于DLL文件的输入表隐藏。
我们记下几个内存值:
程序新入口EBPole32.dll名称起始内存地址:1001333C(用C32ASM寻找,再换算
文档评论(0)