65.9K
CodeProject 正在变化。 阅读更多。
Home

Windows' Permission 1.5

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.71/5 (6投票s)

2011 年 9 月 8 日

CPL

5分钟阅读

viewsIcon

17056

downloadIcon

1063

此程序可以保护和锁定Windows中的所有窗口,并轻松加密文件。

引言

市面上有很多安全程序,它们以各种形式锁定、加密文件等,但有时使用它们并不容易,而且耗时。此外,其中一些程序非常臃肿且运行缓慢。

这总是促使我想自己开发一个快速、简单且强大的程序。因此,我决定设计一个程序,它可以保护和锁定Windows中的所有窗口,并轻松加密任何文件,即使是大文件。我认为我的程序非常有用。

特点

  • 占用内存和硬盘空间少。
  • 只需几次点击即可快速完成工作。
  • 不更改文件数据。
  • 具有良好且合适的安全性。
  • 锁定所有格式的文件。
  • 锁定出现的每个窗口。
  • 集成到资源管理器中,界面美观。
  • 就像一个小工具。
  • 使用不可逆算法加密文件。
  • 可以在XP、Vista和7上运行。
  • 无需外部程序或库,如.NET Framework。
  • 适用于所有用户,即使您稍后添加用户或使用受限用户帐户。
  • 安装速度非常快。

主要部分一:锁定文件

这工作起来很快,因为当您锁定一个文件时,程序会保持文件处于打开状态,并且不更改文件数据。它简单明了,不允许用户打开、删除、移动、重命名、复制或剪切文件。除非您解锁文件,否则无法进行任何操作。程序在启动时(系统加载时)运行。它不是系统驱动程序。

主要部分二:加密文件

此程序包含两种加密算法。第一种是通用算法,第二种是不可逆算法。即使您加密一个大文件并在程序运行时取消,您仍然可以解密不完整的文件。

主要部分三:锁定窗口

这部分非常有用,并且是一个新的安全主题。您是否曾想过,如果我们没有可执行文件,如何锁定一个窗口,例如“开始菜单”、“操作中心”、“系统属性”、“音量合成器”以及其他重要窗口。

源代码

此单元中有三个程序:安装程序主程序守护程序

安装程序

要运行应用程序,我们首先需要安装必需的文件,或者将这些文件放在我们的程序旁边(同一目录)。我们通过安装程序来完成此操作。文件包括:

  • "mfc100ud.dll" 和 "msvcr100d.dll" 放到 "windows\system32" 目录
  • "calibri.ttf" 放到 "windows\fonts" 目录

由于安装程序必须可执行,我们将这些文件放在 Installer.exe 旁边。然后,为了安装这些文件,我们需要检测 "Windows 盘符"。为此,我们使用下面的代码,并且由于这是第一次需要,我们将其放在 OnInitDialog 函数中。“OnInitDialog”会执行其中编写的所有代码。我们将以下变量定义为全局变量。

CString address,pathi,pathw,os,osd;
bool bos=1;
CFile f;
TCHAR tc[260];

BOOL CWindowssPermission1InstalerDlg::OnInitDialog(){
        CDialogEx::OnInitDialog();
    // Set the icon for this dialog. The framework does this automatically
    //  when the application's main window is not a dialog
    SetIcon(m_hIcon, TRUE);            // Set big icon
    SetIcon(m_hIcon, FALSE);        // Set small icon

    SetBackgroundColor(RGB(101,158,224));    //Set Background Color
    TCHAR tc[260];GetWindowsDirectory(tc,260);osd=tc;    //Get Windows Directory
    GetCurrentDirectory(260,tc);pathw=tc;    //Get Current Directory

    return TRUE;  // return TRUE  unless you set the focus to a control
}

下一步是确定操作系统:XP、Vista 或 7,然后将其存储在 "os" 变量中,最后存储在 "wu"(Windows 用户文件夹)文件中。主程序使用它。

为了获取文本,我们定义了一个名为 "CinputBox" 的类并使用它。之后,程序需要一个安全密码才能运行、卸载和管理程序。我们将密码保存在 "MicM.dll" 中。而在 "MicN.dll" 中,我们保存 "Windows 用户目录",因为主程序会使用它。我们使用这些来判断程序是否已安装。这是一种关联。为了提高安全性,我们需要在启动时加载程序,因此我们创建一个带有设置的 ".reg" 文件。

主程序

加密、锁定和基本应用程序都在这部分。有多个部分,"Explorer"(资源管理器)、"Icon Tray"(图标托盘)、"Lock"(锁定)等等。我们有这些全局变量。

