IP:3.146.107.152 Time:
加载中...
本站首页在线新闻技术文献软件工具国际版

-------- Welcome To Senqice Network  !Thank You For Your Support !--------
文献分类
·网站建设
·系统使用

文献TOP10
·DLL木马进程内幕大揭密
·ASP判断浏览器是移动端和PC端
·批处理教程
·常用DOS命令
·VBScript教程(三)
·Win10 隐藏硬盘上面额外的6个文件夹+3D 对象
·VBScript教程(二)
·VBS编程教程(六)终
·计算机网络基本概念(2)
·QQ被盗,好友不丢。

站内搜索






  本站的大部分软件工具和相关文献都来自网上收集,其版权归作者本人所有,如果有任何侵犯您权益的地方,请联系我,我将马上进行整理,谢谢。

C语言基本语法详解:文件夹变形大法
圣骑士--网络安全技术中心 http://www.senqice.net/
所属分类:网站建设 作者:Hacker Admin 更新日期:2007-8-4
各位观众,欢迎来到全金属的编程讲座。今天我们讲的是文件夹的变形大法。
首先,我们看看这两个图,如图1所示。
一秒前:<img height="33" src="http://www.3800hk.com/news/UploadFiles_9994/200511/20051120022527627.jpg" width="50" /> 一秒后:<img height="33" src="http://www.3800hk.com/news/UploadFiles_9994/200511/20051120022527693.jpg" width="50" /> 怎么样?文件夹变成回收站了!不信?双击进入试试,里面真的是回收站哦。神奇吧!看过本文,你不但能变文件夹为回收站,还可以将它变成各种稀奇古怪的东东!
  首先要说明一下原理:在Windows资源管理器中,Desktop.ini和Folder.htt中定义了文件夹的属性,在Windows 9X下,我们可以在文件夹中建一个Desktop.ini,并在其中输入如下代码:
[.ShellClassInfo]
Clisd={645FF040-5081-101B-9F08-00AA002F954E}
这样文件夹就变成了回收站,但是在Windows XP/2003中就失效了。没关系,另有办法:我们对着文件夹按下F2,改成“×××.{645FF040-5081-101B-9F08-00AA002F954E}”(不要引号),也变形了吧?!这其实也改变了文件夹的属性,效果是一样的。通过资料知道,这其实是运用了微软的Active Desktop技术。下面我们看看如何利用编程实现它。
系统环境:Windows Server 2003 Enterprice Eidtion
开发工具:VC++ 6.0
  本程序是用SDK写的,这篇文章也是给像我这样的菜菜看的,现在很多学编程的菜菜们都爱用VB之类的RAD工具或是一头钻进MFC,以至于编了N年还不知道什么是Windows消息循环,把十分平常的API函数调用(如SendMessage,FindWindows之类)奉之为“技巧”。我没有鄙视的意思,也不是说号召大家以后都这样编程,毕竟用SDK开发太慢了,我只是觉得要想在Windows编程得到较大进步,学习Win32下的SDK编程是不应该省略的,若只会Click处理事件,而不知道其中IDE到底干了什么,那就会阻碍你的进步了!
  下面简略说明一下程序流程:
WinMain函数,程序的入口:
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE ,hPrevInstance,
                     LPSTR     lpCmdLine, int  nCmdShow)
{
    if (-1 == DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAIN), NULL, Main_Proc))
 {
  MessageBox(NULL, "加载对话框出错!" , "", MB_OK);
// MessageBox函数,弹出一个预定义消息框,第一个参数是窗体句柄,第2个参数是消息正文,第三个参数是标题,最后是消息框类型,这里是指有一个确定按钮的消息框.
 }
    return 0;
}
  这里使用了DialogBox,调用一个模式对话框,作为与用户的交互窗口.为什么要这样呢?毕竟在资源文件里做界面比较方便啊,如图2所示。 <img height="250" src="http://www.3800hk.com/news/UploadFiles_9994/200511/20051120022527478.jpg" width="300" /> 那么来看看Main_Proc吧,它是对话框的消息处理函数:
