tang_bi_sheng
驱动牛犊
驱动牛犊
  • 注册日期2003-02-20
  • 最后登录2003-04-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1545回复:18

关于ndis拦截在win me下的问题

楼主#
更多 发布于:2003-02-20 18:10
各位大虾:
   请问有谁知道NDIS PIM这个例子,在winme 下不能hook ndisregisterprotocol,在win 98下行,要在winme 下HOOK
ndisregisterprotocol怎样实现。

谢谢!!!
edust
驱动中牛
驱动中牛
  • 注册日期2002-04-02
  • 最后登录2003-06-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-02-20 18:43
Hook 不了吗?我没在 me 下试过,你查查这些东西 NdisRegisterProtocol   -> PEH_NdisRegisterProtocol   (pNDISSYS_NdisRegisterProtocol)
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-02-21 09:12
winme下我没有试过,不过应该是不可以吧,因为winme下好像是一个ndis.sys,不是一个VXD。hook_device_service是针对VXD的
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
tang_bi_sheng
驱动牛犊
驱动牛犊
  • 注册日期2003-02-20
  • 最后登录2003-04-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-02-21 09:22
还是HOOK不了,在PEH_NdisRegisterProtocol设置断点根本运行不到
这里来,我看程序的注释是hook NDIS.SYS里的函数。NDIS.sys是win2000/xp下的,在winme下根本就没有ndis.sys.只有tcpip.sys.
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-02-21 09:41
winme不会没有ndis.sys吧??难道有ndis.vxd?
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
tang_bi_sheng
驱动牛犊
驱动牛犊
  • 注册日期2003-02-20
  • 最后登录2003-04-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-02-21 09:57
win me 下有ndis.vxd和tcpip.sys,没有ndis.sys,难道要HOOK
住与tcpip.sys有关系吗?
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-02-21 10:04
哦,如果是ndis.vxd,那pcausa的那个PIM就可以其作用了。你是怎么发现没有hook ndisregisterprotocol的?

其他的函数hook上了?
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
tang_bi_sheng
驱动牛犊
驱动牛犊
  • 注册日期2003-02-20
  • 最后登录2003-04-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-02-21 10:15
我在 VXDH_NdisRegisterProtocol和PEH_NdisRegisterProtocol处以及其他函数如ndissend,receivehandler等等处设置断点程序根本就
不能运行到这里来,但在NH_HookVxdServices函数里能够运行,不知道为什么?
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-02-21 10:19
你怎么设置的断点?
符号文件对么?
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
tang_bi_sheng
驱动牛犊
驱动牛犊
  • 注册日期2003-02-20
  • 最后登录2003-04-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2003-02-21 10:30
我在win me启动时在VXDH_NdisRegisterProtocol,NH_HookVxdServices,VXDH_NdisSend等处用F9设置断点,
然后x退出softice让winme继续启动,但softice一直没有弹出
来程序一直不能运行到所设置的断点处,启动完后我运行
iplce.exe(应用程序),应用程序没有显示出机器的网卡
和拔号适配器,在多台win me 机器下都是这样,但在win98
下一切都正常。
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2003-02-21 10:34
应该是没有加载成功吧,这样的话你就单步跟以下看看hook_device_service的结果
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
tang_bi_sheng
驱动牛犊
驱动牛犊
  • 注册日期2003-02-20
  • 最后登录2003-04-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2003-02-21 10:41
我在NH_HookVxdServices处设置断点,能够执行并返回NDIS_STATUS_SUCCESS ,并附NH_HookVxdServices的原代码。

