看流星社区

 找回密码
 注册账号
查看: 1979|回复: 1

周末有点时间系列:一击必杀检测OD

[复制链接]

该用户从未签到

发表于 2013-4-1 09:35:03 | 显示全部楼层 |阅读模式
玩了一把内核的创建真实的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;
}

该用户从未签到

发表于 2013-4-2 00:05:05 | 显示全部楼层
拜托把转载写上,别把别人东西拿来装
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-4-30 15:28

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

快速回复 返回顶部 返回列表