| 
					阅读:1677回复:18
				 关于ndis拦截在win me下的问题
					各位大虾:
 请问有谁知道NDIS PIM这个例子,在winme 下不能hook ndisregisterprotocol,在win 98下行,要在winme 下HOOK ndisregisterprotocol怎样实现。 谢谢!!! | |
| 沙发#发布于:2003-02-20 18:43 
					Hook 不了吗?我没在 me 下试过,你查查这些东西 NdisRegisterProtocol   -> PEH_NdisRegisterProtocol   (pNDISSYS_NdisRegisterProtocol)				 | |
| 板凳#发布于:2003-02-21 09:12 
					winme下我没有试过,不过应该是不可以吧,因为winme下好像是一个ndis.sys,不是一个VXD。hook_device_service是针对VXD的				 | |
| 
 | 
| 地板#发布于:2003-02-21 09:22 
					还是HOOK不了,在PEH_NdisRegisterProtocol设置断点根本运行不到
 这里来,我看程序的注释是hook NDIS.SYS里的函数。NDIS.sys是win2000/xp下的,在winme下根本就没有ndis.sys.只有tcpip.sys. | |
| 地下室#发布于:2003-02-21 09:41 
					winme不会没有ndis.sys吧??难道有ndis.vxd?				 | |
| 
 | 
| 5楼#发布于:2003-02-21 09:57 
					win me 下有ndis.vxd和tcpip.sys,没有ndis.sys,难道要HOOK
 住与tcpip.sys有关系吗? | |
| 6楼#发布于:2003-02-21 10:04 
					哦,如果是ndis.vxd,那pcausa的那个PIM就可以其作用了。你是怎么发现没有hook ndisregisterprotocol的?
 其他的函数hook上了? | |
| 
 | 
| 7楼#发布于:2003-02-21 10:15 
					我在 VXDH_NdisRegisterProtocol和PEH_NdisRegisterProtocol处以及其他函数如ndissend,receivehandler等等处设置断点程序根本就
 不能运行到这里来,但在NH_HookVxdServices函数里能够运行,不知道为什么? | |
| 8楼#发布于:2003-02-21 10:19 
					你怎么设置的断点?
 符号文件对么? | |
| 
 | 
| 9楼#发布于:2003-02-21 10:30 
					我在win me启动时在VXDH_NdisRegisterProtocol,NH_HookVxdServices,VXDH_NdisSend等处用F9设置断点,
 然后x退出softice让winme继续启动,但softice一直没有弹出 来程序一直不能运行到所设置的断点处,启动完后我运行 iplce.exe(应用程序),应用程序没有显示出机器的网卡 和拔号适配器,在多台win me 机器下都是这样,但在win98 下一切都正常。 | |
| 10楼#发布于:2003-02-21 10:34 
					应该是没有加载成功吧,这样的话你就单步跟以下看看hook_device_service的结果				 | |
| 
 | 
| 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 ); } | |
| 12楼#发布于:2003-02-21 11:21 
					程序应该没有问题,会不会是加载的时机的问题??还有winme和98是不是有什么不同的地方。				 | |
| 
 | 
| 13楼#发布于:2003-02-21 13:46 
					winme 和win98不同之处:
 win98是靠NDIS。VXD WINME可能依赖ndis.vxd和tcpip.sys. 现在还不知道是什么原因? | |
| 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; } | |
| 
 | 
| 15楼#发布于:2003-02-22 16:23 
					gjpland:
 你好! 编译通不过,主要是VxDCall处出现improper operand type错误. | |
| 16楼#发布于:2003-02-22 18:35 
					他那个不是hook VXD用的,是hook sys				 | |
| 
 | 
| 17楼#发布于:2003-02-22 21:08 gjpland: 需要INCLUDE 几个头文件不行的话你就直接用二进制码我旁边都有的。 | |
| 
 | 
| 18楼#发布于:2003-02-23 12:00 各位大虾: 我来回答这个问题,给我分吧!! :D WIN ME 下HOOK ndisregisterprotocol 方式与98不同,需要先HOOK PELDR_AddExportTable (用Hook_Device_Service_C就可以),然后在PELDR_AddExportTable的ExportNameList里找到NdisRegisterProtocol这个函数,对之进行取代,就可以了。 补充回答mikeluo,WINME采用的是“NDIS.SYS”!! 祝你成功!给分吧,给分吧! 急需用分下载资料啊。。。 :P | |
| 
 | 
 
							
 
				 
				 
				