S.l.e!ep.¢%

像打了激速一样,以四倍的速度运转,开心的工作
简单、开放、平等的公司文化;尊重个性、自由与个人价值;
posts - 1098, comments - 335, trackbacks - 0, articles - 1
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理
2008/6/23

对其它函数以及自身函数中的软断点(OD)进行检测

/****************************************************************
代码功能:对其它函数以及自身函数中的软断点(OD)进行检测
编写作者:Coderui
编写日期:2008年06月16日
编写语言:C/C++
编译环境:VC++ 6.0
联系邮箱:coderui@163.com
作者博客:http://hi.baidu.com/coderui
****************************************************************/

void Software();    //声明
void Software_End();    //声明

//--------------------------检测其它函数---------------------------------
typedef void (*PTRProtected_Code_Start)();
typedef void (*PTRProtected_Code_End)();

PTRProtected_Code_Start pStart;
PTRProtected_Code_End pEnd;
//--------------------------检测其它函数---------------------------------

//--------------------------检测自己函数---------------------------------
typedef void (*PTRSoftware)();
typedef void (*PTRSoftware_End)();

PTRSoftware pSoftware;
PTRSoftware_End pSoftware_End;
//--------------------------检测自己函数---------------------------------


//--------------------------检测其它函数---------------------------------
void Protected_Code_Start()
{
CString one = L"第一个函数";

AfxMessageBox(one);

_asm
{
//   int 3;
//   mov eax,0xcc;
}
}

void Protected_Code_End()
{
CString two = L"第二个函数";

AfxMessageBox(two);
_asm
{
//   int 3;
}
}
//--------------------------检测其它函数---------------------------------

//--------------------------检测自己函数---------------------------------
void Software()
{
//编写作者:Coderui
//----------检测其它函数----------
pStart = Protected_Code_Start;
pEnd = Protected_Code_End;

DWORD i;
DWORD nSize = (DWORD)pEnd - (DWORD)pStart;
BYTE *p = (BYTE*)Protected_Code_Start;

for(i = 0; i < nSize; i++)
{
   if(*p++ == 0xcc)
   {
    exit(0);
   }
}
//----------检测其它函数----------

//编写作者:Coderui
//----------检测自己函数----------
pSoftware = Software;
pSoftware_End = Software_End;

DWORD j;
DWORD nLen = (DWORD)pSoftware_End - (DWORD)pSoftware;
BYTE *q = (BYTE*)pSoftware;

for(j = 0; j < nLen; j++)
{
   if((*q++ ^ 0x55) == 0x99)//0x99 == 0xCC XOR 0x55
   {
    exit(0);
   }
}
//----------检测自己函数----------
}

void Software_End()
{
CString three = L"第三个函数";

AfxMessageBox(three);
_asm
{
//   int 3;
}
}
//--------------------------检测自己函数---------------------------------


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理