CN103123676B - 一种基于内存的免杀方法 - Google Patents
一种基于内存的免杀方法 Download PDFInfo
- Publication number
- CN103123676B CN103123676B CN201310076880.6A CN201310076880A CN103123676B CN 103123676 B CN103123676 B CN 103123676B CN 201310076880 A CN201310076880 A CN 201310076880A CN 103123676 B CN103123676 B CN 103123676B
- Authority
- CN
- China
- Prior art keywords
- file
- address
- kill
- data
- image
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Landscapes
- Storage Device Security (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明涉及一种基于内存的免杀方法,其步骤包括:1)对需要免杀的PE文件进行去PE化,然后进行加密和压缩处理;2)将加密和压缩处理后的文件以资源的形式合并在正常的PE文件中;3)运行合并后的PE文件,对资源进行解压、解密和恢复PE化,并按PE文件格式存储在内存中;4)进行输入表数据填充和重定位数据填充,以修复PE文件;5)运行修复后的PE文件。采用本发明可以绕过现有杀毒软件的查杀机制,达到长期性的免杀效果,成本低,效率高。
Description
技术领域
本发明属于计算机网络安全技术领域,具体涉及一种基于内存的免杀方法,可使文件避免杀毒软件基于特征码进行的查杀。
背景技术
当今杀毒软件的主流技术以特征码检测为主,究其原因,一是该技术研究起始时间最早,发展最为成熟;二是能够有效标识病毒,且基于特征码检测开发的引擎检测效率高,准确性高,因此为大多数防毒软件产商所采用。鉴于此,国内外逐步开展了基于特征码的免杀技术研究。
目前研究成果有十六进制免杀、指令顺序调换法、加冷门壳等技术、以及后来发展起来的变形技术等,大都是对软件本身含有的特征码进行改写或隐藏。
修改特征码,必需对PE文件中包含的特征码进行定位,并根据其所在的位置选择相应的修改策略。PE文件是WINDOWS系统中可执行的文件,全称为PortableExecute,常见的EXE、DLL、OCX、SYS、COM都是PE文件。
传统的定位方法是采用逐步替换法,其思想是将PE文件的一个区段平均分割成N个小区间,每次使用0x00或者0x90替换其中一个小区间,分别进行N次操作。使用该方法定位单一特征码与复合特征码时,需要多次手工操作,尝试覆盖所有特征码范围,但在进行精确定位的进程中相互之间的特征码又会产生干扰,以至于无法正确地定位到特征码。传统的逐块替换法在定位多重特征码上存在不足,因此,需要对该方法进行改进,以适应于定位不同类型的特征码。
现有技术中基于特征码的免杀方法具有明显的不足:一方面,免杀持久度不够,大多数在1周内又需要重新修改特征码;另一方面此类免杀只针对单一的特定软件进行免杀,并不适合批量处理。
发明内容
本发明的目的在于针对上述问题,提供一种基于内存的免杀方法,可使文件绕过现有杀毒软件的查杀机制,其达到免杀后的代码具有持久性,不易被发现。
为实现上述目的,本发明采用如下技术方案:
一种基于内存的免杀方法,其步骤包括:
1)对需要免杀的PE文件进行去PE化,然后进行加密和压缩处理;
2)将加密和压缩处理后的文件以资源的形式合并在在正常的PE文件中;
3)运行合并后的PE文件,对资源进行解压、解密和恢复PE化,并按PE文件格式存储在内存中;
4)进行输入表数据填充和重定位数据填充,以修复PE文件;
5)运行修复后的PE文件。
进一步地,所述去PE化包括去掉PE头和DOS头,所述恢复PE化包括恢复PE头和DOS头。具体实施时,可以通过对需要免杀的PE文件的前2个字节清0(固定值为“MZ”)实现去PE化,进而通过在资源中的前2个字节中加上固定值(MZ)实现恢复PE化。
进一步地,采用RC4算法进行所述加密和解密处理,采用zlib算法进行所述压缩和解压处理。
进一步地,所述输入表数据填充是在输入表结构中填充需要的DLL函数的地址。具体的输入表数据填充方法是:首先搜索OriginalFirstThunk,找到之后加载程序迭代搜索数组中的每个指针,找到每个IMAGE_IMPORT_BY_NAME结构所指向的输入函数的地址,然后用函数真正入口地址来替代FirstThunk数组中的入口,进行数据填充;其中OriginalFirstThunk是32位RVA,指向一个以0结尾的IMAGE_THUNK_DATAs数组;FirstThunk是指向IMAGE_THUNK_DATAs数组的32位RVA,IMAGE_IMPORT_BY_NAME是指一个函数名的结构体,包括2个字节的序号和函数名。
进一步地,每个重定位数据是16位的,包括低12位的重定位位置和高4位的重定位类型。具体的重定位数据填充的方法是:通过相对的虚拟地址加上PE的加载基地址得到一个实际地址,该地址存放着要进行重定位处理的数据,从该地址中取出数据,并用取出的数据减去PE头中的镜像基址,再加上PE的加载基地址。
本发明的基于内存的免杀方法,首先对需要免杀的PE文件进行压缩和加密处理,然后合并在正常的文件中,正常文件运行后先解压解密免杀后的PE文件,再通过PE加载技术加载解密后的PE文件。该方法中,存储在磁盘中的文件都是去PE化和加密压缩的,杀毒软件无法去检测,只有在程序运行时才在内存中对文件进行恢复,因此可以绕过现有杀毒软件的查杀机制,达到长期性的免杀作用,而且具有防云查杀、内存查杀的作用,对任何一个需要免杀的软件都有效果,成本低,效率高。
附图说明
图1为本发明实施例的基于内存的免杀方法的处理流程图。
图2是本发明实施例的PE文件格式示意图。
图3是本发明实施例的输入表格式图。
具体实施方式
下面通过具体实施例并配合附图,对本发明做详细的说明。
本实施例的基于内存的免杀方法,其处理流程如图1所示,对具体实施步骤如下:
1)对需要免杀的PE文件(被杀毒软件查杀的病毒或者木马)的前2个字节清0(固定值为”MZ”),即可达去PE化的目的,然后用RC4加密、zlib压缩(RC4和zlib算法为现有技术),最后以资源的形式合并在正常的PE文件(另外一个没有被杀毒软件查杀的PE文件)中。需说明的是,本发明也可以采用其它的加密方法和压缩方法。
2)程序运行后,用zlib解压资源、RC4解密数据,最后在资源中的前2个字节中加上“MZ”,即恢复PE化,按照图2所示的PE文件格式布局存储在内存中。这里要注意的是,PE文件中的每个段在内存中一般是按照0x400对齐存储的。
3)按照图3所示的输入表结构填充需要的DLL函数的地址。
每个PE文件都有导出函数,这些函数不会直接被执行,当一个程序(EXE)运行时,导入函数是被程序调用执行的,其执行的代码是不在主程序(EXE)中的一小部分函数,其真正的代码却在DLL文件中。那么EXE主程序是如何找到这些需要导入的函数呢?这就要归结于“输入表”了。输入表就相当于EXE文件与DLL文件沟通的钥匙,形象的可以比喻成两个城市之间交流的高速公路,所有的导入函数信息都会写入输入表中,在PE文件映射到内存后,windows将相应的DLL文件装入,EXE文件通过“输入表”找到相应的DLL中的导入函数,从而完成程序的正常运行,这一动态连接的过程都是由“输入表”参与的。每个被PE文件链接进来的DLL文件都分别对应一个IID数组结构。在这个IID数组中,并没有指出有多少个项(就是没有明确指明有多少个链接文件),但它最后是以一个全为NULL(0)的IID作为结束的标志。
在图3所示的输入表结构中,一个IMAGE_IMPORT_DESCRIPTOR是一个具有如表1所示元素的结构:
表1.IMAGE_IMPORT_DESCRIPTOR的结构
OriginalFirstThunk32位RVA,指向一个以0结尾的IMAGE_THUNK_DATAs数组。每个成员描述一个输入函数。
TimeDateStamp32位时间戳。
ForwarderChain输入函数第一个转发链的32位索引
Name指向DLL名字的32位RVA。
FirstThunk指向IMAGE_THUNK_DATAs数组的32位RVA,它是输入地址表的一部分,将发生变化。Thunk的意思就是查找,虚实变换的意思。
OriginalFirstThunk和FirstThunk是两个类型为IMAGE_THUNK_DATA的数组,它是一个指针大小的联合(union)类型。图3中每一个IMAGE_THUNK_DATA结构定义一个导入函数信息,然后数组最后以一个内容为0的IMAGE_THUNK_DATA结构作为结束标志。IMAGE_THUNK_DATA的结构如表2所示:
表2.IMAGE_THUNK_DATA的结构
可以看出由于是union结构,所以IMAGE_THUNK_DATA事实上是一个双字大小。
图3中,IMAGE_IMPORT_BY_NAME的结构如表3所示。结构中的Hint字段也表示函数的序号,不过这个字段是可选的,有些编译器总是将它设置为0,Name字段定义了导入函数的名称字符串,这是一个以0为结尾的字符串。
表3.IMAGE_IMPORT_BY_NAME的结构
输入表填充方法:首先搜索OriginalFirstThunk,找到之后加载程序迭代搜索数组中的每个指针,找到每个IMAGE_IMPORT_BY_NAME结构所指向的输入函数的地址,然后用函数真正入口地址来替代FirstThunk数组中的一个入口,因此我们称为输入地址表(IAT)。
4)重定位数据填充。
重定位目录是一系列块,每个块包括重定位信息针对4K的映象。一个块起始于一个'IMAGE_BASE_RELOCATION'结构,如表4所示,包括32位的VirtualAddress和32位的SizeOfBlock.随后是实际的重定位数据每个都是16位的。VirtualAddress是本块要应用的基地址。SizeOfBlock是整个块的大小。后面的重定位的数目是(SizeOfBlock-sizeof(IMAGE_BASE_RELOCATION))/2,重定位信息以VirtualAddress=0的IMAGE_BASE_RELOCATION结构结束。
表4.IMAGE_BASE_RELOCATION的结构
每个16位重定位信息包括低12位的重定位位置和高4位的重定位类型。要得到重定位的RVA,IMAGE_BASE_RELOCATION'的'VirtualAddress'需要加上12位位置偏移量,类型是表5中所示的类型之一:
表5.位置偏移量类型
重定位表填充方法:要进行重定位处理的数据RVA=VirturalAdress+RelocData&0xfff,找到第一块的重定位数据,通过相对的虚拟地址,加上PE的加载基地址就得了在内存中的真实地址了,然后把要修正的数据减去PE头中的镜像基址,再加上当前加载基址就完成了(用公式表示为:要修正的数据-PE镜像基址+当前加载基址)。
5)运行PE文件。
下面以冰河木马为例,说明应用上述方法的具体处理流程:
1)用控制端生成一个木马。
2)用二进制文件如winhex工具打开文件,把前两个字节“MZ”清0。即去PE化。
3)用zlib工具压缩经过第二步处理过的木马。
4)用rc4工具加密第三步处理过的木马。
5)打开vs2008创建一个工程,工程名为Reload。
6)在reload工程中找到添加资源选项,第4)步处理过的木马以资源的形式存放。
7)编写输入表填充代码。
8)编写重定位代码。
9)编译生成一个新的PE文件。
10)双击新生成的PE文件。
11)进入MAIN函数后,通过API函数定位到资源,并用RC4解密资源。
12)用zlib解压资源,在资源的前2个字节加“MZ”,即恢复PE化。
13)进入填充输入表的函数,填充需要的导入函数。
14)进入重定位的函数,恢复需要重定位的数据。
15)进入恢复后的数据的入口点。
16)运行PE文件。
以上实施例仅用以说明本发明的技术方案而非对其进行限制,本领域的普通技术人员可以对本发明的技术方案进行修改或者等同替换,而不脱离本发明的精神和范围,本发明的保护范围应以权利要求所述为准。
Claims (5)
1.一种基于内存的免杀方法,其步骤包括:
1)对需要免杀的PE文件进行去PE化,然后进行加密和压缩处理;
2)将加密和压缩处理后的文件以资源的形式合并在正常的PE文件中;该步骤通过对需要免杀的PE文件的前2个字节清0实现去PE化;
3)运行合并后的PE文件,对资源进行解压、解密和恢复PE化,并按PE文件格式存储在内存中;该步骤通过在资源中的前2个字节中加上固定值实现恢复PE化;
4)进行输入表数据填充和重定位数据填充,以修复PE文件;
所述输入表数据填充是在输入表结构中填充需要的DLL函数的地址,具体填充方法是:首先搜索OriginalFirstThunk,找到之后加载程序迭代搜索数组中的每个指针,找到每个IMAGE_IMPORT_BY_NAME结构所指向的输入函数的地址,然后用函数真正入口地址来替代FirstThunk数组中的一个入口,进行数据填充;其中OriginalFirstThunk是32位RVA,指向一个以0结尾的IMAGE_THUNK_DATAs数组;FirstThunk是指向IMAGE_THUNK_DATAs数组的32位RVA;IMAGE_IMPORT_BY_NAME是指一个函数名的结构体,包括2个字节的序号和函数名;
所述重定位数据填充的方法是:通过相对的虚拟地址加上PE的加载基地址得到一个实际地址,该地址存放着要进行重定位处理的数据,从该地址中取出数据,并用取出的数据减去PE头中的镜像基址,再加上PE的加载基地址;
5)运行修复后的PE文件。
2.如权利要求1所述的方法,其特征在于:采用RC4算法进行所述加密和解密处理,采用zlib算法进行所述压缩和解压处理。
3.如权利要求1所述的方法,其特征在于:PE文件中的每个段在内存中按照0x400对齐存储。
4.如权利要求1所述的方法,其特征在于:所述输入表数据填充是在输入表结构中填充需要的DLL函数的地址。
5.如权利要求1所述的方法,其特征在于:每个重定位数据是16位的,包括低12位的重定位位置和高4位的重定位类型。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310076880.6A CN103123676B (zh) | 2013-03-11 | 2013-03-11 | 一种基于内存的免杀方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310076880.6A CN103123676B (zh) | 2013-03-11 | 2013-03-11 | 一种基于内存的免杀方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN103123676A CN103123676A (zh) | 2013-05-29 |
CN103123676B true CN103123676B (zh) | 2015-11-18 |
Family
ID=48454651
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201310076880.6A Active CN103123676B (zh) | 2013-03-11 | 2013-03-11 | 一种基于内存的免杀方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN103123676B (zh) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103824020B (zh) * | 2014-02-20 | 2017-10-24 | 北京深思数盾科技股份有限公司 | 自动实现软件程序免杀的方法 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101504656B (zh) * | 2009-03-26 | 2011-04-13 | 成都磐石软件有限责任公司 | 一种pe文件代码合并执行方法 |
CN102611732A (zh) * | 2011-11-25 | 2012-07-25 | 无锡华御信息技术有限公司 | 一种基于b/s架构的加密文档外发控制系统及方法 |
Family Cites Families (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7765410B2 (en) * | 2004-11-08 | 2010-07-27 | Microsoft Corporation | System and method of aggregating the knowledge base of antivirus software applications |
JPWO2010140222A1 (ja) * | 2009-06-02 | 2012-11-15 | 富士通株式会社 | 情報処理システム、管理装置および情報処理方法 |
-
2013
- 2013-03-11 CN CN201310076880.6A patent/CN103123676B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101504656B (zh) * | 2009-03-26 | 2011-04-13 | 成都磐石软件有限责任公司 | 一种pe文件代码合并执行方法 |
CN102611732A (zh) * | 2011-11-25 | 2012-07-25 | 无锡华御信息技术有限公司 | 一种基于b/s架构的加密文档外发控制系统及方法 |
Also Published As
Publication number | Publication date |
---|---|
CN103123676A (zh) | 2013-05-29 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN108491235B (zh) | 结合动态加载和函数Native化的DEX保护方法 | |
CN104462990B (zh) | 字符串加解密方法和装置 | |
CN104346274B (zh) | 程序调试器及一种程序的调试方法 | |
CN106126981A (zh) | 基于虚拟函数表替换的软件安全防护方法 | |
TW200841209A (en) | Obfuscating computer program code | |
CN104079613A (zh) | 用于多租户间共享应用程序对象的方法和系统 | |
CN104091100A (zh) | 一种基于编译中间结果的软件保护方法 | |
CN105787305A (zh) | 一种抵抗符号执行和污点分析的软件保护方法 | |
KR101861341B1 (ko) | 애플리케이션 코드의 역난독화 장치 및 이를 이용한 애플리케이션 코드의 역난독화 방법 | |
CN101964040B (zh) | 一种基于PE Loader的软件加壳保护方法 | |
CN107273723B (zh) | 一种基于so文件加壳的Android平台应用软件保护方法 | |
KR20140001864A (ko) | 타일 통신 연산자 | |
EP3867784B1 (en) | Applying security mitigation measures for stack corruption exploitation in intermediate code files | |
CN105844210B (zh) | 硬件有效的指纹识别 | |
CN112035857A (zh) | 数据保护方法、装置、设备及介质 | |
CN108108617B (zh) | 基于静态指令流跟踪的导入表修复方法及装置 | |
KR101536920B1 (ko) | Arm 프로세서 기반의 파일 난독화 방법 | |
CN103123676B (zh) | 一种基于内存的免杀方法 | |
CN105447342A (zh) | 脚本加密方法、解密方法及引擎 | |
CN106909672B (zh) | 一种基于wpf技术生成及加载特定项目文件的方法 | |
TWI695287B (zh) | 用於保護碼的方法、電腦程式產品和系統 | |
CN104615935A (zh) | 一种面向Xen虚拟化平台的隐藏方法 | |
CN101887500B (zh) | 基于标签的程序控制流深度混淆方法 | |
CN104866294A (zh) | 一种扩展Android软件功能的方法及装置 | |
WO2017063323A1 (zh) | 基于重构技术实现敏感数据云端锁定的方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant |