首页
社区
课程
招聘
[旧帖] [求助]对程序进行内存镜像检验怎么实现? 0.00雪花
发表于: 2008-10-17 10:45 7178

[旧帖] [求助]对程序进行内存镜像检验怎么实现? 0.00雪花

2008-10-17 10:45
7178
我想实现对自己的程序进行自校验以防止修改,但如果单纯对物理文件进行校验,很容易被Crack掉。个人感觉对内存镜像进行校验相对安全,但不知道如何实现,请大侠们指点。

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

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 190
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
自己顶一下。。。
2008-10-17 11:59
0
雪    币: 288
活跃值: (53)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
3
/****************************************************************
代码功能:内存补丁(代码完整性)检测,带自检测功能
编写作者:Coderui
编写日期:2008年06月17日
编写语言:C/C++
编译环境:VC++ 6.0
联系邮箱:coderui@163.com
作者博客:http://hi.baidu.com/coderui
****************************************************************/

void Software_Patching();   //声明
void Software_Patching_End();   //声明(在调用的后面出现,所以需要提前声明)

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

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

//--------------------------检测自己函数---------------------------------
typedef void (*PTRSoftware_Patching)();
typedef void (*PTRSoftware_Patching_End)();

PTRSoftware_Patching pSoftware_Patching;
PTRSoftware_Patching_End pSoftware_Patching_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;
}
}
//--------------------------检测其它函数---------------------------------

//--------------------------检测自己函数---------------------------------
//--------------------------检测自己函数---------------------------------
DWORD dwCorrectChecksum_me = 0xE2175AF4;

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

DWORD nSize = (DWORD)pEnd - (DWORD)pStart;
DWORD dwCorrectChecksum = 0x1F5AE92F;

_asm
{
   mov esi,pStart;
   mov ecx,nSize;
   xor eax,eax;

checksum_loop:

   movzx ebx,byte ptr [esi];
   add eax,ebx;
   rol eax,1;
   inc esi;
   loop checksum_loop;

   cmp eax,dword ptr [dwCorrectChecksum];
   je Coderui;
   push 0x0;
   call [exit];

Coderui:
}
//----------检测其它函数----------

//编写作者:Coderui
//----------检测自己函数----------
pSoftware_Patching = Software_Patching;
pSoftware_Patching_End = Software_Patching_End;

DWORD nLen = (DWORD)pSoftware_Patching_End - (DWORD)pSoftware_Patching;

_asm
{
   mov esi,pSoftware_Patching;
   mov ecx,nLen;
   xor eax,eax;

checksum_me_loop:

   movzx ebx,byte ptr [esi];
   add eax,ebx;
   rol eax,1;
   inc esi;
   loop checksum_me_loop;

   cmp eax,dword ptr [dwCorrectChecksum_me];
   je Coderui_me;
   push 0x0;
   call [exit];

Coderui_me:
}
//----------检测自己函数----------*/
}

void Software_Patching_End()
{
CString four = L"第四个函数";

AfxMessageBox(four);
_asm
{
//   int 3;
}
}
//--------------------------检测自己函数---------------------------------
2008-10-17 16:43
0
雪    币: 288
活跃值: (53)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
4
/****************************************************************
代码功能:对其它函数以及自身函数中的软断点(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;
}
}
//--------------------------检测自己函数---------------------------------
2008-10-17 16:44
0
雪    币: 288
活跃值: (53)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
5
简单的原理如上,希望对你有帮助!
2008-10-17 16:44
0
雪    币: 190
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
被编译到“目标文件中的函数地址”和“源代码中的函数声明或者实现”的顺序是一致的嘛?
2008-10-20 16:21
0
雪    币: 190
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
非常感谢,您提供的方法可行!再问一下:
我的校验过程是:
1 在程序某处校验内存代码是否被修改
2 将校验结果保存起来,程序继续运行
3 在某个关键处理中(这个处理随机被触发)检查校验结果,若发现被修改,破坏程序关键数据,不做任何提示。

请问这个方法的安全系数有多高?通常怎么破解?
另外,这种方法在64位系统下是否有兼容性问题?
2008-10-20 17:58
0
雪    币: 288
活跃值: (53)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
8
貌似和“实现”的顺序是一致的。

你得边写代码边调试,我是这么做的。
2008-10-20 19:10
0
雪    币: 288
活跃值: (53)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
9
把一些反调试和断点检测技术都加进去会更好点。同时,代码结构的复杂度也要提高些,这样可以增大代码的阅读难度。。

破解是肯定可以破解的,只要去细心的单步跟踪几遍就会有头绪的。

64位?我没研究过。你自己调一下就知道了。如果有差别的话,你在程序里自己判断下就OK了。
2008-10-20 19:17
0
游客
登录 | 注册 方可回帖
返回
//