首先先说灵感从哪来。。。。
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...
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!