程序拒绝非法访问

本文介绍了一种在C++中实现类成员访问权限控制的方法,通过使用内部类CVisitToken来验证访问者是否拥有正确的地址令牌,以此来限制非法访问。

 在程序设计中,我们通常都只关心程序的结果是不是可靠,健不健壮,容错性如何,但却很少关注程序的访问是不是合法。尤其我们在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里面的私有数据改为一种密钥机制,这样别人即使知道原函数与地址,但是一样不可访问。不过,对于汇编语言就不是这样啦。所以,有时,为防止人们容易用汇编语言破解,通常靠牺牲一些效率,在程序中渗透许多函数调用,且对函数出现位置不要有规律。

<think>我们遇到了一个WinForms程序中的问题:图片资源拒绝访问的报错。这个问题通常发生在尝试访问或操作一个已被其他进程锁定或没有足够权限的文件时。以下是一些可能的原因和解决方法: ### 可能的原因: 1. **文件被其他进程占用**:图片文件可能被其他程序(如图片查看器、编辑器)打开,导致独占锁定。 2. **权限足**:应用程序可能没有足够的权限访问该文件(尤其是在某些受保护的目录中)。 3. **文件路径错误**:尝试访问的文件路径存在或拼写错误。 4. **资源释放问题**:在程序中,如果之前已经打开了该文件(如使用`FileStream`)而没有正确关闭和释放,可能导致文件被锁定。 5. **使用`Image`类后未释放**:在WinForms中,如果使用`Image.FromFile`方法加载图片,它会锁定文件直到图片被释放(Disposed)。 ### 解决方法: 1. **检查文件是否被其他程序打开**:关闭可能占用该文件的程序。 2. **检查文件权限**:确保应用程序有权限访问该文件。可以尝试将文件复制到应用程序的目录(如`bin\Debug`)下,或者以管理员身份运行程序。 3. **检查文件路径**:确保路径正确,最好使用绝对路径进行测试,或者使用相对路径时注意当前工作目录。 4. **确保正确释放资源**: - 如果使用`Image.FromFile`,在需要图片时调用`Dispose()`方法释放资源。 - 或者,使用以下方法加载图片而锁定文件: ```csharp using (FileStream stream = new FileStream(filePath, FileMode.Open, FileAccess.Read)) { pictureBox1.Image = Image.FromStream(stream); } ``` 这样,当`using`块结束时,文件流会被关闭,文件锁也会释放。 5. **使用`Copy`方法**:将文件复制到内存流中,然后从内存流加载图片,这样就会锁定原文件: ```csharp byte[] bytes = File.ReadAllBytes(filePath); using (MemoryStream ms = new MemoryStream(bytes)) { pictureBox1.Image = Image.FromStream(ms); } ``` ### 示例代码(避免文件锁定): ```csharp // 使用文件流加载图片,使用using确保释放 string imagePath = @"C:\path\to\image.jpg"; using (FileStream fs = new FileStream(imagePath, FileMode.Open, FileAccess.Read)) { pictureBox1.Image = Image.FromStream(fs); } // 注意:这样加载后,pictureBox1.Image会持有图片数据,但文件流已经关闭,所以会锁定文件。 // 当需要更换图片或者窗体关闭时,记得释放pictureBox1.Image(如果之前有图片的话,先释放再设置新的,避免内存泄漏) ``` ### 注意事项: - 在设置新的图片到`PictureBox`之前,如果之前有图片,应该先释放旧图片: ```csharp if (pictureBox1.Image != null) { pictureBox1.Image.Dispose(); pictureBox1.Image = null; } ``` - 在窗体关闭时,也应确保释放图片资源。 如果以上方法都能解决问题,可能需要进一步检查是否有其他程序或系统组件锁定了该文件。 §§相关问题§§ 1. 如何检查一个文件是否被其他进程占用? 2. 在WinForms中,除了`Image.FromFile`以外,还有哪些加载图片的方法? 3. 如何为应用程序添加管理员权限以避免权限问题? 4. 在C#中,如何正确处理需要释放的资源(如文件流、图像对象)以防止资源泄漏? 5. 如果图片资源嵌入在程序集中,如何正确访问以避免拒绝访问错误? </think>### WinForm程序出现图片资源拒绝访问错误的解决方法 该错误通常发生在程序尝试访问图片文件时被操作系统拒绝,以下是常见原因及解决方案: #### 常见原因: 1. **文件权限足** - 程序运行账户(如`NETWORK SERVICE`或`IUSR`)无文件读取权限 2. **文件被锁定** - 图片被其他进程(如资源管理器预览、图片编辑器)占用 3. **路径格式错误** - 使用了非法字符(如`? * |`)或系统保留路径 4. **防病毒软件拦截** - 安全软件误判为可疑操作 5. **资源释放问题** - 未正确释放`Image`对象导致文件句柄残留 #### 解决方案: ```csharp // 方法1:使用复制加载避免锁定(推荐) using (var fs = new FileStream(@"C:\images\test.jpg", FileMode.Open, FileAccess.Read)) { pictureBox1.Image = Image.FromStream(fs); // 自动释放文件锁 } // 方法2:提升权限(需谨慎) var fileInfo = new FileInfo(filePath); var security = fileInfo.GetAccessControl(); security.AddAccessRule(new FileSystemAccessRule( WindowsIdentity.GetCurrent().Name, FileSystemRights.ReadData, AccessControlType.Allow)); fileInfo.SetAccessControl(security); // 方法3:检查特殊路径处理 if (path.Contains("Program Files")) { // 改用AppData目录存储图片 string appDataPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); string safePath = Path.Combine(appDataPath, "AppName/images.jpg"); } ``` #### 预防措施: 1. 使用`Application.StartupPath`获取安全路径 2. 对`Image`对象使用`using`或手动调用`Dispose()` 3. 将图片嵌入资源文件: ```csharp pictureBox1.Image = Properties.Resources.MyEmbeddedImage; ``` 4. 添加应用程序清单文件要求管理员权限: ```xml <requestedExecutionLevel level="requireAdministrator" /> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值