能力值:
( LV13,RANK:410 )
|
-
-
2 楼
windows的加载策略是,你提供一些正确的信息,然后我完成加载。至于其他的信息正确与否,无所谓。
所以在windows下,可执行文件可以是任意后缀名,动态链接库也可以是任意后缀名。然而windows外壳explorer.exe只注册了.exe后缀的执行命令,所以一个.dll后缀的可执行文件,则必须调用者自己使用API来完成启动。
启动之后,这个.dll文件将构成新进程的执行主体。
不过,按你说的情况除了上面的可能还会有另一种情况,调用者使用rundll32.exe来运行这个DLL,其内部实现模式是这样的,首先运行rundll32.exe,然后它会处理自己的命令行,然后去LoadLibrary参数中的Dll,如果后面还有一个参数,则GetProcAddress以这个参数为名的导出函数,如果后面还有参数,则将这些参数作为这个导出函数的参数压栈,之后调用导出函数本身。
对于你的问题:
问题一:
若是上面第一种情况,那么你要么去拦截EXE中启动DLL的API所传入的参数,要么侵入DLL进程去call GetCommandLineA/W
若第二种情况,我想我说的也很明白了。
问题二:
如果是上面第一种情况,同样的,可以去拦截EXE中启动DLL的API传入的参数的返回值(针对CreateProcess),也可以CreateToolHelp32Snapshot,我想这个你也很熟练的。
如果是上面第二种情况,那么这个DLL不存在PID,它寄身于rundll32.exe的进程中。
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
谢谢鸟哥 分析的不错
我尝试了几种方法 最后最简单的方法成功了
获取EXE启动DLL的参数 然后传入就可以运行 并且可以注入
后来思考了下 DLL和EXE都是PE结构 那么后缀其实不重要了 只要DLL人家做好了参数正确都可以启动
|
|
|