玩了一把内核的创建真实的objectType玩后,我正好处理一个工作上的问题要检测某些东西,而且不能内核hook,不能注入DLL或者代码,只能依靠标准的系统api~~
工作中的问题解决后,突发奇想能不能用同样的方式来检测od。
这个问题的描述大体上是:
1.需要比while(1)反复getwindow枚举更快速的窗体检测模式,且不能是目前有bypass的方法。
2.不使用内核驱动和DLL注入
3.不使用无官方文档的api
4.与启动的先后顺序无关
1限定了getwindow枚举不可用,LL鼠标钩子配合WindowFromPoint不可用
2限定了不能玩内核和DLL注入,也就是没有hook,也没有内核callback的可能
3限定了不能使用没官方文档各种猥琐方法
4说明后启动也要能检测
这么限定,我翻了十几分钟的MSDN找到一个简单api:SetWinEventHook
因为自身的不常见,所以没多少bypass的可能,而且可以在当前进程获取整个系统的Event,不需要注入,另外消息灵活启动的前后顺序无影响。
直接用代码说话
void CALLBACK HandleWinEvent(HWINEVENTHOOK hook, DWORD event, HWND hwnd,
LONG idObject, LONG idChild,
DWORD dwEventThread, DWORD dwmsEventTime)
{
char name[MAX_PATH];
GetWindowTextA(hwnd,name,MAX_PATH);
LONG mStyle = GetWindowLongA(hwnd,GWL_STYLE);
LONG ExtStyle=GetWindowLongA(hwnd,GWL_EXSTYLE);
if(mStyle==0x57c70000&&ExtStyle==0x140)
{
printf("find od 1 %08x %s\r\n",dwEventThread,name);
}
if (mStyle==0x56CF0000&&ExtStyle==0x140)
{
printf("Find od 2 %08x %s\r\n",dwEventThread,name);
}
}
int _tmain(int argc, _TCHAR* argv[])
{
CoInitialize(NULL);
HWINEVENTHOOK hHook = SetWinEventHook( EVENT_MIN , EVENT_MAX , NULL, HandleWinEvent, 0, 0, WINEVENT_OUTOFCONTEXT | WINEVENT_SKIPOWNPROCESS);
if (hHook)
{
printf("set hook ok\r\n");
}
else
{
printf("some hack in this os\r\n");
exit(-1);
}
while(1)
{
MSG msg;
GetMessage(&msg,NULL,0,0);
TranslateMessage(&msg);
}
return 0;
}
好了,完事了。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!