4124|7

82

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

WINCE5.0 跨进程注入DLL [复制链接]

    在网上查了一下发现在WINCE下的DLL注入和在WINDOWS下注入DLL使用的方法是不一样的,现在有以下几个问题麻烦高手帮忙解答一下,谢谢!
    1.WINCE是否支持DLL注入,如果支持能否提供一个例子
    2.如果目标程序是一个非MFC的程序,如果注入的DLL是用MFC写的,那么在注入之后是否可以执行DLL中的函数?

最新回复

好东西,学习一下.  详情 回复 发表于 2009-9-22 19:14
点赞 关注

回复
举报

63

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
这个问题,google一下就有答案了

作为嵌入式操作系统,在Smartphone 2002 (基于Windows CE 3.0) 中并不提供动态链接库注入机制,在Smartphone 2003才提供,使用Dll Inject机制,可以在注册表中设置关键字HKEY_LOCAL_MACHINE\System\Kernel\InjectDLL的值,该关键字数据类型为REG_MULTI_SZ,包含一个DLL文件名或者一组DLL文件名(用逗号分离),列出的每个DLL文件名都可以包含一个路径。当系统启动时,列在该键值中的每个DLL会映射到系统加载的每个进程中(Nk.exe和File.exe除外)。
当进程创建时,系统将分配进程的地址空间,接着将可执行文件映像和所有需要的DLL文件(包括HKEY_LOCAL_MACHINE\System\Kernel\InjectDLL注册的所有DLL)映像映射到进程的地址空间中。然后才创建进程的主线程,并使用该线程调用每个DLL的带有DLL_PROCESS_ATTACH值的DllMain函数。当已经映射的所有DLL都对通知信息作出响应后,系统将使进程的主线程开始执行可执行模块的C/C++ Runtime启动代码,然后执行可执行模块的进入点函数(WinMain)。
如果DLL(不包括HKEY_LOCAL_MACHINE\System\Kernel\InjectDLL注册的任何DLL)的任何一个DllMain函数返回FALSE,表明初始化没有取得成功,系统便终止整个进程的运行,从它的地址空间中删除所有文件映像,给使用户显示一个消息框,说明进程无法启动运行。
前面说过,NK.exe和File.exe不受该键值的影响,这主要是由于Windows CE的启动过程造成的[4]。
当系统复位时,CPU将跳转到NK.exe的入口。NK.exe是Windows CE的核心模块,入口的代码实际上是由OEM编写的,而不是Microsoft,因为不同的平台,硬件也不一定相同,因此Windows CE需要OEM编写一些特定的初始化代码,这些代码被并入内核的硬件抽象层(HAL,Hardware Abstraction Layer),当OEM为特定硬件平台建立系统时,HAL将和Windows CE内核代码静态连接而产生NK.exe。
Nk.exe在设计时与文件系统(包括注册表系统、数据库系统)是独立的,也就是说NK.exe不会负责文件系统的初始化,但是在NK.exe初始化过程中要用到注册表数据,因此,当NK.exe启动后,将创建有名事件(Named Events)SYSTEM/FSReady,加载并运行系统程序File.exe, 然后转入睡眠等待事件变为已通知状态。
File.exe负责管理文件系统、数据库函数和注册表。File.exe被加载后,将检测这次启动是冷启动还是热启动。冷启动和热启动的最大区别就是内存中是否存在已初始化的文件系统。
如果是热启动,内存中保留了上次使用的数据,File.exe将使用这个已初始化的文件系统。如果是冷启动,File创建一个文件系统,将空内存文件系统和ROM中的文件合并在一起。
当文件系统存在后,File.exe会创建默认的数据库和注册表,初始化本地语言支持模块(National Language Support, NLS)。
接着File.exe将事件SYSTEM/FSReady置为已通知状态,然后转为睡眠状态等待Nk.exe完成初始化后将其唤醒。
由于事件SYSTEM/FSReady置为已通知状态,NK.exe被唤醒接着运行,此时,注册表已被File.exe创建,NK.exe根据注册表的键值继续运行,如配置虚拟内存管理器,初始化默认处理程序的中断向量表,初始化端口等等,当然,最重要的是通知File.exe可以继续运行。
File.exe被唤醒后,接着进行后续的初始化工作,如根据列在注册表HKEY_LOCAL_MACHINE\System\Events中的名字创建有名事件SYSTEM/PowerManagerReady,SYSTEM/GweApiSetReady,SYSTEM/ShellAPIReady,SYSTEM/BatteryAPIsReady等等,这些有名事件的初始状态都是未通知状态,后面有相应的程序来对其进行设置,如图形窗口和事件管理器(GWE,Graphics Windowing and Event Manager)初始化图形API后,会把有名事件SYSTEM/GweApiSetReady值为通知状态,系统知道图形API有效,可以进行图形绘制。
所以,在Nk.exe和File.exe被加载前,系统不可能去搜索注册表,更谈不上Dll Inject钩子机制。
关于Windows CE的详细的启动步骤请参考MSDN。
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
    这个已经看过了呀,我需要的不是从注册表注入的,能否从程序方面给出例子,比如调用哪个API
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

4
 
弱弱问一下:DLL注入是什么意思?
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

5
 
给你一段代码试试。这个思路肯定是可行的,不过这段代码我没具体测试过,你可能要调试一下。具体思路是用PerformCallBack4 API在目标进程调用LoadLibraryW,参数通过cbi.pvArg0传递,由于lpLibFileName在本地buffer,目标进程不能访问,所以要把它拷贝到共享内存区域(用VirtualAlloc分配2MB内存)。

typedef struct _CALLBACKINFO {
    HANDLE  hProc;      /* destination process */
    FARPROC pfn;        /* function to call in dest. process */
    PVOID   pvArg0;     /* arg0 data */
} CALLBACKINFO;
typedef CALLBACKINFO *PCALLBACKINFO;
extern DWORD PerformCallBack4(PCALLBACKINFO pcbi, ...);
HMODULE WINAPI LoadLibraryInProcess(LPCWSTR lpLibFileName, DWORD dwProcessId)
{
        HANDLE hProcess = OpenProcess(0, FALSE, dwProcessId);
        if (!hProcess)
        {
                SetLastError(ERROR_INVALID_PARAMETER);
                return NULL;
        }

        CALLBACKINFO cbi;
        cbi.hProc = hProcess;
        cbi.pfn = GetProcAddress(GetModuleHandle(L"coredll.dll"), L"LoadLibraryW");
        size_t len = (1+wcslen(lpLibFileName))*sizeof(WCHAR);
        LPVOID p0 = VirtualAlloc(0, 2*1024*1024, MEM_RESERVE, PAGE_NOACCESS);
        if (p0)
        {
                cbi.pvArg0 = VirtualAlloc(p0, len, MEM_COMMIT, PAGE_READWRITE);
                memcpy(cbi.pvArg0, lpLibFileName, len*sizeof(WCHAR));
                DWORD r = PerformCallBack4(&cbi);
                VirtualFree(p0, MEM_RELEASE);
        }
        CloseHandle(hProcess);
        return (HMODULE)r;
}
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

6
 
http://www.forwardlab.com/freestuff.htm
源码

 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

7
 
mark!
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

8
 
好东西,学习一下.
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表