一种可执行程序动态调用方法及系统与流程

文档序号:11154497阅读:521来源:国知局
一种可执行程序动态调用方法及系统与制造工艺

本发明涉及计算机技术领域,特别涉及一种可执行程序动态调用方法及系统。



背景技术:

随着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方式运行。

上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。

本领域普通技术人员可以理解实现上述实施例的全部或部分步骤可以通过硬件来完成,也可以通过程序来指令相关的硬件完成,所述的程序可以存储于一种计算机可读存储介质中,上述提到的存储介质可以是只读存储器,磁盘或光盘等。

以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1