NTSTATUS NH_HookVxdServices( VOID )
{
  // NTSTATUS    nStatus;
   DWORD       nResult;

   dprintf( \"NH_HookVxdServices: Entry...\\n\" );

   //
   // Initialize Global Variables
   //
   InitializeListHead( &g_ProtocolList );

   //
   // Hook _PELDR_AddExportTable
   //

#ifdef VTOOLSD // For VtoolsD Build
   nResult = VXDLDR_GetVersion();//得到VXDLoader的版本号。
#else
   nResult = TRUE;      // Can\'t Get VXDWRAPS To Work. Sorry...
#endif

   if( nResult )
   {
      if( !Hook_Device_Service_Ex_RAW(
            VXDLDR_GetVersion(NH_HookVxdServices),
            (PVOID) PEH_AddExportTable,
            (PVOID *) &pOS_AddExportTable)
         )
      {
         dprintf( \"Hook_Device_Service_Ex_RAW For _PELDR_AddExportTable FAILED\\n\" );

         pOS_AddExportTable = NULL;
      }
   }
   else
   {
      dprintf( \"VXDLDR NOT LOADED\\n\" );
   }

   //
   // Hook NdisRegisterProtocol
   //
   if( !Hook_Device_Service_Ex_RAW(
         GetVxDServiceOrdinal(NdisRegisterProtocol),
         (PVOID) VXDH_NdisRegisterProtocol,
         (PVOID *) &pNDISVXD_NdisRegisterProtocol)
      )
   {
      dprintf( \"Hook_Device_Service_Ex_RAW FAILED\\n\" );

      pNDISVXD_NdisRegisterProtocol = NULL;

      return( NDIS_STATUS_FAILURE );
   }

   if( !pNDISVXD_NdisRegisterProtocol )
   {
      return( NDIS_STATUS_FAILURE );
   }


  
   //
   // Hook NdisDeregisterProtocol
   //
   if( !Hook_Device_Service_Ex_RAW(
         GetVxDServiceOrdinal(NdisDeregisterProtocol),
         (PVOID) VXDH_NdisDeregisterProtocol,
         (PVOID *) &pNDISVXD_NdisDeregisterProtocol)
      )
   {
      dprintf( \"Hook_Device_Service_Ex_RAW FAILED\\n\" );

      pNDISVXD_NdisDeregisterProtocol = NULL;

      return( NDIS_STATUS_FAILURE );
   }

   if( !pNDISVXD_NdisDeregisterProtocol )
   {
      return( NDIS_STATUS_FAILURE );
   }

   //
   // Hook NdisOpenAdapter
   //
   if( !Hook_Device_Service_Ex_RAW(
         GetVxDServiceOrdinal(NdisOpenAdapter),
         (PVOID) VXDH_NdisOpenAdapter,
         (PVOID *) &pNDISVXD_NdisOpenAdapter)
      )
   {
      dprintf( \"Hook_Device_Service_Ex_RAW FAILED\\n\" );

      pNDISVXD_NdisOpenAdapter = NULL;

      return( NDIS_STATUS_FAILURE );
   }

   if( !pNDISVXD_NdisOpenAdapter )
   {
      return( NDIS_STATUS_FAILURE );
   }

   //
   // Hook NdisSend
   //
   if( !Hook_Device_Service_Ex_RAW(
         GetVxDServiceOrdinal(NdisSend),
         (PVOID) VXDH_NdisSend,
         (PVOID *) &pNDISVXD_NdisSend)
      )
   {
      dprintf( \"Hook_Device_Service_Ex_RAW FAILED\\n\" );

      pNDISVXD_NdisSend = NULL;

      return( NDIS_STATUS_FAILURE );
   }

   if( !pNDISVXD_NdisSend )
   {
      return( NDIS_STATUS_FAILURE );
   }

   //
   // Hook NdisRequest
   //
   if( !Hook_Device_Service_Ex_RAW(
         GetVxDServiceOrdinal(NdisRequest),
         (PVOID) VXDH_NdisRequest,
         (PVOID *) &pNDISVXD_NdisRequest)
      )
   {
      dprintf( \"Hook_Device_Service_Ex_RAW FAILED\\n\" );

      pNDISVXD_NdisRequest = NULL;

      return( NDIS_STATUS_FAILURE );
   }

   if( !pNDISVXD_NdisRequest )
   {
      return( NDIS_STATUS_FAILURE );
   }

   //
   // Hook NdisTransferData
   //
   if( !Hook_Device_Service_Ex_RAW(
         GetVxDServiceOrdinal(NdisTransferData),
         (PVOID) VXDH_NdisTransferData,
         (PVOID *) &pNDISVXD_NdisTransferData)
      )
   {
      dprintf( \"Hook_Device_Service_Ex_RAW FAILED\\n\" );

      pNDISVXD_NdisTransferData = NULL;

      return( NDIS_STATUS_FAILURE );
   }

   if( !pNDISVXD_NdisTransferData )
   {
      return( NDIS_STATUS_FAILURE );
   }

   //
   // Hook NdisCloseAdapter
   //
   if( !Hook_Device_Service_Ex_RAW(
         GetVxDServiceOrdinal(NdisCloseAdapter),
         (PVOID) VXDH_NdisCloseAdapter,
         (PVOID *) &pNDISVXD_NdisCloseAdapter)
      )
   {
      dprintf( \"Hook_Device_Service_Ex_RAW FAILED\\n\" );

      pNDISVXD_NdisCloseAdapter = NULL;

      return( NDIS_STATUS_FAILURE );
   }

   if( !pNDISVXD_NdisCloseAdapter )
   {
      return( NDIS_STATUS_FAILURE );
   }

   // ATTENTION!!! Set g_bNH_InitDone!!!

   return( NDIS_STATUS_SUCCESS );
}
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2003-02-21 11:21
程序应该没有问题,会不会是加载的时机的问题??还有winme和98是不是有什么不同的地方。
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
tang_bi_sheng
驱动牛犊
驱动牛犊
  • 注册日期2003-02-20
  • 最后登录2003-04-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2003-02-21 13:46
winme 和win98不同之处:
win98是靠NDIS。VXD
WINME可能依赖ndis.vxd和tcpip.sys.
现在还不知道是什么原因?
gjpland
驱动小牛
驱动小牛
  • 注册日期2001-09-13
  • 最后登录2011-03-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2003-02-21 17:00
下面一段是Hook wdm 的这段代码,是帮FRACKER 写的,我没有测过,看看有没有帮助。

void DummyExportFunc();
typedef struct _EXPORT_TABLE_LINK
{
struct _EXPORT_TABLE_LINK *Next;
struct _EXPORT_TABLE_LINK *Head;
byte * ExportTableName;
PVOID  Reserver;//Unknown
udword  NumberOfExportString  ; //string
udword  NumberOfExportTable ; //table
PVOID  Unknown;
byte  **DummyExportString;
udword  *OrdinalTable;
PVOID  *DummyExportTable;
}EXPORT_TABLE_LINK,*PEXPORT_TABLE_LINK;
PEXPORT_TABLE_LINK m_NdisExportTable = NULL;

PEXPORT_TABLE_LINK GetNdisExportTablePtr()
{

PEXPORT_TABLE_LINK ExportTableHandle,link;
byte *ExportTableName = \"DummyExport\";

PVOID DummyExportTable[1] = {DummyExportFunc};
byte *DummyExportString[1]  = \"DummyExportFunc\";
udword OrdinalTable[1] = {1};
udword NumberOfExportTable = sizeof(DummyExportTable)/sizeof(PVOID);

__asm push 0 //Link Head
__asm push DummyExportTable
__asm push OrdinalTable
__asm push DummyExportString
__asm push 1  //unknown
__asm push NumberOfExportTable //table
__asm push NumberOfExportTable //string
__asm push ExportTableName
__asm push offset ExportTableHandle
VxdCall(_PELDR_AddExportTable) // CD 20 0C 80 27 00
__asm add esp,9*4
__asm or eax,eax
__asm jne FAIL_OUT
link = ExportTableHandle;
while(link)
{
if( !strcmp(link->ExportTableName, \"NDIS.SYS\") )
{
break;
}
link = link->Next;
}
__asm push 0;
__asm push ExportTableHandle;
VxdCall(_PELDR_RemoveExportTable); //CD 20 0D 80 27 00
__asm add esp,2*4
return link;
FAIL_OUT;
return NULL;

}
udword UnhookNdisFunc(byte *FuncName,PVOID oldFunc)
{
 udword x;
 
 if( m_NdisExportTable == NULL )
  return 0;
 for( x = 0; x < m_NdisExportTable->NumberOfExportString; x++ )
 {
  if( !strcmp(FuncName,m_NdisExportTable->DummyExportString[x]) )
  {
  
     m_NdisExportTable->DummyExportTable[x] = oldFunc;
       return 1;
  }
 }
 return 0;
}

udword HookNdisFunc(byte *FuncName,PVOID newFunc,PVOID *oldFunc)
{
udword x;

if( m_NdisExportTable == NULL )
return 0;
for( x = 0; x < m_NdisExportTable->NumberOfExportString; x++ )
{
if( !strcmp(FuncName,m_NdisExportTable->DummyExportString[x]) )
{

oldFunc[0] = m_NdisExportTable->DummyExportTable[x];
m_NdisExportTable->DummyExportTable[x] = newFunc;
return 1;
}
}
return 0;
}
void Init()
{
m_NdisExportTable = GetNdisExportTablePtr();
HookNdisFunc(\"NdisMRegisterMiniport\",ourNdisMRegisterMiniport,m_oldNdisMRegisterMiniport);
return;
}
void DummyExportFunc()
{
return;
}
我思故我在,脑袋不会坏.
tang_bi_sheng
驱动牛犊
驱动牛犊
  • 注册日期2003-02-20
  • 最后登录2003-04-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2003-02-22 16:23
gjpland:
你好!
编译通不过,主要是VxDCall处出现improper operand type错误.
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2003-02-22 18:35
他那个不是hook VXD用的,是hook sys
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
gjpland
驱动小牛
驱动小牛
  • 注册日期2001-09-13
  • 最后登录2011-03-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2003-02-22 21:08
gjpland:
你好!
编译通不过,主要是VxDCall处出现improper operand type错误.

需要INCLUDE 几个头文件不行的话你就直接用二进制码我旁边都有的。
我思故我在,脑袋不会坏.
daisyboy
驱动小牛
驱动小牛
  • 注册日期2002-10-24
  • 最后登录2012-05-21
  • 粉丝3
  • 关注0
  • 积分599分
  • 威望140点
  • 贡献值1点
  • 好评度56点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2003-02-23 12:00
各位大虾:
   请问有谁知道NDIS PIM这个例子,在winme 下不能hook ndisregisterprotocol,在win 98下行,要在winme 下HOOK
ndisregisterprotocol怎样实现。

谢谢!!!
 


我来回答这个问题,给我分吧!! :D

WIN ME 下HOOK ndisregisterprotocol 方式与98不同,需要先HOOK PELDR_AddExportTable (用Hook_Device_Service_C就可以),然后在PELDR_AddExportTable的ExportNameList里找到NdisRegisterProtocol这个函数,对之进行取代,就可以了。

补充回答mikeluo,WINME采用的是“NDIS.SYS”!!
祝你成功!给分吧,给分吧! 急需用分下载资料啊。。。

 :P
合作c/c++/ndis/pppoe/802.1x!
游客

返回顶部