const int filecount=10000,windowcount=10000;
CRect rc[29],r1/*Rect of Window*/,r2/*Rect of Operation System*/;
CPoint p1,pc/*Point of Cursor*/;
CString pathw/*Path of Window*/,pathe/*Path of Explorer*/
    ,tic/*Type of Central Item*/,til/*Type of Left Item*/
    ,nic/*Name of Center Item*/,nir/*Name of Right Item*/
    ,nil/*Name of Left Item*/,tir/*Type of Right Item*/
    ,plf[filecount]/*Passwords of Files*/,pplf[filecount]/*Paths of Files*/
    ,wl[windowcount][2]/*Window Lock*/
    ,pfc/*Path of File Copy/Cut*/,os;
int cc=0/*Stop OnPaint*/,c/*List Count*/,b=-1/*Button Press*/,w=112/*Window Width*/
    ,h=211/*Window Height*/,ow=150/*Opacity Window Timer*/
    ,dx1=-8,dy1=-93,xw=0,yw=0,ifc=0/*Index of Center Item*/,tf[filecount][2]
    ,tw[windowcount]/*ask for passwoord*/,lcfu=0,ccf=0/*Copy=0,Cut=1*/
    ,locktime=0;
bool s1=1/*Start Opacity*/,s2=0/*Status of Window*/,active=1;
CImage i1/*Back Ground 1*/,il/*Left Item*/,ic/*Central Item*/,ir/*Right Item*/;
COLORREF cl=RGB(0,162,232);
CFile lf[filecount]/*Lock Files*/,fq,fz;
HWND hd=0;

OnInitDialog 函数中执行的一些任务包括:

  1. 程序是否已加载?如果是,则退出。
  2. 程序是否已卸载或损坏?如果是,则退出。
  3. 加载程序目录。
  4. xwyw 加载程序坐标,包括应用程序在屏幕上的 **X** 和 **Y** 坐标。
  5. qw 文件加载 Windows 密码及其名称。
  6. zw 文件加载文件密码及其名称。
  7. tw 文件加载自动锁定时间。
  8. wu 文件加载 Windows 用户目录。
  9. 启动守护程序
  10. 加载图标托盘。

OnTrayNotify 中,我们管理图标托盘和菜单。

我们在 OnPaint 中设计和加载背景及资源管理器外观。当应用程序需要重绘时,操作系统会调用此函数。

OnTimer 是最重要的函数。它包括锁定、加密和窗口移动。操作系统会自动以特定间隔调用“OnTimer”。顺便说一句,我没有在对话框中使用任何按钮。我认为这种方法更好,因为它质量更高,并且占用的内存空间更少。当然,如今这已经不重要了。而且,我们可以设计我们心中想要的任何东西。我为每个按钮定义了矩形。

IsNear 是一个检查一个点是否在一个矩形内的函数。在 OnMouseMove 中,如果光标位于矩形之一内,我们将一个关系号放入一个全局变量,然后在 OnLButtonDown 中运行关系代码。

