CN106648749B - 一种可执行程序动态调用方法及系统 - Google Patents
一种可执行程序动态调用方法及系统 Download PDFInfo
- Publication number
- CN106648749B CN106648749B CN201611040855.2A CN201611040855A CN106648749B CN 106648749 B CN106648749 B CN 106648749B CN 201611040855 A CN201611040855 A CN 201611040855A CN 106648749 B CN106648749 B CN 106648749B
- Authority
- CN
- China
- Prior art keywords
- program
- memory
- executable program
- host
- address
- 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
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/445—Program loading or initiating
- G06F9/44521—Dynamic linking or loading; Link editing at or after load time, e.g. Java class loading
Abstract
本发明公开了一种将可执行程序注入宿主进程的方法,其包括:运行宿主程序,由宿主程序进程将预先注入的动态链接库文件调入内存;执行该动态链接库内预置的加载模块,由其以操作系统所兼容的方式加载所述可执行程序至内存中;启动运行该可执行程序的内存镜像。通过本发明可以让注入的可执行程序在宿主进程中独立运行;这样就解除了微软对模块加载只限定动态链接库文件的限定;同时,还可以绕过驱动保护的进程白名单检测。
Description
技术领域
本发明涉及计算机技术领域,特别涉及一种可执行程序动态调用方法及系统。
背景技术
随着WINDOWS应用的飞速发展,WINDOWS API编程得到了广泛的普及和应用,DLL注入到宿主进程可以实现应用程序主动跨进程访问其他进程数据,从而控制宿主进程。具体的,当需要操作的对象的数据不在当前进程内,或者需要编写一些函数用于增加宿主进程功能,都可以通过注入DLL文件来实现。
但是,可执行EXE程序文件无法像DLL文件那样被Windows操作系统模块化进行注入,因为驱动保护禁止其他进程对保护进程内存进行读写,现有的是通过编写驱动程序绕过防护,这样做很麻烦而且实现起来很费劲,通用性也不高。用驱动方法过保护针对不同的保护要写不同的驱动程序,实现起来比较复杂且兼容性很差容易蓝屏。在遇到想把某个exe改成dll方式运行的时候又苦于没有源代码,或者源代码太过复杂难以短时间看懂。
发明内容
为了解决现有技术中的上述问题,本发明实施例提供了一种可执行程序动态调用方法。所述技术方案如下:
本发明提供了一种可执行程序动态调用方法,其包括如下步骤:运行宿主程序,由宿主程序进程将预先注入的动态链接库文件调入内存;执行该动态链接库内预置的加载模块,由其以操作系统所兼容的方式加载所述可执行程序至内存中;启动运行该可执行程序的内存镜像。
进一步,上述本发明的一种实施方式还包括前置步骤:运行第三方工具程序由其进程将所述的动态链接库文件注入到所述宿主程序中。
具体地,上述加载模块以操作系统所兼容的方式加载所述可执行程序至内存的过程包括如下具体步骤:将所述可执行程序的文件从存储单元加载到内存中成为镜像;重定向至该可执行程序内存镜像的运行入口点地址;根据宿主程序修改该可执行程序内存镜像中的不匹配函数。
在一种实施方式中,上述根据宿主程序修改该可执行程序内存镜像中的不匹配函数,包括:借助第三方工具PETooL查看宿主程序的导入表,分析是否需要对其使用的函数进行修复;如果遇到可执行程序与宿主进程同时使用了第三方函数则需查看第三方开发文档判断是否要做防冲突处理。
其中上述重定向至该可执行程序内存镜像的运行入口点地址的步骤包括如下具体步骤:初始化导入地址表;初始化地址重定位表;重新定位该可执行程序内存镜像的运行入口点内存地址。
具体地,上述第三方工具程序是微软提供的远程线程编写注入代码。
本发明还提供一种可执行程序动态调用系统,其包括如下模块:调入模块,运行的宿主程序进程利用该调入模块将预先注入的动态链接库文件调入内存;加载模块,其内预置于所述动态链接库,用于所述动态链接库以操作系统所兼容的方式加载所述可执行程序至内存中;启动模块,用于启动运行该可执行程序的内存镜像。
具体上述加载模块包括:初始化单元:初始化导入地址表,初始化地址重定位表;重定位单元:重新定位该可执行程序内存镜像的运行入口点内存地址。
本发明利用动态链接库内预置的加载模块,由其以操作系统所兼容的方式加载可执行程序至内存中;再启动运行该可执行程序的内存镜像。启动运行该可执行程序的内存镜像后,导致操作系统进程列表中同时包含所述宿主程序、动态链接库以及该可执行程序相应的进程。就可以让注入的可执行程序在宿主进程中独立运行了。这样就解除了微软对模块加载只限定动态链接库文件的限定。同时,还可以绕过驱动保护的进程白名单检测。当注入到指定进程中时,可执行程序可享有和宿主进程同等运行权限。
附图说明
为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本发明一个实施例中提供的将可执行程序注入宿主进程的方法的流程图;
图2是本发明另一个实施例中提供的将可执行程序注入宿主进程的方法的流程图;
图3是本发明另一个实施例中提供的将可执行程序注入宿主进程的方法的流程图;
图4是本发明一个实施例中函数修复时的一个操作界面截图;
图5是本发明一个实施例中函数修复时的一个操作界面截图。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明实施方式作进一步地详细描述。
为了便于描述,首先对本发明实施例所涉及的相关知识进行详细描述。
现有情况下,动态链接库文件可以被注入到某些宿主进程中运行,但是EXE格式的可执行程序不能像动态链接库文件一样直接注入加载到宿主进程中运行,而本发明就是可以利用动态链接库文件将可执行程序加载到宿主进程直接运行。
本发明提供了一种将可执行程序注入宿主进程的方法。参照图1,所述方法,包括:
步骤11:运行宿主程序,由宿主程序进程将预先注入的动态链接库文件调入内存;
步骤12:执行该动态链接库内预置的加载模块,由其以操作系统所兼容的方式加载需要可执行程序至内存中;
步骤13:启动运行该可执行程序的内存镜像。
参照图2,所述方法,还包括一个前置步骤:步骤011:运行第三方工具程序由其进程将所述的动态链接库文件注入到所述宿主程序中;
上述步骤12具体包括以下步骤:
步骤121:将所述可执行程序的文件从存储单元加载到内存中成为镜像;
步骤122:重定向至该可执行程序内存镜像的运行入口点地址;具体地,初始化导入地址表;初始化地址重定位表;重新定位该可执行程序内存镜像的运行入口点内存地址。
其中上述导入地址表(IAT):Import Address Table,由于导入函数就是被程序调用但其执行代码又不在程序中的函数,这些函数的代码位于一个或者多个DLL中.当PE文件被装入内存的时候,Windows装载器才将DLL装入,并将调用导入函数的指令和函数实际所处的地址联系起来(动态连接),这操作就需要导入表完成.其中导入地址表就指示函数实际地址;重定位就是把程序的逻辑地址空间变换成内存中的实际物理地址空间的过程,也就是说在装入时对目标程序中指令和数据的修改过程。他是实现多道程序在内存中同时运行的基础。重定位有两种,分别是动态重定位与静态重定位。
在某些特殊情况下,比如某些宿主程序在启动运行可执行程序时,当可执行程序中的某些函数被调用时会引起冲突,导致程序不能正常调用某些函数,为了让可执行EXE程序能正常运行,则需要修复这些不匹配函数,否则可能导致运行不稳定的问题。根据宿主程序的不同需要修复的的函数也不同;具体参照图3:
所述重定向至该可执行程序内存镜像的运行入口点地址之后,还包括:步骤123:根据宿主程序修改该可执行程序内存镜像中的不匹配函数。
具体地需要修复哪些不匹配函数,以下的实施方式中有详细罗列和描述。
本发明利用动态链接库内预置的加载模块,由其以操作系统所兼容的方式加载可执行程序至内存中;再启动运行该可执行程序的内存镜像。就可以让注入的可执行程序在宿主进程中独立运行了。这样就解除了微软对模块加载只限定动态链接库文件的限定。同时,还可以绕过驱动保护的进程白名单检测。当注入到指定进程中时,可执行程序可享有和宿主进程同等运行权限。通过本发明的运行方法,使操作系统进程列表中同时包含所述宿主程序、动态链接库以及被调用的可执行程序相应的进程。
以下详细地描述上述方法的一种具体实施方式:
主程序:Load_EXE.dll Load_EXE_x64.dll(64位)
运行环境:windows xp以上版本
实现原理如下:
模块化加载可执行EXE程序的动态链接库文件(Load_EXE.dll)需要自己处于宿主进程中。
1、用loadlibary将可执行EXE程序从硬盘加载到进程内存中。(如果是dll文件用这个函数直接就可以运行dll中的代码了,exe程序不具备这个条件,需要手动修改一些相关信息才能启动)。
2、模拟windows加载exe文件的步骤:初始化IAT表,初始化地址重定位表,重新定位exe入口点地址;
3、对exe引用的一些函数进行修复,防止出现访问冲突等问题。
根据目标程序的不同需要修复的的函数也不同,不修复的话运行可能会不稳定,要看目标可执行exe程序调用了哪些冲突的函数;
具体关于函数修复,需要修复的函数主要包含如下:
<1>GetModuleHandleA和GetModuleHandlW函数,当exe调用GetModuleHandle(NULL)如不做处理,返回的是宿主进程的句柄,这样exe就会出现错误,本发明会在启动可执行EXE程序之前会对GetModuleHandle函数中加入代码以区分调用方,根据不同的调用方返回不同的结果;
<2>GetProcAddress函数,可执行EXE程序动态加载系统api导致冲突;这个函数是动态加载api用的,可执行EXE程序会调用该函数动态获得函数地址,这样就会绕过该工具对函数修复;可执行EXE程序在调用没有经过修复的函数时就会导致冲突,所以对GetProcAddress进行修复让其动态加载得到的函数地址依旧是我们的修复后的函数地址;
<3>ExitProcess函数,可执行EXE程序调用该函数时弹出提示,可执行EXE程序在调用该函数后会吧宿主进程也关闭掉,修复这个函数主要目的是提示使用者用我们提供的方法关闭可执行EXE程序;点击工具中的卸载按钮进行关闭;
<4>CreateThread函数,记录并监控可执行EXE程序创建的线程;这是个辅助函数,用于统计可执行EXE程序创建的,现在用于卸载时清理可执行EXE程序创建的线程。
只要做好以上几个函数大部分程序是可以正常运行。如遇到新型函数,需要做防冲突修复,这时需要借助工具(如PETooL),其下载地址是http://down.cncrk.com:8080/soft/keygen/PETool.zip;查看宿主程序的导入表(请参照图4和图5)。如果目标可执行exe程序调用了非微软或不常见的函数,就需要去分析,具体利用sdnhttps://msdn.microsoft.com/zh-cn/library/windows/desktop/dn742476(v=vs.85).aspx分析是否需要对其使用的函数进行修复;如果遇到可执行EXE程序与宿主进程同时使用了第三方函数则需查看第三方开发文档判断是否要做防冲突处理。
4、启动运行可执行EXE程序内存镜像;这样exe程序就可以在宿主进程中像dll格式的动态链接库一样在宿主进程中运行起来了。
阐述完本发明的工作原理,本发明在执行时具体动作工作流程如下:
利用第三注入工具将Load_EXE.dll注入到宿主进程中(如果宿主进程是64位,注入Load_EXE_x64.dll即可)具体注入步骤:
1、先将宿主进程启动以windows的资源管理器为例,先启动资源管理器explorer.exe;
2、利用微软提供的远程线程,编写注入代码将Load_EXE.dll或Load_EXE_x64.dll(依据宿主进程是否为64位而定)注入到explorer.exe进程中,本发明用到的第三方工具为Remotedll.exe,其下载地址为:http://download3.freewarefiles.net/files/RemoteDll.zip;
3、Dll注入到explorer.exe后会弹出exe文件路径选择框,点击浏览:选择要注入的exe文件;点击加载:提示加载成功;选中的exe文件即被加载到目标资源管理器中了。点击卸载注入的exe将会被卸载掉。
该工具不会影响原有程序的功能,原始exe文件依旧可以独立运行。被注入的进程也不会受到影响。
本发明上述实施方式的有益效果如下:
1、抗驱动保护对进程检测
本发明的方法可以把exe程序注入到系统进程中享有和系统进程同等权限,无需对exe做任何改动,从而躲过驱动保护对系统外任意进程对保护对象的读写操作。在对抗驱动保护禁止其他进程对保护进程内存进行读写时用该方式将目标exe注入到系统进程中享有和系统同等权限,可以绕过驱动对进程读写的保护。比起编写驱动程序绕过防护这种方法要简单的多,而且实现更容易;通用性更强。因为用驱动方法过保护针对不同的保护要写不同的驱动程序,实现起来比较复杂且兼容性很差,容易蓝屏。
2、灵活使用exe可执行程序
使得exe格式的可执行程序不仅可以独立运行而且还可以被当作模块注入到任意进程,极大的方便了调试人员对工具的需求。在遇到想把某个exe改成dll方式运行的时候有苦于没有源代码,或者源代码太过复杂难以短时间看懂的情况下,用该工具即可将exe立刻以dll方式运行。
上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。
本领域普通技术人员可以理解实现上述实施例的全部或部分步骤可以通过硬件来完成,也可以通过程序来指令相关的硬件完成,所述的程序可以存储于一种计算机可读存储介质中,上述提到的存储介质可以是只读存储器,磁盘或光盘等。
以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
Claims (9)
1.一种可执行程序动态调用方法,其特征在于,包括如下步骤:
运行宿主程序,由宿主程序进程将预先注入的动态链接库文件调入内存;
执行该动态链接库内预置的加载模块,由其以操作系统所兼容的方式加载到内存中成为镜像,并重新定位所述可执行程序对应的内存镜像的运行入口点地址;
根据重新定位后的运行入口点地址启动运行该可执行程序的内存镜像。
2.根据权利要求1所述的方法,其特征在于,包括前置步骤:
运行第三方工具程序由其进程将所述的动态链接库文件注入到所述宿主程序中。
3.根据权利要求1所述的方法,其特征在于,所述重新定位至该可执行程序内存镜像的运行入口点地址之后,还包括:
根据宿主程序修改该可执行程序内存镜像中的不匹配函数。
4.根据权利要求3所述的方法,其特征在于,所述重新定位至该可执行程序内存镜像的运行入口点地址的步骤包括如下具体步骤:
初始化导入地址表;
初始化地址重定位表;
重新定位该可执行程序内存镜像的运行入口点内存地址。
5.根据权利要求2所述的方法,其特征在于,所述第三方工具程序是微软提供的远程线程编写注入代码。
6.根据权利要求3所述的方法,其特征在于,所述根据宿主程序修改该可执行程序内存镜像中的不匹配函数,包括:
借助第三方工具PETooL查看宿主程序的导入表,分析是否需要对其使用的函数进行修复;
如果遇到可执行程序与宿主进程同时使用了第三方函数则需查看第三方开发文档判断是否要做防冲突处理。
7.根据权利要求1所述的方法,其特征在于,
所述启动运行该可执行程序的内存镜像后,导致操作系统进程列表中同时包含所述宿主程序、动态链接库以及该可执行程序相应的进程。
8.一种可执行程序动态调用系统,其特征在于,包括如下模块:
调入模块,运行的宿主程序进程利用该调入模块将预先注入的动态链接库文件调入内存;
加载模块,其内预置于所述动态链接库,用于所述动态链接库以操作系统所兼容的方式加载到内存中成为镜像,并重新定位所述可执行程序对应的内存镜像的运行入口点地址;
启动模块,用于根据重新定位后的运行入口点地址启动运行该可执行程序的内存镜像。
9.根据权利要求8所述的系统,其特征在于,所述加载模块包括:
初始化单元:初始化导入地址表,初始化地址重定位表;
重定位单元:重新定位该可执行程序内存镜像的运行入口点内存地址。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201611040855.2A CN106648749B (zh) | 2016-11-11 | 2016-11-11 | 一种可执行程序动态调用方法及系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201611040855.2A CN106648749B (zh) | 2016-11-11 | 2016-11-11 | 一种可执行程序动态调用方法及系统 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN106648749A CN106648749A (zh) | 2017-05-10 |
CN106648749B true CN106648749B (zh) | 2019-12-31 |
Family
ID=58812552
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201611040855.2A Active CN106648749B (zh) | 2016-11-11 | 2016-11-11 | 一种可执行程序动态调用方法及系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN106648749B (zh) |
Families Citing this family (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109471671B (zh) * | 2017-09-06 | 2023-03-24 | 武汉斗鱼网络科技有限公司 | 一种程序冷启动方法和系统 |
CN109032605B (zh) * | 2018-07-05 | 2022-09-20 | 北京奇艺世纪科技有限公司 | 一种应用运行方法和装置 |
CN111240773A (zh) * | 2018-11-28 | 2020-06-05 | 中国科学院沈阳自动化研究所 | 一种软件前端与后端连接方法 |
CN111857797B (zh) * | 2020-06-29 | 2022-04-22 | 浪潮电子信息产业股份有限公司 | 一种镜像构建方法、系统及相关装置 |
CN112363779A (zh) * | 2020-11-25 | 2021-02-12 | 王志平 | 一种动态链接程序的安全控制方法 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101626391A (zh) * | 2008-07-08 | 2010-01-13 | 盛大计算机(上海)有限公司 | 网络游戏客户端资源处理方法 |
CN104462951A (zh) * | 2014-12-25 | 2015-03-25 | 黄石一木信息科技有限公司 | 调用重定向机制构建Unix可信平台的方法 |
CN104820612A (zh) * | 2015-05-22 | 2015-08-05 | 网宿科技股份有限公司 | 一种可执行文件的内存执行方法 |
CN105335656A (zh) * | 2015-11-02 | 2016-02-17 | 南京大学 | 基于二进制改写和动态随机化的软件安全增强方法 |
-
2016
- 2016-11-11 CN CN201611040855.2A patent/CN106648749B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101626391A (zh) * | 2008-07-08 | 2010-01-13 | 盛大计算机(上海)有限公司 | 网络游戏客户端资源处理方法 |
CN104462951A (zh) * | 2014-12-25 | 2015-03-25 | 黄石一木信息科技有限公司 | 调用重定向机制构建Unix可信平台的方法 |
CN104820612A (zh) * | 2015-05-22 | 2015-08-05 | 网宿科技股份有限公司 | 一种可执行文件的内存执行方法 |
CN105335656A (zh) * | 2015-11-02 | 2016-02-17 | 南京大学 | 基于二进制改写和动态随机化的软件安全增强方法 |
Also Published As
Publication number | Publication date |
---|---|
CN106648749A (zh) | 2017-05-10 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN106648749B (zh) | 一种可执行程序动态调用方法及系统 | |
US10296437B2 (en) | Framework for efficient security coverage of mobile software applications | |
US9274768B2 (en) | Runtime code hooking for print driver and functionality testing | |
US20110010756A1 (en) | Virtual application program system, storing device, method for executing virtual application program and method for protecting virtual environment | |
US7500245B2 (en) | Changing code execution path using kernel mode redirection | |
US7353507B2 (en) | Intercepting function cells | |
US6698016B1 (en) | Method for injecting code into another process | |
US20070028225A1 (en) | Method and apparatus for preemptive monitoring of software binaries by instruction interception and dynamic recompilation | |
US20070011674A1 (en) | Computer system and method for selectively installing one operating system among a plurality of operating systems | |
US8850573B1 (en) | Computing device with untrusted user execution mode | |
CA2930424A1 (en) | Improved control flow integrity system and method | |
US20190095181A1 (en) | Easy-To-Use Type Of Compile-Time Dependency Injection Method And Device In The Java Platform | |
KR20110098567A (ko) | 최소 부트 이미지의 생성 방법 및 장치 | |
US9098701B2 (en) | Application module injection device, computing device including application module injection function, and recording medium for recording program for executing application module injection method | |
CN104731622A (zh) | 一种应用程序的加载方法、装置和移动终端 | |
US20190324732A1 (en) | Application Binary Rewriting to Reduce Binary Attack Surface Area | |
US8762976B2 (en) | Static extensibility models with dynamic languages and scripts | |
David | Ghidra Software Reverse Engineering for Beginners: Analyze, identify, and avoid malicious code and potential threats in your networks and systems | |
US20050289537A1 (en) | System and method for installing software on a computing device | |
US11113392B2 (en) | Executable binary code insertion | |
US9298432B1 (en) | Systems and methods for performing hooking in a jitted environment | |
Friedman et al. | Automatically repairing stripped executables with cfg microsurgery | |
CN113821219A (zh) | 一种实现应用程序容器化的方法及系统 | |
CN104572199A (zh) | 一种禁止启动项启动的方法和装置 | |
EP3195177A1 (en) | Generating and executing protected items of software |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |