使用bindview自动安装passthru驱动的调试笔记


1.21
整个软件的安装过程比较复杂,需要自动安装passthru.sys这个驱动。
在驱动开发网上搜索了一下,有很多人讲,不过根据bindview这个代码开发的自动安装的程序,居然可以看到原代码。太开心了,下载下载。
passthruinstall这个程序是需要DDK来编程的,我本来想把它的代码移植到VC6.0里面。可是需要的文件太麻烦,主要就是hid.h。可是包含了之后出现的大面积的参数定义错误让我始料不及,今天调试了一个下午,还是没有什么突破,还是算了,在ddk下进行调试吧。
我在2K的DDK以及XP的DDK都可以编译,还不错,没有出现问题。得到的passthruinstall.exe拷贝到一个安装目录:里面有netsf.inf  netsf_m.inf  passthru.sys 和 sfilter.dll. 这四个文件也是手工安装需要的四个文件,手工安装方面已经没有问题了。
运行程序却发现:提示没有找到设备信息集   错误0x800203  ,调试passthruinstall这个代码,发现是函数:InstallSpecifiedComponent失败,主函数入口是这样的:

DWORD InstallDriver_Passthru()
{
DWORD    nResult;
TCHAR    szFileFullPath[ _MAX_PATH ];
TCHAR      szDrive[ _MAX_DRIVE ];
TCHAR      szDir[ _MAX_DIR ];
TCHAR      szDirWithDrive[_MAX_DRIVE+_MAX_DIR];
nResult =   GetServiceInfFilePath_PassthruMP( szFileFullPath, MAX_PATH );
if( nResult == 0 )
{
//_tprintf( "Unable to get INF file path.\n") );
MessageBoxW(NULL, L"获取INF文件路径失败!", L"安装程序错误提示",MB_OK);
return 0;
}
//
// Get the path where the INF file is.
//
_wsplitpath( szFileFullPath, szDrive, szDir, NULL, NULL );

wcscpy( szDirWithDrive, szDrive );
    wcscat( szDirWithDrive, szDir );
if ( !SetupCopyOEMInfW(
(PWSTR)szFileFullPath,
(PWSTR)szDirWithDrive, // Other files are in the
// same dir. as primary INF
SPOST_PATH,     // First param is path to INF
0,              // Default copy style
NULL,           // Name of the INF after
// it's copied to %windir%\inf
0,              // Max buf. size for the above
NULL,           // Required size if non-null
NULL)           // Optionally get the filename
// part of Inf name after it is copied.
)
{
MessageBoxW(NULL, L"复制 PasstruMP 的inf安装文件到系统目录失败!", L"安装程序错误提示",MB_OK);

}
//------------------------------------------------------------------------
nResult = GetServiceInfFilePath_Passthru( szFileFullPath, MAX_PATH );
if( nResult == 0 )
    {
//     _tprintf( "Unable to get INF file path.\n" );
MessageBoxW(NULL, L"获取INF文件路径失败!", L"安装程序错误提示",MB_OK);
return 0;
}

//_tprintf( "INF Path: %s\n", szFileFullPath );
HRESULT hr=S_OK;
//_tprintf( "PnpID: %s\n"),    "ms_passthru");
WCHAR wszPassthru[] = L"ms_passthru" ;
///

//错误发生在这里

///
hr = InstallSpecifiedComponent(
(LPWSTR)szFileFullPath,                    //驱动安装的inf文件路径 , 适当修改吧
(LPWSTR)wszPassthru,               // NDISPROT_SERVICE_PNP_DEVICE_ID,    //这个也要适当修改的
pguidNetClass[1]            //NDIS Protocal 类型
);

if( hr != S_OK )
{
/*ErrMsg( hr, L"InstallSpecifiedComponent\n" );*/
MessageBoxW(NULL, L"ESC安装驱动失败!", L"安装程序错误提示",MB_OK);
}else
{
MessageBoxW(NULL, L"ESC成功安装驱动!", L"安装程序提示",MB_OK);
}

return 0;
}


怎么会呢,因为InstallSpecifiedComponent这个函数在component.cpp里面定义的很清楚,我于是比较了XP DDK里面标准的bindview里面的component.cpp  与 passthruinstall文件里面的component.cpp,发现是一样一样的,问题可能出现在参数上,明天继续

1.22

非常不幸的是,参数都是正确的,每一个路径和copy的过程都是对的。
在网络上搜索,看到一篇文章:说使用自动程序安装中间层驱动为什么会失败的事情,是因为netsf.inf标准的inf是这样的:
[MSFT]
%Passthru_Desc% = Passthru.ndi, ms_passthru
[Passthru.ndi]
AddReg          = Passthru.ndi.AddReg, Passthru.AddReg
Characteristics = 0x4490 ; NCF_HAS_UI | NCF_FILTER | NCF_NO_SERVICE | NCF_NDIS_PROTOCOL !--Filter Specific--!!
CopyFiles       = Passthru.Files.Init, Passthru.Files.Sys
CopyInf         = netsf_m.inf

; File copy
;
[SourceDisksNames]
1=%DiskDescription%,"",,
[SourceDisksFiles]
passthru.dll=1
passthru.sys=1
netsf_m.inf=1
[DestintionDirs]
DefaultDestDir = 12
Passthru.Files.Init  = 11   ; %windir%\System32
Passthru.Files.Sys   = 12   ; %windir%\System32\drivers

; Copying of passthru.dll is required only if the filter has a Notify object
[Passthru.Files.Init]
passthru.dll,,,2

[Passthru.Files.Sys]
passthru.sys,,,2

但是,由于这一块代码有问题:
...
[Passthru.ndi]
AddReg          = Passthru.ndi.AddReg, Passthru.AddReg
Characteristics = 0x4490 ; NCF_HAS_UI | NCF_FILTER | NCF_NO_SERVICE | NCF_NDIS_PROTOCOL !--Filter Specific--!!
CopyFiles       = Passthru.Files.Init, Passthru.Files.Sys
CopyInf         = netsf_m.inf
...

CopyInf这个文件需要把netsf_m.inf拷贝到系统下,但是这个函数有时候会出现失败的现象:需要使用上面一样的拷贝方式,于是需要把这一段代码修改成这样:
...
[Passthru.ndi]
AddReg          = Passthru.ndi.AddReg, Passthru.AddReg
Characteristics = 0x4490 ; NCF_HAS_UI | NCF_FILTER | NCF_NO_SERVICE | NCF_NDIS_PROTOCOL !--Filter Specific--!!
CopyFiles       = Passthru.Files.Init, Passthru.Files.Sys ,Passthru.Files.inf
;CopyInf         = netsf_m.inf 
;被隐藏了
....

同时需要把相关的代码调整
...
[SourceDisksFiles]
sfilter.dll=1
passthru.sys=1
;增加了这一句
netsf_m.inf=1

[DestinationDirs]
DefaultDestDir = 12
SFilter.CopyFiles.Init  = 11   ; %windir%\System32
SFilter.CopyFiles.Sys   = 12   ; %windir%\System32\drivers
;增加了这一句
SFilter.CopyFiles.Inf   = 17   ; %windir%\inf

; Copying of sfilter.dll is required only if the filter has a Notify object
[SFilter.CopyFiles.Init]
sfilter.dll,,,2

[SFilter.CopyFiles.Sys]
passthru.sys,,,2

;增加了这一部分
[SFilter.CopyFiles.Inf]
netsf_m.inf,,,2
...
修改实际上就是使用一样的方式拷贝。
OK,修改完毕,继续使用passthruinstall.exe。错误解决了,但是...什么? 需要passthru.dll? 那里有passthru.dll?我只有sfilter.dll。。。。
仔细修改netsf.inf程序,发现真的有代码需要使用passthru.dll,
...
HKR, Ndi, ComponentDll, , passthru.dll
...
可是我在编译的过程中根本没有产生passthru.dll,难道需要在上层进行编译,产生passthru.dll?

于是有了一个邪恶的念头,就是passthru.dll是不是和sfilter.dll是一个呢。,我改,不就是一个名字吗,结果居然安装显示成功了....赶紧测试程序,却发现, 上层软件不起作用了,发送的命令根本没有被驱动执行......

1.23