BOOL WINAPI Main_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch(uMsg)
    {
        //BEGIN MESSAGE CRACK
        HANDLE_MSG(hWnd, WM_INITDIALOG, Main_OnInitDialog); //初始化的消息
        HANDLE_MSG(hWnd, WM_COMMAND, Main_OnCommand);  //发给控件们的消息
        HANDLE_MSG(hWnd,WM_CLOSE, Main_OnClose);   //关闭对话框的消息
        //END MESSAGE CRACK
    }
    return FALSE;
}
这里要重点介绍HANDLE_MSG宏,它可以简化你的程序,它在 中。说明如下:
#define HANDLE_MSG(hwnd, message, fn) \
    case (message): return HANDLE_##message((hwnd),
      (wParam), (lParam), (fn))
  这个宏的作用是双重的:首先它消除了冗长的Case 语句,这种 Case 语句在标准的WndProc中实在令人烦恼,再者它使你摆脱必须传送消息处理函数返回值的责任。所以,这里Main_OnInitDialog是WM_INITDIALOG对应的消息处理函数,Main_OnCommand和Main_OnClose也是如此。Main_OnClose很简单,就是EndDialog。Main_OnInitDialog代码如下:
BOOL Main_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam)
{
    HWND hCombo=GetDlgItem(hwnd,IDC_TYPE) ;//IDC_TYPE是一个ComboBox的ID,这个函数可以取得特定ID的控件的句柄
    SendMessage(hCombo,CB_ADDSTRING,0,(LPARAM)"回收站");//第一项
    SendMessage(hCombo,CB_ADDSTRING,1,(LPARAM)"控制面板");//第二项
    SendMessage(hCombo,CB_ADDSTRING,2,(LPARAM)"计划任务");//第三项
    SendMessage(hCombo,CB_SETCURSEL,0,0);//把第一项 回收站 作为默认项放进Combobox的文本框.
    return TRUE;
}
  初始化的作用是为下拉列表框加入列表项,我这里加了5项,指可以伪装成5种不同的外形。这三种外形的代码我放到一个全局数组中:
char DefaultType[5][125]={
   "{645FF040-5081-101B-9F08-00AA002F954E}",//回收站
   "{00000306-0000-0000-C000-000000000046}",//密闭文件夹
   "{00020906-0000-0000-C000-000000000046}",//Word文档
   "{D6277990-4C6A-11CF-8D87-00AA0060F5BF}",//计划任务
   "{21EC2020-3AEA-1069-A2DD-08002B30309D}" //控制面板
   };
  那么我从哪里找到这些代码呢?这些东东都在注册表的HKEY_CLASSES_ROOT\CLSID\CLSID下,你可以自己去找找已经在系统中注册的组件ID加到代码里,为了方便大家,我这里用到了几个比较通用的。