GetCursorPos(&pc);//get curent coordinates of cursor and put in "pc"(pointer cusrsor)
if(IsNear(pc.x,pc.y,r1,50)){
    int x=0,y=0;x=pc.x-r1.left-dx1;y=pc.y-r1.top-dy1;
    if(ow<255&&s1){SetTimer(3,10,0);s1=0;}        //Start Opacity Window 255
    if(IsNearX(x,y,rc[0],1))b=0;        //Computer
    else if(IsNearX(x,y,rc[1],1))b=1;        //Desktop
    else if(IsNearX(x,y,rc[2],1))b=2;        //My Documents
    else if(IsNearX(x,y,rc[3],1))b=3;        //My Videos
    else if(IsNearX(x,y,rc[4],1))b=4;        //My Music
    else if(IsNearX(x,y,rc[5],1))b=5;        //My Pictures
    else if(IsNearX(x,y,rc[6],1))b=6;        //My Favorites
    else if(IsNearX(x,y,rc[7],1))b=7;        //Links
    else if(IsNearX(x,y,rc[8],1))b=8;        //microsoft.com
    else if(IsNearX(x,y,rc[9],1))b=9;        //linux.com
    else if(IsNearX(x,y,rc[10],1))b=10;        //google.com
    else if(IsNearX(x,y,rc[11],1))b=11;        //Close
    else if(IsNearX(x,y,rc[12],1))b=12;        //Minimize
    else if(IsNearX(x,y,rc[16],1))b=16;        //Make Folder
    else if(IsNearX(x,y,rc[17],1))b=17;        //Lock
    else if(IsNearX(x,y,rc[18],1))b=18;        //UnLock
    else if(IsNearX(x,y,rc[19],1))b=19;        //Copy
    else if(IsNearX(x,y,rc[20],1))b=20;        //Cut
    else if(IsNearX(x,y,rc[21],1))b=21;        //Past
    else if(IsNearX(x,y,rc[22],1))b=22;        //Delete
    else if(IsNearX(x,y,rc[23],1))b=23;        //Rename
    else if(IsNearX(x,y,rc[25],1))b=25;        //Back
    else if(IsNearX(x,y,rc[26],1)&&!s2)b=26;        //UnLock Out
    else if(IsNearX(x,y,rc[27],1)&&!s2)b=27;        //Lock Out
    else if(IsNearX(x,y,rc[28],1))b=28;        //Option
    else {b=-1;}

LoadToTray 函数在任务栏上设置图标以使用菜单。加密和解密代码在此处显示。

inline CString encrypt(CString str){
  CString s1(_T(""));USES_CONVERSION;unsigned char c1=0;char *c=0;
  for(register int i=str.GetLength()-1;i>=0;i--){
    c1=0;c=0;c=T2A(str.Mid(i,1).GetBuffer());c1=*c;
    unsigned char i1=((int)c1),i2,i3,i4;int i5;i2=i3=i4=i5=i1;
    i2*=2;i2/=128;i2=!i2;i2*=64;/*7th bit*/i3/=128;
    i3*=128;/*8th bit*/i4*=4;i4/=4;/*(1-6)th bit*/
    i5=255-(i2+i3+i4)+1;s1+=((char)i5);
  }
  return s1;
}

密码学

我应用的加密逻辑是:

inline CString encrypt(CString str){
  CString s1(_T(""));USES_CONVERSION;unsigned char c1=0;char *c=0;
  for(register int i=str.GetLength()-1;i>=0;i--){
    c1=0;c=0;c=T2A(str.Mid(i,1).GetBuffer());c1=*c;
    unsigned char i1=((int)c1),i2,i3,i4;int i5;i2=i3=i4=i5=i1;
    i2*=2;i2/=128;i2=!i2;i2*=64;/*7th bit*/i3/=128;
    i3*=128;/*8th bit*/i4*=4;i4/=4;/*(1-6)th bit*/
    i5=255-(i2+i3+i4)+1;s1+=((char)i5);
  }
  return s1;
}

解密逻辑:

CString dec(CString str){
  CString s1(_T(""));USES_CONVERSION;unsigned char c1=0;char *c=0;
  for(register int i=str.GetLength()-1;i>=0;i--){
    c1=0;c=0;c=T2A(str.Mid(i,1).GetBuffer());c1=*c;
    unsigned char i1=255-((int)c1)+1,i2,i3,i4,i5;i2=i3=i4=i5=i1;
    i2*=2;i2/=128;i2=!i2;i2*=64;i3/=128;i3*=128;i4*=4;i4/=4;
    i5=i2+i3+i4;s1+=i5;
  }
  return s1;
}

守护程序

这部分只有一个职责。如果主程序关闭,它会打开它。Find 函数查找主程序的句柄,并使用 IsWindow 检查它是否打开。请看下面的代码。

if(!Find()){
    ShellExecute(0,0,pathw+_T("\\Windows's Permission 1.exe"),0,0,1);
}

技术

关于安全实现,我使用了一种称为Nod32的技术。程序由两个部分组成:主程序和守护程序。它将文件保持在读取模式,并且不关闭它们来锁定它们。如果您解锁了一个文件或窗口,但忘记再次锁定它,锁定将自动激活。

//Load automatically Lock Time
if(fd.Open(pathw+_T("\\Data\\tw"),CFile::modeRead)){
    fd.Read(&gf[0],fd.GetLength());
    locktime=atoi(gf);    //set lock time automatically
    for(ie=0;ie<1000000;ie++)
        gf[ie]=0;
    fd.Close();
}
//Load os
if(fd.Open(pathw+_T("\\Data\\wu"),CFile::modeRead)){
    fd.Read(&gf[0],fd.GetLength());
    os=gf;
    for(ie=0;ie<1000000;ie++)
        gf[ie]=0;
    fd.Close();
}

局限性

不幸的是,这个程序和算法存在缺陷。

  • 它不是一个系统驱动程序。这意味着如果您关闭系统或移除硬盘,文件和窗口将会打开并释放。它仅适用于始终开启的计算机,例如电信计算机,甚至网吧。
  • 加密算法不够强大。
© . All rights reserved.