过腾讯TP保护每个细节分析研究
看懂以下我的分析笔记内容,最好要懂C/c++ 还有windbug 一些基本的,过 NtOpenProcess 函数:
其实这个函数TP只hook了一个地方,只是有的人对比的数据太多了,
超出了NtOpenProcess的范围,找到函数的结尾可以计算出它只有0x283个字节,因此只要对比0x283个字节的数据即可,
通过对比只有一处被TP给HOOK了:
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image029.gif
可以看到向上回溯两层就是一个导出函数NtDebugActiveProcess ,而这个函数的地址前面已经得到,直接拿来用即可。我们要处理的层次关系为:
NtDebugActiveProcess->DbgkpPostFakeProcessCreateMessages->DbgkpPostFakeThreadMessages-->DbgkpQueueMessage
每一级还是以特征码的方式来寻找下一级。
纯文本查看 复制代码
#ifndef HOOKDbgkpPostFakeProcessCreateMessages
#define HOOKDbgkpPostFakeProcessCreateMessages
int DbgkpPostFakeProcessCreateMessagesAddr;
int DbgkpPostFakeThreadMessagesAddr;
int HookDbgkpPostFakeThreadMessagesAddr;
int DbgkpQueueMessageAddr;
int DbgkpQueueMessageAddr_11;
//假DbgkpQueueMessage
__declspec(naked) void MyDbgkpQueueMessage()
{
__asm
{
mov edi,edi
push ebp
mov ebp,esp
sub esp,0B8h
jmp DbgkpQueueMessageAddr_11
}
}
void HookDbgkpPostFakeProcessCreateMessages()
{
//定位DbgkpPostFakeProcessCreateMessages
charcode={(char)0xff,(char)0x75,(char)0x08,(char)0x56,(char)0xe8};
DbgkpPostFakeProcessCreateMessagesAddr=SearchFeature(NtDebugActiveProcessAddr,code,5);
DbgkpPostFakeProcessCreateMessagesAddr=GetCallAddr(DbgkpPostFakeProcessCreateMessagesAddr);
//定位DbgkpPostFakeThreadMessages
charcode2={(char)0xff,(char)0x75,(char)0x0c,(char)0xff,(char)0x75,(char)0x08,(char)0xe8};
DbgkpPostFakeThreadMessagesAddr=SearchFeature(DbgkpPostFakeProcessCreateMessagesAddr,code2,7);
DbgkpPostFakeThreadMessagesAddr=GetCallAddr(DbgkpPostFakeThreadMessagesAddr);
//定位DbgkpQueueMessage并HOOK
charcode3={(char)0x50,(char)0x56,(char)0xff,(char)0x75,(char)0x08,(char)0xe8};
HookDbgkpPostFakeThreadMessagesAddr=SearchFeature(DbgkpPostFakeThreadMessagesAddr,code3,6);
DbgkpQueueMessageAddr=GetCallAddr(HookDbgkpPostFakeThreadMessagesAddr);
DbgkpQueueMessageAddr_11=DbgkpQueueMessageAddr+11;
CallHook(HookDbgkpPostFakeThreadMessagesAddr,(int)MyDbgkpQueueMessage);
}
//恢复
void UnHookDbgkpPostFakeProcessCreateMessages()
{
CallHook(HookDbgkpPostFakeThreadMessagesAddr,(int)DbgkpQueueMessageAddr);
}
#endif
DbgkpPostFakeModuleMessages+0x135 调用了DbgkpQueueMessage ,它的处理方式也是相同的,就不例举代码了。
DbgkpSendApiMessage+0x40 调用了DbgkpQueueMessage ,因为这里回溯的话要很多层CALL才会有导出函数,
所以它的处理方式就稍有不同了,我可以找与它的地址比较近的导出函数或比较近的能定位到的函数。
经过windbg来观察DbgkpSetProcessDebugObject的地址和DbgkpSendApiMessage的地址很接近,
而前面我已经定位到了DbgkpSendApiMessage的地址,因此我从这个函数的地址开始搜索特征码即可,这里就不给出代码了。
另外分析到这个阶段已经过掉了TP的所有HOOK,
驱动要在游戏运行前加载,也会造成蓝屏现象,这可能因为TP也是用的特征码来定位的函数地址,
我们先HOOK了,TP再HOOK就出出错。
因此我修改了驱动代码,创建了设备,添加了派遣函数,在加载驱动的时个只HOOK了:
HookNtOpenProcess();
HookReadVirtualMemory();
HookWriteVirtualMemory();
HookNtOpenThread();
而其他的在驱动通讯派遣函数中来HOOK:
纯文本查看 复制代码
case IRP_MJ_DEVICE_CONTROL:
{
//根据IOCTL区分消息类型
switch (code)
{
case HOOK:
{
HookKeAttchProcess();
HookKeStackAttachProcess();
HookNtDebugActiveProcess();
HookDbgkpPostFakeProcessCreateMessages();
HookDbgkpPostFakeModuleMessages();
HookDbgkpSendApiMessage();
DbgPrint("收到hook的消息\n");
}
break;
case UnHOOK:
{
UnHookKeAttchProcess();
UnHookKeStackAttachProcess();
UnHookNtDebugActiveProcess();
UnHookDbgkpPostFakeProcessCreateMessages();
UnHookDbgkpPostFakeModuleMessages();
UnHookDbgkpSendApiMessage();
DbgPrint("收到UnHook的消息\n");
}
break;
}
}
上面的显示不完整,下载我这个压缩包看吧。
下载看看~~~ 好东西 一直不敢玩TP怕封号 小梦晨 发表于 2016-4-13 12:49
上面的显示不完整,下载我这个压缩包看吧。
谢谢分享
这转载的我给一百分
a74909898 发表于 2016-4-13 18:46
这转载的我给一百分
不管是不是转载的分享给大家就是好东西。
好东西谢谢分享! 哈哈,谢谢分享。。。。
好东西 一直好多游戏只要一改就蓝屏
页:
[1]
2