在.Net程序中注入代码的方法和装置的制作方法_第1页
在.Net程序中注入代码的方法和装置的制作方法_第2页
在.Net程序中注入代码的方法和装置的制作方法_第3页
在.Net程序中注入代码的方法和装置的制作方法_第4页
在.Net程序中注入代码的方法和装置的制作方法_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

在.Net程序中注入代码的方法和装置的制作方法专利名称::在.Net程序中注入代码的方法和装置的制作方法技术领域::本发明涉及信息安全领域,特别涉及一种在.Net程序中注入代码的方法和装置。背景技术::.Net是微软的新一代技术平台,是全新的基于互联网的跨语言软件开发平台,顺应了当今软件工业分布式计算、面向组件、企业级应用、软件服务化和以Web为中心等大趋势。.Net并非开发语言,但是在.Net开发平台上可以支持多门开发语言,如C#语言丄++、VisualBasic、Jscript等。.Net程序的编译分为两个阶段,首先高级语言的.Net程序被编译成一种称作IL(中间代码)的中间语言,然后将IL编译成机器语言。与高级语言相比,IL更像是机器语言,然而,IL却包含一些抽象概念,如类和异常等,这也是这种语言被称为中间语言的原因。现有技术在.Net程序中注入代码时,通常先将.Net程序的EXE文件反编译成IL代码,然后插入IL代码,如加解密函数的IL代码,最后再编译成.Net程序。该方法需要经过反编译和编译的过程,复杂繁琐,效率较低,兼容性差,而且对.Net程序的限制比较多。比如,不能在汇编和IL混编的程序VC.NET编译的程序中注入代码。发明内容为了克服现有技术的缺陷,本发明实施例提供了一种在.Net程序中注入代码的方法和装置。所述技术方案如下—种在.Net程序中注入代码的方法,所述方法包括在.Net可执行文件的引入表中写入待注入代码的信息;在所述.Net可执行文件的导入地址表IAT中添加待注入代码的地址,构建成新的IAT;将所述.Net可执行文件的入口点偏移地址修改为所述新的IAT的地址;修改所述.Net可执行文件中元数据表头中的标记,使得所述.Net可执行文件在执行时满足认证要求。在导入地址表IAT中添加待注入代码的地址,构建成新的IAT,具体包括启用一个新的地址,将所述.Net可执行文件的导入地址表IAT的内容复制到所述新的地址中;在复制的内容之后添加待注入代码的地址,构建成新的IAT,所述新的IAT的地址为所述新的地址。修改所述.Net可执行文件中元数据表头中的标记,使得所述.Net可执行文件在执行时满足认证要求,具体包括将所述.Net可执行文件中元数据表头中的标记修改为0,使得所述.Net可执行文件在执行时满足认证要求。在.Net可执行文件的引入表中写入待注入代码的信息之前,还包括将.Net程序原码编译成.Net可执行文件。所述信息包括所述待注入代码的引擎动态链接库和所述待注入代码对应的函数。—种在.Net程序中注入代码的装置,所述装置包括写入模块,用于在.Net可执行文件的引入表中写入待注入代码的信息;构建模块,用于在所述.Net可执行文件的导入地址表IAT中添加待注入代码的地址,构建成新的IAT,将所述.Net可执行文件的入口点偏移地址修改为所述新的IAT的地址;修改模块,用于修改所述.Net可执行文件中元数据表头中的标记,使得所述.Net可执行文件在执行时满足认证要求。所述构建模块具体包括构建单元,用于启用一个新的地址,将所述.Net可执行文件的导入地址表IAT的内容复制到所述新的地址中,在复制的内容之后添加待注入代码的地址,构建成新的IAT,所述新的IAT的地址为所述新的地址。所述修改模块具体包括修改单元,用于将所述.Net可执行文件中元数据表头中的标记修改为0,使得所述.Net可执行文件在执行时满足认证要求。所述装置还包括编译模块,用于在所述写入模块在.Net可执行文件的引入表中写入待注入代码的信息之前,将.Net程序原码编译成.Net可执行文件。所述信息包括所述待注入代码的引擎动态链接库和所述待注入代码对应的函数。本发明实施例提供的上述技术方案,实现了在.Net可执行文件中注入代码,抛弃了对汇编和反汇编工具的依赖,容易实现,解决了.Net可执行文件注入代码效率低、稳定性和兼容性差的问题。图1是本发明实施例1提供的一种在.Net程序中注入代码的方法流程图;图2是本发明实施例1提供的另一种在.Net程序中注入代码的方法流程图;图3是本发明实施例2提供的在.Net程序中注入代码的装置结构图。具体实施例方式为使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明实施方式作进一步地详细描述。实施例1参见图l,本实施例提供了一种在.Net程序中注入代码的方法,包括步骤101:在.Net可执行文件的引入表中写入待注入代码的信息;步骤102:在.Net可执行文件的导入地址表IAT中添加待注入代码的信息的地址,构建成新的IAT;步骤103:将.Net可执行文件的入口点偏移地址修改为新的IAT的地址;步骤104:修改.Net可执行文件中元数据表头中的标记,使得.Net可执行文件在执行时满足认证要求。本发明实施例中,待注入代码是用户根据需要预先设定的,具体内容本发明实施例对此不做限定。通常设置为函数,可以为一个,也可以为多个。下面以待注入代码为一个加解密函数为例,具体说明上述方法。参见图2,本实施例提供的上述方法,可以具体包括步骤201:对.Net程序原码进行编译,得到.Net程序原码的可执行文件。其中,.Net程序原码的编译分为两个阶段,首先是将高级语言.Net程序原码编译成一种IL代码,再将IL代码编译成可执行文件。通常,编译后得到的.Net可执行文件中包含有如下信息标准的可执行文件信息、区块表和元数据表等。其中,标准的可执行文件信息是指可执行文件中标准的PE(PortableExecutable,可移植的可执行文件)文件头和区块表。该PE文件头可以用来识别当前文件是否为可执行文件,区块表是用来存放代码、资源、数据等,元数据表也可以位于区块表中,用来存放各种.Net数据,如类、参数和函数等等。例如,有一个.Net程序原码,内容如下namespaceConsoleAppclassProgramstaticvoidMain(string[]args)Stringstr=〃Thisisatest!Console.WriteLine(str);将上述.Net程序原码编译后得到可执行文件ConsoleApp.exe,该可执行文件的组成如下表所示表1tableseeoriginaldocumentpage6tableseeoriginaldocumentpage7其中,DosHeader禾口NTHeader为PE文件头;SectionHeaders为区块表头;区块表头下面的内容为区块表,存放有引入表、输出表、资源表、代码等信息;CLRHeader为元数据表头;MetaTables为元数据表。弓l入表包括ImportPages禾口ImportInformation。输出表包括-ExportPages禾口ExportInformation。资源表包括ResourcePages禾口ResourceInformation。无用区块表在表1中未示出。.Net程序原码的可执行文件的引入表是PE文件格式中的一个概念,它描述了PE文件中引入的其它关联DLL(DynamicLinkLibrary,动态链接库)以及DLL中的函数。其中,DLL是作为共享函数库的可执行文件为动态链接提供的一种方法,使进程可以调用不属于其可执行代码的函数。函数的可执行代码位于一个DLL中,该DLL包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。DLL还有助于共享数据和资源。多个应用程序可同时访问内存中单个DLL副本的内容。DLL是一个包含可由多个程序同时使用的代码和数据的库。通过使用DLL,程序可以实现模块化,由相对独立的组件组成。例如,一个计帐程序可以按模块来销售,可以在运行时将各个模块加载到主程序中。因为模块是彼此独立的,所以程序的加载速度更快,而且模块只在相应的功能被请求时才加载。步骤202:在.Net可执行文件的引入表中写入待注入代码的信息,该信息包括待注入代码的引擎动态链接库和待注入代码对应的函数。以上述可执行文件ConsoleApp.exe为例,其已引入了一个外部的DLL:mscoree.dl1,且引入了该mscoree.dl1中的一个输出函数_CorExeMain,该可执行文件ConsoleApp.exe的引入表具体如下[ImportTablesDllNameOriginaFirstTh皿kTimeDateStampForwarderChainNamemscoree.dll0000A23000000000000000000000A24CFirstTh皿kTh皿kRVATh皿kOffsetTh皿kValueHintApiName0000A2280000A230000068300000A23E0000_CorExeMain引入表中的上述信息均为mscoree.dll的相关信息,其中包括引入的外部DLL库的名称mscoree.dll,以及引入的函数的名称CorExeMain等等。其中,mscoree.dl1是NetFramework相关组件,该文件是一个浏览器插件(BHO),每次当用户打开互联网浏览器时它都会自动打开及启动。BHO因为会被认定为浏览器本身,所以都不会被个人防火墙所阻挡,广告和间谍程序都会利用到这个形式。_CorExeMain函数用来指示Windows加载程序在可执行映像中查找入口点。本实施例以待注入代码为Startup函数为例进行说明,该Startup函数的引擎链接库为Engine,dll,则在上述引入表中加入该待注入代码的相关信息,得到如下的引入表ImportTablesJDllNameOriginaFirstThunkTimeDateStampForwarderChainNamemscoree.dllEngine,dllFirstTh皿k0000A2280000B6120000A2300000B5C0ThunkRVA0000A2300000B5C0上述Startup函数的形式可以如下B00L在这里实现本函数的功能,如加解密功能;0000A24C0000B602Th皿kOffsetTh皿kValueHintApiName00006830000098300000A23E0000B5CE00000000_CorExeMainStartupreturnTRUE;上述Startup函数的DLL库具体如下B00LAPIENTRYDllMain(MODULEhModule,DWORDulreasonforcall,LPVOIDlpReserved)switch(ul_reason_for—call)caseDLL_PROCESS_ATTACH:{breakjcaseDLL_THREAD_ATTACH:caseDLL_THREAD_DETACH:caseDLL_PR0CESS_DETACH:breakjreturnTRUE;步骤203:用上述.Net可执行文件的IAT(ImportAddressTable,导入地址表)和待注入代码的地址,构建新的IAT,IAT中描述了.Net可执行文件所有引用的导入函数的真实地址。导入函数是指被.Net程序调用但其执行代码又不在.Net程序中的函数,这些函数的代码位于一个或者多个DLL中,当.Net可执行文件被装入内存的时候,Windows装载器才将该DLL装入,并将调用导入函数的指令和该函数实际所处的地址联系起来,完成动态链接。其中,将调用导入函数的指令和该函数实际所处的地址联系起来,就是依靠IAT来完成的。本实施例中,由于要在.Net可执行文件中注入代码,因此,需要在IAT中添加待注入代码的地址。对于上述例子而言,需要在IAT中添加函数Startup的地址,以便于后续调用该函数时完成该函数的关联。其中,原来的IAT中仅包含了.Net可执行文件引入的输出函数—CorExeMain的地址,具体如下Address3EA2000000000000在该IAT中添加函数Startup的地址后,得到的新的IAT具体如下[O川]Address3EA20000CEB5000000000000通常,由于原有的IAT占用的存储空间是大小固定的,无法直接将Startup函数的地址添加到该IAT中,因此,采用如下方法构建新的IAT:启用一个新的地址,即开辟一块新的存储空间,将.Net可执行文件的原有的IAT的内容复制到该新的地址中,在复制的内容之后添加待注入代码的地址,构建成新的IAT,该新的IAT的地址就是上述启用的新的地址。例如,原有IAT存储于地址0X2000,长度为4个字节,启用一个新的地址0X5000,长度为8个字节,先将原有IAT中的内容共4个字节复制到地址0X5000中,然后在其后添加Startup函数的地址占用4个字节,则得到8个字节的新的IAT,该新的IAT的地址为0X5000。原有的IAT则弃用。步骤204:将.Net可执行文件的入口点偏移地址修改为上述新的IAT的地址。其中,.Net可执行文件的入口点偏移地址指向的是IAT的地址,由于已构建了新的IAT,放弃了原有的IAT,且新的IAT的地址不再是原有IAT的地址,因此,需要将.Net可执行文件的入口点偏移地址修改为新的IAT的地址,从而保证.Net可执行文件正常的运行。本实施例中,将.Net可执行文件的入口点偏移地址修改为新的IAT的地址,其代码实现具体如下/氺EntryPoint氺/IMAGE_NT_HEADERS*pNtHeader=NULL;pNtHeader=RtllmageNtHeader(pvBase,dwSize);PBYTEpEntryPoint=亂L;pEntryPoint=RtllmageRvaToVa(p腿eader,pvBase,pNtHeader->OptionalHeader.AddressOfEntryPoint,0);pEntryPoint+=2;/氺FF25氺/DWORDdwEEIAT=0x400000+RtlGetlatRva();0128]memcpy(pEntryPoint,(PBYTE)&dwEEIAT,4);0129]步骤205:将.Net可执行文件中元数据表头CLRHeader数据结构中的标记FLAGS的值设置为0,使得.Net可执行文件在执行时满足微软认证要求。0130]其中,CLRHeader是.Net可执行文件中的元数据表头,是一种数据结构,用来描述元数据信息,当其中的FLAGS的值为1时,表示ILONLY,即只存在IL代码,当该FLAGS的值为0时,表示混合编码程序集,可以保证.Net可执行文件在执行时满足微软的认证要求。0131]上述修改FLAGS值的具体代码实现如下/氺CorFlags氺/IMAGE_C0R20_HEADER*pCor=NULL;pCor=RtllmageCorHeaderForPE(pvBase,dwSize);if(!pCor){_LastError=RESULT_META_DECODER_FAILD;returnFALSE;0132]0133]0134]0135]0136]0137]0138]0139]IL0NLY)0140]0141]IL_LIBR0142]0143]0144]if((pCor->Flags&C0MIMAGE_FLAGS_IL0NLY):pCor->Flags'=C0MIMAGE_FLAGS_IL0NLY;if((pCor->Flags&COMIMAGE_FLAGS_IL_LIBRARY)C0MIMAGEFLAGSCOMIMAGEFLAGSARY)pCor->Flags=COMIMAGE_FLAGS_IL_LIBRARY;经过上述步骤已完成向.Net程序注入代码,且可以保证注入代码后的.Net可执行文件可以正常运行。0145]实施例20146]参见图3,本实施例提供了一种在.Net程序中注入代码的装置,包括0147]写入模块301,用于在.Net可执行文件的引入表中写入待注入代码的信息;0148]构建模块302,用于在.Net可执行文件的导入地址表IAT中添加待注入代码的地吐,构建成新的IAT,将.Net可执行文件的入口点偏移地址修改为新的IAT的地址;0149]修改模块303,用于修改.Net可执行文件中元数据表头中的标记,使得.Net可执行文件在执行时满足认证要求。0150]本实施例中,所述信息包括待注入代码的引擎动态链接库和待注入代码对应的函数。0151]其中,构建模块302具体包括0152]构建单元,用于启用一个新的地址,将.Net可执行文件的导入地址表IAT的内容复制到新的地址中,在复制的内容之后添加待注入代码的地址,构建成新的IAT,新的IAT的地址为新的地址。0153]修改模块303具体包括0154]修改单元,用于将.Net可执行文件中元数据表头中的标记修改为O,使得.Net可执行文件在执行时满足认证要求。进一步地,上装置还可以包括编译模块304,用于在写入模块301在.Net可执行文件的引入表中加入待注入代码的信息之前,将.Net程序原码编译成.Net可执行文件。本发明实施例提供的上述方法和装置,实现了对.Net可执行文件注入代码,抛弃了对汇编和反汇编工具的依赖,容易实现,解决了.Net可执行文件注入代码效率低、稳定性和兼容性差的问题。本发明实施例提供的上述技术方案的全部或部分可以通过程序指令相关的硬件来完成,程序可以存储在可读取的存储介质中,该存储介质包括ROM、RAM、磁碟或者光盘等各种可以存储程序代码的介质。以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。权利要求一种在.Net程序中注入代码的方法,其特征在于,所述方法包括在.Net可执行文件的引入表中写入待注入代码的信息;在所述.Net可执行文件的导入地址表IAT中添加待注入代码的地址,构建成新的IAT;将所述.Net可执行文件的入口点偏移地址修改为所述新的IAT的地址;修改所述.Net可执行文件中元数据表头中的标记,使得所述.Net可执行文件在执行时满足认证要求。2.根据权利要求1所述的方法,其特征在于,在导入地址表IAT中添加待注入代码的地址,构建成新的IAT,具体包括启用一个新的地址,将所述.Net可执行文件的导入地址表IAT的内容复制到所述新的地址中;在复制的内容之后添加待注入代码的地址,构建成新的IAT,所述新的IAT的地址为所述新的地址。3.根据权利要求1所述的方法,其特征在于,修改所述.Net可执行文件中元数据表头中的标记,使得所述.Net可执行文件在执行时满足认证要求,具体包括将所述.Net可执行文件中元数据表头中的标记修改为0,使得所述.Net可执行文件在执行时满足认证要求。4.根据权利要求1所述的方法,其特征在于,在.Net可执行文件的引入表中写入待注入代码的信息之前,还包括将.Net程序原码编译成.Net可执行文件。5.根据权利要求1所述的方法,其特征在于,所述信息包括所

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论