[持续更新]过SOD检测OD方法

原创 2016年05月30日 15:04:20

使用异常

Closehandle
如果给CloseHandle()函数一个无效句柄作为输入参数,在无调试器时,将会返回一个错误代码,而有调试器存在时,
将会触发一个EXCEPTION_INVALID_HANDLE (0xc0000008)的异常。

bool getdebebugbyCloseHandle()//返回true说明有OD
{
	__try
	{
		CloseHandle((HANDLE)0x00001234);
		return false;
	}
	__except(1)
	{
		return true;
	}
}


仅在进程初始化创建主线程时执行的代码
//必须先于程序执行 TLS EPO 窗口回调等等
void getdebugbyOEP()
{
	IMAGE_DOS_HEADER*dos_head=(IMAGE_DOS_HEADER*)GetModuleHandle(NULL);
	PIMAGE_NT_HEADERS32 	nt_head=(PIMAGE_NT_HEADERS32)((DWORD)dos_head+(DWORD)dos_head->e_lfanew);
	BYTE*OEP=(BYTE*)(nt_head->OptionalHeader.AddressOfEntryPoint+(DWORD)dos_head);
		for(unsigned long index=0;index<200;index++)
		{
			if(OEP[index]==0xcc)
			{
				ExitProcess(0);
			}
		}
}

GetWindowLongA 获取窗口样式

OD的窗口样式出卖了它

代码:

// checkod.cpp : 定义控制台应用程序的入口点。
//
#include <stdio.h>
#include <Windows.h>


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 main(int argc, char 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);
	}
	MSG msg;
	while(GetMessage(&msg,NULL,0,0))
	{
		
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return 0;
}


窗口名的检测

搜集了常见OD的窗口名特征

#include <stdio.h>
#include <windows.h>
#include <string.h>



BOOL bFind = FALSE;
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
	if (hwnd == INVALID_HANDLE_VALUE)
	{
		return FALSE;
	}
	char szbuf[MAX_PATH] = {0};
	int ilens = 0;
	ilens = GetWindowTextA(hwnd, szbuf, sizeof(szbuf)/sizeof(char));
	if(ilens != 0)
	{
		PCHAR pstr = NULL;
		pstr = strstr(szbuf, "LCG");
		if(pstr == NULL)
			pstr = strstr(szbuf,"- 主线程");
		if(pstr == NULL)
			pstr = strstr(szbuf,"模块 -");
		if(pstr == NULL)
			pstr = strstr(szbuf,"main thread");
		if(pstr == NULL)
			pstr = strstr(szbuf,",module");
		if(pstr == NULL)
			pstr = strstr(szbuf,",- Module;");
		if(pstr == NULL)
			pstr = strstr(szbuf,"- Thread");
		if(pstr == NULL)
			pstr = strstr(szbuf,"G.P.U");
		if(pstr == NULL)
			pstr = strstr(szbuf,"+ 主线程");
		if(pstr == NULL)
			pstr = strstr(szbuf,"主线程,");
		if(pstr == NULL)
			pstr = strstr(szbuf,",模块");
		if(pstr == NULL)
			pstr = strstr(szbuf,"模块 +");
		if(pstr == NULL)
			pstr = strstr(szbuf,"PYG");
		if(pstr == NULL)
			pstr = strstr(szbuf,"FCK");
		if(pstr == NULL)
			pstr = strstr(szbuf,"?块");
		if(pstr == NULL)
			pstr = strstr(szbuf,"主线程");
		if(pstr == NULL)
			pstr = strstr(szbuf,"BH");
		if(pstr == NULL)
			pstr = strstr(szbuf,"吾爱");
		if(pstr == NULL)
			pstr = strstr(szbuf,"破解");
		if(pstr == NULL)
		{
			pstr = strstr(szbuf,"[");
			if(pstr != NULL)
				pstr = strstr(szbuf,"]");
			if(pstr != NULL)
				goto END;
		}
END:			
		if(pstr != NULL)
		{
			bFind = TRUE;
			printf("Find Od!\r\n");
			return FALSE;
		}
			
	}
	return TRUE;
}

VOID EnumOD()
{
	EnumWindows(EnumWindowsProc, NULL);
}

int main(int argc, char* argv[])
{
	EnumOD();
	if (bFind != TRUE)
	{
		printf("Find nothind!\n");
	}
	getchar();
	return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

逆向——进程、线程调试总结

1      进程 1.1    需要调试进程的几种情况: 1)        正常的单进程调试 2)        父进程生成子进程: a)        创建子进程时挂起状态,然后写入代码...
  • mohan90118
  • mohan90118
  • 2016年05月02日 13:04
  • 1716

OD调试多线程(转)

最近很多逆向都是多线程困扰,所以比较无力,百度了一下!转载过来!转载地址:http://blog.csdn.net/whatday/article/details/9059281OD只能单线程调试,也...
  • Youngs0xff
  • Youngs0xff
  • 2017年05月04日 16:25
  • 742

[持续更新]过SOD检测OD方法

使用异常 Closehandle 如果给CloseHandle()函数一个无效句柄作为输入参数,在无调试器时,将会返回一个错误代码,而有调试器存在时, 将会触发一个EXCEPTION_INVAL...
  • zhuhuibeishadiao
  • zhuhuibeishadiao
  • 2016年05月30日 15:04
  • 1814

反调试技术常用API,用来对付检测od和自动退出程序

在调试一些病毒程序的时候,可能会碰到一些反调试技术,也就是说,被调试的程序可以检测到自己是否被调试器附加了,如果探知自己正在被调试,肯定是有人试图反汇编啦之类的方法破解自己。为了了解如何破解反调试技术...
  • super_mimi
  • super_mimi
  • 2014年10月24日 12:11
  • 3942

iOS-自动更新订阅IAP浅谈(设置和测试)

本文由CocoaChina译者Leon(社区ID)翻译 作者:Jaz Garewal 原文:How to Set Up and Test an Auto-Renewable Subscription ...
  • Axing1991
  • Axing1991
  • 2016年03月14日 11:54
  • 1774

显著性检测数据集SOD

  • 2017年09月13日 19:05
  • 9.22MB
  • 下载

显著性检测数据集SOD&amp;SED2;

  • 2017年11月17日 10:22
  • 11.91MB
  • 下载

人脸检测研究2015最新进展(持续更新)

搜集整理了2004~2015性能最好的人脸检测的部分资料,欢迎交流和补充相关资料。 转自:http://www.cvrobot.net/latest-progress-in-face-detec...
  • niujin1212
  • niujin1212
  • 2015年12月16日 15:49
  • 854

RCNN--对象检测的又一伟大跨越 2(包括SPPnet、Fast RCNN)(持续更新)

继续上次的学习笔记,在RCNN之后是Fast RCNN,但是在Fast RCNN之前,我们先来看一个叫做SPP-net的网络架构。 一,SPP(空间金字塔池化,Spatial Pyramid Poo...
  • mydear_11000
  • mydear_11000
  • 2016年07月11日 09:26
  • 713

反调试技术常用API,用来对付检测od和自动退出程序

在调试一些病毒程序的时候,可能会碰到一些反调试技术,也就是说,被调试的程序可以检测到自己是否被调试器附加了,如果探知自己正在被调试,肯定是有人试图反汇编啦之类的方法破解自己。为了了解如何破解反调试技术...
  • u012108436
  • u012108436
  • 2014年09月15日 10:53
  • 422
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[持续更新]过SOD检测OD方法
举报原因:
原因补充:

(最多只允许输入30个字)