我决定一点一点的修改netsf.inf,把里面的名字都修改成sfilter,这样就应该不需要passthru.dll了吧,结果跟我预料的相同,但是在启动上层软件的时候出了问题:不能打开接口,提示Creatfile()失败。。。
整个疯掉了,而且系统出了问题:当出现安装成功却不能控制的时候,接下来怎么卸载也没有用处了。手工安装也不行了,重启也不行了,安装系统吧。
幸好有ghost..因为听说调试驱动会坏系统,做好了完全的准备.....
今天重装了11次系统,发现了一个规律,当我使用passthru名字的时候,需要passthru.dll可以安装成但是不能使用,修改成sfilter时候,安装成功但是不能打开文件。
于是我回到passthru里面,

1,在passthru.c里面有DriverEntry()函数,发现了
RtlInitUnicodeString(&nameString, L"\\Device\\MyPassthru" ); 
RtlInitUnicodeString(&linkString, L"\\??\\MyPassthru"); 
说明入口是MyPassthru

2,在上层切换软件里面,有这样的函数
creatfile("\\\\.\\Mypassthru"...);
就是说要打开这样的接口...

3,于是又回到bindview.cpp
发现有这样一句:
WCHAR wszPassthru[] = L"ms_passthru";
需要passthru,可能也是需要passthru.dll, 我只有sfilter.dll,一般dll都会提供接口函数,是不是需要改变一下?
修改bindview.cpp里面的这一句:
WCHAR wszPassthru[] = L"ms_sfilter";

为什么不修改1 ,2呢,因为1,2是约定接口的,而且我也不确定passthru.dll这个我修改的文件是否有用了。
编译,生成passthruinstall.exe,去掉无聊的passthru.dll,把netsf.inf修改成使用sfilter名字...出现了梦寐以求的数字签名.OK,使用上层软件打开,OK,然后控制,也OK
整个世界清静了。
结论:改netsf.inf 以及 bindview。
继续开发了自动卸载的程序,但是卸载的时候出现了蓝屏,不怕不怕,慢慢来......
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
passthru来源于FireWallDemo,具有TCP,UDP,ICMP拦截功能,但是不具有ARP拦截。 首先,拦截规则是在UTIL_AddOneRule函数里加入,参数是Rules,所以Rules结构要重新定义如下: struct Rules { u_long id; //Rule的号码 u_char protocol; //协议类型 union { struct { u_long s_ip; //原IP u_long s_mask; //掩码 u_short s_port; //原端口 u_long d_ip; //目的IP u_long d_mask; //掩码 u_short d_port; //目的端口 }; struct { u_long arp_spa; //IP地址 ;ULONG u_char arp_sha[6]; //硬件地址 }; }; u_char direct; //方向 u_char action; //是否拦截 char sMemo[100]; //备注 }; 以便使Rules结构既适合原来定义,又适合ARP参数传递,类似这样的定义还有 struct Fw_Rule_Node { u_long id; //Rule的号码 u_char protocol; //协议类型 union { struct { u_long s_ip; //原IP u_long s_mask; //掩码 u_short s_port; //原端口 u_long d_ip; //目的IP u_long d_mask; //掩码 u_short d_port; //目的端口 }; struct { u_long arp_spa; //IP地址 ;ULONG u_char arp_sha[6]; //硬件地址 }; }; u_char direct; //方向 u_char action; //是否拦截 char sMemo[100];//备注 struct Fw_Rule_Node *next; //指向下个节点的指针 }; 重新定义后,就可以在UTIL_AddOneRule函数加入ARP规则匹配,规则匹配是由UTIL_MatchRule和UTIL_MatchArpRule来检查,如果符合规则就通过,否则丢弃。本包包含passthru增加ARP拦截功能编译后的passthru驱动包,以及VC的passthru驱动源代码,需要用XPDDK或2003DDK编译,VC我不知道怎么编译,反正VC无法编译。本包还附带Delphi7使用passthru拦截ARP的一个简单例子,详见Button1的Click事件代码,IP和MAC地址根据情况需重新填写。另外,ARP和Rules结构对应Delphi7来说都是紧缩结构(Packed record),Delphi XE 居然不认,这里强调一下,Rules结构的尺寸是127,凡是不是这个尺寸的,passthru驱动不认账,无法调用,这个Rules结构到了Delphi XE 里尺寸居然是227,弄了半天,不知道何故,毅然删除Delphi XE,重新启用Delphi7,万恶 的Delphi XE!!!,害得我调试了半天。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值