Main_OnCommand函数是处理对话框控件消息的函数,代码如下:
void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
{
    HWND hCombo,hEidt;
    char path[1024]={0},temppath[MAX_PATH]={0},type[125];
    int nIndex=0;
 LPITEMIDLIST pId; //ITEMIDLIST的指针,以后要用 
 BROWSEINFO binfo={0};//开启浏览框用得结构体,初始化为0
    switch(id)
    {
        case IDC_HIDE:  //如果是"伪装"按钮的消息,即按下"伪装" 按钮
            hEidt=GetDlgItem(hwnd,IDC_PATH) ;  //得到编辑框的句柄 
            hCombo=GetDlgItem(hwnd,IDC_TYPE) ;  //得到组合框的句柄
            GetWindowText(hEidt,path,GetWindowTextLength(hEidt)+1);  //得到编辑框中的路径
            nIndex =SendMessage(hCombo,CB_GETCURSEL,0,0L);  //得到组合框中被选项序号
   strcpy(type,DefaultType[nIndex]); //就使用这一项对应的代码
   if (GetWindowTextLength(hEidt)!=0) //如果路径不为空
   {
    Hide(hwnd,path,type); //就伪装它
   }
   else
   {
    MessageBox(hwnd,"路径不能为空","",MB_OK);
   }
  //用来伪装的函数,把参数传递进去
   SetWindowText(GetDlgItem(hwnd,IDC_PATH),NULL); //清空编辑框
        break;
        case IDC_BROW:     //点击"浏览"按钮
   binfo.lpszTitle= "请选择文件夹路径";  //文件夹选取框的标题
   pId = SHBrowseForFolder(&amp;binfo);  //开启文件夹选取框
   if (pId!=0)       
   {
    SHGetPathFromIDList(pId,temppath);  //得到选取的路径
    SetWindowText(GetDlgItem(hwnd,IDC_PATH),temppath);  //把这个路径放到编辑框了
   }
        break;
  case IDC_REC:     //来自”还原”按钮的消息,点击了"还原"按钮
   hEidt=GetDlgItem(hwnd,IDC_PATH) ;
            hCombo=GetDlgItem(hwnd,IDC_TYPE) ;
            GetWindowText(hEidt,path,GetWindowTextLength(hEidt)+1);
   if (GetWindowTextLength(hEidt)!=0) //如果路径不为空
   {
    Recover(hwnd,path); //就回复它
   }
   else
   {
    MessageBox(hwnd,"路径不能为空","",MB_OK);
   } 
   SetWindowText(GetDlgItem(hwnd,IDC_PATH),NULL); //清空编辑框
  break;
        case IDC_EXIT:   //点击"离开按钮"
            EndDialog(hwnd, id); //关掉模态对话框
        break;
        default:
  break;
    }
}
能看懂吧?Hide和Recover分别是伪装和复原的函数:
bool Hide(HWND hwndMain,char *path,char *type)
{
 char output[MAX_PATH+1];
 sprintf(output,"%s.%s",path,type);//把路径和伪装代码按照原理篇中提到的格式放到output中.
 if (output==NULL) //如果为空则退出
 {
  MessageBox(hwndMain,"路径意外地为空","错了",MB_OK);
  return false;
 }
 MoveFile(path,output);//用MoveFile函数改名
 MessageBox(hwndMain,"伪装成功!","OK",MB_OK);
 return true;
}
bool Recover(HWND hwndMain,char *path)
{
 int i=0;
 int pathlen=strlen(path),typelen=strlen(DefaultType[1])+1; //之所以+1是因为还有一个句号
 char output[MAX_PATH+1] ;
 while (i&lt;=pathlen-typelen) //这里是为了去掉后面的伪装代码.得到原文件名
 {
  output[i]=path[i];
  i++;
 }
 if (output==NULL) //如果为空则退出
 {
  MessageBox(hwndMain,"路径意外地为空","错了",MB_OK);
  return false;
 }
 output[i]='\0';  //加个结束符
 MoveFile(path,output);//用MoveFile函数改回原名
 MessageBox(hwndMain,"还原成功!","",MB_OK);
 return true;

  好了,程序做好了,骗骗普通菜鸟还是很好的,我们自己怎么识别这样的程序?其实只要用命令行就可以进入回收站了,如图3所示。之下藏东西方便了! <img height="330" src="http://www.3800hk.com/news/UploadFiles_9994/200511/20051120022527930.jpg" width="506" />
查看人数:1494

设为首页收藏本站广告合作联系我们友情链接
本站页面刷新量: 4712179 人次 ┋ 最高峰: 2009-3-10 22:05:47 7897人在线 现有 57人在线 [网站于 2006-4-1 0:0:0开放统计]
〓圣骑士--网络安全技术中心〓 [Ver 6.1.0]
Copyright © 2004-2024 www.senqice.net All Rights Reserved 
Powered By :Senzx Net
备案序号:冀ICP备06013166号