|
大家可能都知道,在XP Embbeded中,系统就能实现即插即用,而在PE中是不能实现对很多设备的即插即用的。这是因为即插即用系统在不同的环境中表现是不一样的。这里先说原理,再探讨一下几种不完美的解决方案。
当一个支持即插即用的设备插入或被检测到时,内核态的即插即用组件Services.exe会以参数-setup启动,搜集设备信息,然后传到用户态的即插即用管理器Umpnpmgr.dll,由 Umpnpmgr.dll 调用包括Newdev.dll在内的一系列组件进行处理INF等文件,最后将SYS或只传递信息给内核,开始驱动。
在PE中,Services.exe和Umpnpmgr.dll会检测HKLM\system\setup下的systemsetupinprogress键值,等于1表示setup进程正在运行,Services.exe和Umpnpmgr.dll会自动让位给Setup;如果等于0,其他组件可能工作不正常,比如SAM 。解决办法是修改Services.exe和Umpnpmgr.dll。使用UltraEdit查找ASCII并选择使用正则表达式s?e?t?u?p?i?n?p?r?o?g?r?e?s?s或HEX:530079007300740065006d005300650074007500700049006e00500072006f006700720065007300
73,因为字符串是以UniCode形式存储的。将最后的S改为T,变成systemsetupinprogrest,并在注册表HKLM\system\setup下建立DWORD systemsetupinprogrest = 0 。修改SETUPAPI.DLL中CopyFiles为DopyFiles,也可以用XCAB处理一下PE所有的INF文件。最后添加各个设备类别的注册表键值HKLM\system\controlset001\control\classes ,hklm\system\controlset001\enum等。这个自己努力吧。
大家讨论最多也是最烦的是这个过程中的驱动认证。问题就在Setupapi.dll。正常的Setupapi.dll中有一个全局标志GlobalSetupFlags = 0,Setupapi.dll 会检测是否为NT_Embedded环境,如果是则GlobalSetupFlags = 40,如果不是就麻烦了,它会进行一系列的认证。除了HKCU\Software\Policies\Microsoft\Windows NT\Driver Signing,HKCU\Software\Policies\Microsoft\Windows NT\Non-Driver Signing,Setupapi.dll 还要以HKLM\System\WPA\PnP中的Seed计算一个MD5 hash值,与HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Setup下的PrivateHash对比。
不修改SETUPAPI.DLL的方法只有编程如下(Bartpe.exe 也使用这种方法):
antiWPA.rar
(1.54 KB, 下载次数: 284)
修改SETUPAPI.DLL的方法很简单。UltraEdit定位到sp2版本的SETUPAPI.DLL 7D198h处,将00改为40,即直接设置GlobalSetupFlags = 40。
——————————————————————————————————————————————————————————————————
5.25:实在对不住大家,上面的程序只能在PE中上网后才能使用!所以基本没什么用处。Bartpe使用了一个奇怪的方法,而且此方法在正常的XP系统中是没用的。我在网上查了查,毫无结果,只能自己反汇编成CPP,原理未知,但已经验证的确有效!
//用法:取消驱动验证SetSigpolicy(0,1);还原驱动验证SetSigpolicy(1,1);
char __cdecl SetSigpolicy(char a1, char a2)
{
char v2;
HMODULE v3;
HMODULE v4;
FARPROC v5;
HKEY hKey;
DWORD cbData;
DWORD Type;
DWORD Data;
_SYSTEMTIME SystemTime;
hKey = 0;
cbData = 4;
v2 = 0;
if ( !RegOpenKeyExA(HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Control\\Session Manager\\WPA\\PnP", 0, KEY_QUERY_VALUE, &hKey) )//正常XP不存在此键值
{
if ( !RegQueryValueExA(hKey, "seed", 0, &Type, (BYTE *)&Data, &cbData) )
{
if ( cbData == 4 )
{
if ( Type == 4 ) // REG_DWORD
{
v3 = LoadLibraryA("setupapi.dll");
v4 = v3;
if ( v3 )
{
v5 = GetProcAddress(v3, "pSetupGetRealSystemTime");
if ( v5 )
{
SystemTime.wDayOfWeek = 4 * (a2 & 1); //参数2赋值到wDayOfWeek低位
SystemTime.wYear = HIWORD(Data);//Seed高位赋值给wYear
SystemTime.wMilliseconds = (((4 * (a1 & 3)))<<16) + LOBYTE(SystemTime.wMilliseconds);//参数1赋值到wMilliseconds高位
SystemTime.wMinute = LOWORD(Data);//Seed低位赋值给wMinute
((int (__stdcall *)(_SYSTEMTIME *))v5)(&SystemTime);//调用pSetupGetRealSystemTime
v2 = 1;
}
FreeLibrary(v4);
}
}
}
}
}
if ( hKey )
RegCloseKey(hKey);
return v2;
}
源代码中的Pnp是Syssetup.DLL中的UpdatePnpDeviceDrivers,Bartpe中的要稍微复杂一些,故意略过了一些PE中不需要的东西。
可以这样用:RunDll32.exe Syssetup.dll,UpdatePnpDeviceDrivers
Syssetup.Dll 需要Sfc.dll,sfcfiles.dll,sfcos.dll 才能正常工作,再加上一些INF和驱动,你就会发现PE中的设备管理器显示的内容和正常XP一样了。(虽说没多大作用)
Syssetup.DLL中的UpdatePnpDeviceDrivers 源代码
s1.rar
(3.34 KB, 下载次数: 402)
显示更多信息的Bartpe.exe
BARTPE.rar
(19.69 KB, 下载次数: 303)
[ 本帖最后由 yamingw 于 2008-5-25 01:23 PM 编辑 ] |
评分
-
查看全部评分
|