阅读:1545回复: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 |
|
|