能力值:
( LV2,RANK:10 )
|
-
-
2 楼
自己顶一下。。。
|
能力值:
( 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;
}
}
//--------------------------检测自己函数---------------------------------
|
能力值:
( 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;
}
}
//--------------------------检测自己函数---------------------------------
|
能力值:
( LV8,RANK:120 )
|
-
-
5 楼
简单的原理如上,希望对你有帮助!
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
被编译到“目标文件中的函数地址”和“源代码中的函数声明或者实现”的顺序是一致的嘛?
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
非常感谢,您提供的方法可行!再问一下:
我的校验过程是:
1 在程序某处校验内存代码是否被修改
2 将校验结果保存起来,程序继续运行
3 在某个关键处理中(这个处理随机被触发)检查校验结果,若发现被修改,破坏程序关键数据,不做任何提示。
请问这个方法的安全系数有多高?通常怎么破解?
另外,这种方法在64位系统下是否有兼容性问题?
|
能力值:
( LV8,RANK:120 )
|
-
-
8 楼
貌似和“实现”的顺序是一致的。
你得边写代码边调试,我是这么做的。
|
能力值:
( LV8,RANK:120 )
|
-
-
9 楼
把一些反调试和断点检测技术都加进去会更好点。同时,代码结构的复杂度也要提高些,这样可以增大代码的阅读难度。。
破解是肯定可以破解的,只要去细心的单步跟踪几遍就会有头绪的。
64位?我没研究过。你自己调一下就知道了。如果有差别的话,你在程序里自己判断下就OK了。
|
|
|