首页
社区
课程
招聘
[讨论]这招是否能在SOD存在的情况下检测被调试
发表于: 2013-4-15 00:20 4521

[讨论]这招是否能在SOD存在的情况下检测被调试

2013-4-15 00:20
4521
首先先说灵感从哪来。。。。
http://bbs.pediy.com/showthread.php?t=167423
看了这个很厉害的病毒分析贴。里面讲了一下此病毒的反调试手段。小白我是第一次见用GetStartupInfo()反调试。所以我就自己试了一下。貌似照抄原病毒的反调试在SOD存在的情况下已经不太给力了。所以我做了个小程序输出了StartupInfo结构的全部域的值。
然后就得到了初步的下面的结果。当然这些结果都是我实验程序的结果没有别的。
我实验来看。。Windows加载器创建进程StartupInfo会有以下值被设置:
cb   lpReserved lpDesktop lpTitle hStdOutput wShowWindow dwFlags

在没有SOD的OD中会增加设置除了
cbReserved2 hStdInput hStdOutput hStdError以外的所有

在有SOD的原版ollydbg中
会设置cb lpReserved lpDesktop lpTitle

最后我写了以下代码验证出 被调试
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPreInstance,  LPTSTR lpCmdLine, int CmdShow)
{
        STARTUPINFO stInfo = {sizeof STARTUPINFO};
        GetStartupInfo(&stInfo);
        //TCHAR szBuffer[1024];
        //swprintf_s(szBuffer, 1024, _T("0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,"), stInfo.cb, stInfo.lpReserved, stInfo.lpDesktop,stInfo.lpTitle, stInfo.dwX, stInfo.dwY,  stInfo.dwXSize, stInfo.dwYSize,  stInfo.dwXCountChars,  stInfo.dwYCountChars, stInfo.dwFillAttribute, stInfo.dwFlags, stInfo.wShowWindow, stInfo.cbReserved2, stInfo.lpReserved2, stInfo.hStdInput, stInfo.hStdOutput, stInfo.hStdError);
        //MessageBox(NULL, szBuffer, NULL, NULL);
        if(stInfo.hStdOutput == 0 && stInfo.wShowWindow == 0 && stInfo.dwFlags == 0)
        {
                MessageBox(NULL, _T("Being Debugged"), NULL, NULL);
        }
        return 0;
}

简单的测试了一下。。不知道是小白我遇到特殊情况了。还是SOD的设置没设置好。还是真捡到漏网之鱼了。兴奋中。。。

谢谢各位回复的兄弟。。在elianmeng的OD中没有提示,所以抱着锲而不舍的精神。。研究了一下我手里的所有OD
然后发现。。我手里的OD+SOD基本上都不会处理hStdOutput这个域。。。
所以又有了以下代码
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPreInstance,  LPTSTR lpCmdLine, int CmdShow)
{
        STARTUPINFO stInfo = {sizeof STARTUPINFO};
        GetStartupInfo(&stInfo);
        /*TCHAR szBuffer[1024];
        //这里是用来看被调试的进程的StartupInfo的哪些域非0的
        swprintf_s(szBuffer, 1024, _T("0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,"), stInfo.cb, stInfo.lpReserved, stInfo.lpDesktop,stInfo.lpTitle, stInfo.dwX, stInfo.dwY,  stInfo.dwXSize, stInfo.dwYSize,  stInfo.dwXCountChars,  stInfo.dwYCountChars, stInfo.dwFillAttribute, stInfo.dwFlags, stInfo.wShowWindow, stInfo.cbReserved2, stInfo.lpReserved2, stInfo.hStdInput, stInfo.hStdOutput, stInfo.hStdError);
        MessageBox(NULL, szBuffer, NULL, NULL);
       //这里开始是针对原版OLLYDBG + SOD
        if(stInfo.hStdOutput == 0 && stInfo.wShowWindow == 0 && stInfo.dwFlags == 0)
        {
                MessageBox(NULL, _T("Being Debugged"), NULL, NULL);
        }*/
        if(stInfo.hStdOutput == 0)
        {
                MessageBox(NULL, _T("Being Debugged"), NULL, NULL);
        }
        return 0;
}
求调试。。求扩散。。。同问是我的od设置 还是。。。通病?
其实GetStartupInfo()这个函数太显眼了。。类似于改文件名为"%S%S"或者是OutputDebugString("%S%S")一样的。。。根本不实用的东西。。。只是讨论一下思路罢了。。
自我感觉随便Hook一下GetStartupInfo。。。就能解决了。。或者Hook一下。。OD的CreateProcess()没有实验。。。这句属于小白的胡说。。如果不是这样的请指正
对了。。更狭隘的地方是。。这个程序。。一般情况下只能用资源管理器打开才不会报被调试。。目测。。没几个人。会在CreateProcess添加上hStdOutput...

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 1042
活跃值: (500)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
这个貌似SOD已经处理过了,详细http://www.52pojie.cn/thread-178161-1-1.html
2013-4-15 09:06
0
雪    币: 967
活跃值: (1138)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
3
你让我兴奋了一下,于是测试了一下,结果:继续努力吧
也可能是我的代码抄袭得不对
上传的附件:
  • 1.GIF (148.48kb,18次下载)
2013-4-15 09:16
0
雪    币: 967
活跃值: (1138)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
4
我给出的建议:别走我的老路,就算你能检测sod+od 又能怎么样?调试器太多,这样处理不行的
要弄就弄个检测所有的,呵呵
其实我目前已经做到了。你多努力吧
2013-4-15 09:20
0
雪    币: 84
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
thanks....确实有点狭隘了。。貌似在我的系统里这个只有原版od+SOD才提示。。。
2013-4-15 14:29
0
雪    币: 84
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
thanks...坚定了我以后发帖先搜索的绝心。。
2013-4-15 14:38
0
游客
登录 | 注册 方可回帖
返回
//