|  | 
 
| 
void HandleDebugZero(ULONG uImageBase) //主要清零处理函数
x
马上注册,结交更多好友,享用更多功能^_^您需要 登录 才可以下载或查看,没有账号?立即注册  {
 ULONG uAddr_1=uImageBase + 0x4082;//清零CRC检测首地址
 ULONG uAddr_2=uImageBase + 0x6ea8;//清零处1首地址
 ULONG uAddr_3=uImageBase + 0x2228;//清零处2首地址
 GetDnfEprocessAddr(uImageBase);   //取得DNF 进程基址
 //这个进程基址在处理第三和第四处清零的时候用到
 if(uImageBase==0)
 {
 return;
 }
 DisableWP();   //清除CR0
 *(PUSHORT)uAddr_1=0xc3;
 //由于这个检测函数没压入参数,所以直接ret
 
 
 //0x6ea8 //第一处清零首地址,也是直接ret
 *(PUCHAR)(uAddr_2)=0xc3;
 //0x2228 //第二处清零首地址,还是直接ret
 *(PUCHAR)(uAddr_3)=0xc3;
 
 EnableWP();//恢复CR0
 
 g_uDebugPortOffset=g_uDebugPortOffset+0xbc;
 //取到清零位置的地址
 HandleDebugPortPop(true,uImageBase);//处理第三处清零
 HandleDebugPortPush(true,uImageBase);//处理第四处清零
 }
 void HandleDebugPortPop(BOOLEAN bHook,ULONG uImageBase)
 {
 if(bHook)
 {
 //hook pop
 if(uImageBase==0)
 {
 return ;
 }
 g_uDebugPortPopHookAddr=uImageBase+0xbb0f0;//pop hook地址
 g_uDebugPortPopRetAddr=uImageBase+0xba2bc;//pop retn 地址
 if(g_uDebugPortPopHookAddr==0)
 {
 return;
 }
 RtlCopyMemory((PVOID)g_szBackupDebugPortPop,
 (PVOID)g_uDebugPortPopHookAddr,
 5);//保存hook地址,用于恢复
 
 InLineHookEngine(g_uDebugPortPopHookAddr,(int)FuckDebugPortPop);
 //__asm int 3
 }
 else
 {
 if(g_uDebugPortPopHookAddr==0)
 {
 return;
 }
 // 最好判断下 TP是否 已经卸载
 int TesSafe=GetTesSafeBassAddr();
 if(TesSafe!=0)
 {
 //KIRQL Irql=KeRaiseIrqlToDpcLevel();
 DisableWP();
 RtlCopyMemory((PVOID)g_uDebugPortPopHookAddr,
 (PVOID)g_szBackupDebugPortPop,
 5);//保存hook地址,用于恢复
 EnableWP();
 }
 }
 }
 
 void HandleDebugPortPush(BOOLEAN bHook,ULONG uImageBase)
 {
 if(bHook)
 {
 //hook pop
 if(uImageBase==0)
 {
 return ;
 }
 g_uDebugPortPushHookAddr=uImageBase+0xba4ca;//push hook地址
 g_uDebugPortPushRetAddr=uImageBase+0xba2bc;//push retn 地址
 if(g_uDebugPortPushHookAddr==0)
 {
 return;
 }
 RtlCopyMemory((PVOID)g_szBackupDebugPortPush,
 (PVOID)g_uDebugPortPushHookAddr,
 5);//保存hook地址,用于恢复
 
 InLineHookEngine(g_uDebugPortPushHookAddr,(int)FuckDebugPortPush);
 //__asm int 3
 }
 else
 {
 if(g_uDebugPortPushHookAddr==0)
 {
 return;
 }
 // 最好判断下 TP是否 已经卸载
 int TesSafe=GetTesSafeBassAddr();
 if(TesSafe!=0)
 {
 //KIRQL Irql=KeRaiseIrqlToDpcLevel();
 DisableWP();
 RtlCopyMemory((PVOID)g_uDebugPortPushHookAddr,
 (PVOID)g_szBackupDebugPortPush,
 5);//保存hook地址,用于恢复
 EnableWP();
 }
 }
 }
 __declspec(naked)void FuckDebugPortPop()
 {
 //DbgPrint("Pop");
 __asm
 {
 pushfd
 cmp edx,g_uDebugPortOffset //判断入栈的参数是否是清零位置的地址
 jnz POPLABLE
 popfd
 add esp,0x4
 jmp g_uDebugPortPopRetAddr
 POPLABLE:
 popfd
 pop dword ptr [edx]
 jmp g_uDebugPortPopRetAddr
 }
 }
 __declspec(naked)void FuckDebugPortPush()
 {
 //DbgPrint("Push");
 __asm
 {
 pushfd
 cmp edx,g_uDebugPortOffset//判断入栈的参数是否是清零位置的地址
 jnz PUSHLABLE
 popfd
 push 0
 jmp g_uDebugPortPushRetAddr
 PUSHLABLE:
 popfd
 push dword ptr [edx]
 jmp g_uDebugPortPushRetAddr
 }
 }
 
 | 
 |