在程序设计中,我们通常都只关心程序的结果是不是可靠,健不健壮,容错性如何,但却很少关注程序的访问是不是合法。尤其我们在C++中,本身这种语言设置的访问 机制 都不是针对程序级别的,他们的出现只是帮助人们在编程时尽量少犯错误,免去人们因操作不当而引起某些本身不该接触的数据,结果却被意外的修改了,在编译时期,编译器遇到此类情况时,会给出用户错误警告。但是,对于程序的非法访问,却仍只字未提。
为了实现对类的函数访问权限的限制,我们将引入内嵌于每个将要收保护的类的一个基础类,这个类将记录那些类将会顺利通过访问,哪些地址段的程序访问将得不到结果。
//VisitProctect.CPP
//Write by:Guangbao Xie
//Email:redand_007black@163.com
//Welcome to contact with me .
//Time:2009-06-19
//CopyRight@Reserved
#include<iostream.h>
#include<conio.h>
typedef unsigned long DWROD ;
typedef bool BOOL;
class CVisitToken
{
DWORD dwAddr;
public:
CVisitToken(DWORD dw):dwAddr(dw){}
BOOL operator==(const CVisitToken &ctk)
{
return (ctk.dwAddr==dwAddr);
}
void broadcast(DWORD dw)
{
dwAddr=dw;
}
};
class NEW
{
private:
CVisitToken vkToken;
BOOL Verify(const CVisitToken&ctk)
{
return ((vkToken)==ctk);
}
public:
NEW():vkToken((DWORD)this)
{
}
~NEW()
{
}
void Service(const CVisitToken &ctk)
{
if(!Verify(ctk))
{
cout<<"就你还想骚扰我,门都没有!"<<endl;
return;
}
cout<<"Servicing..."<<endl;
}
void Interface()
{
Service(vkToken);
}
};
int main(int argc, char* argv[])
{
CVisitToken ctk(0x23456677);
NEW n;
n.Interface();
n.Service(ctk);
getch();
return 0;
}
大家可以利用这个原理把CVisitToken里面的私有数据改为一种密钥机制,这样别人即使知道原函数与地址,但是一样不可访问。不过,对于汇编语言就不是这样啦。所以,有时,为防止人们容易用汇编语言破解,通常靠牺牲一些效率,在程序中渗透许多函数调用,且对函数出现位置不要有规律。
程序拒绝非法访问
最新推荐文章于 2021-07-21 05:46:42 发布