利用进程欺骗杀受保护进程

来源:互联网 发布:网络大电影广告植入 编辑:程序博客网 时间:2024/04/30 23:49

欺骗原理:

首先编一个我们将要伪造的程序,使他的名字和我们要杀的进程的名字相同。当我们第一次杀掉那个受保护的进程后马上对它进行改名,然后将伪造的程序复制到要杀的程序所在的目录,这样就达到了欺骗的目的。我猜想,进程保护的原理就是检测系统中是否启动了期望运行的进程,如果没有发现则启动它。如果它被改动或删除,保护进程就象病毒那样自动生成一个它期望运行的进程。因为它是按进程名检测的,那么我们把同样名字的程序替换了它原来的程序,当然我们伪造的程序就变成了受保护的进程了,而那个受保护的进程就这样被我们杀了。

实现过程:

此过程在xp下,用vc6.0完成。

 1.设要杀掉的进程名为:prc.exe,我们不知道它受哪个进程保护。

dos命令窗口被禁用,我们所有的dos操作都调用system()函数来实现。

 2.研究测试发现,它被杀后不断启动。我们尝试第一次结束它后给它改名。

 HANDLE hProcess=OpenProcess(PROCESS_ALL_ACCESS, FALSE,PrcId);

  ::TerminateProcess(hProcess,1)

马上调用函数system(“ren c://windows//system32//prc.exe prc1.exe”)结果失败了,提示找不到文件。

 3.先前发现用开始菜单里的搜索,和在dos下用dir prc.exe/a/s都找不到prc.exe.

 然后查看其属性:system(“attrib c://windows//system32//prc.exe”)发现prc.exe属性为 s h r。就是这个原因我们找不到prc.exe.接着,我们

 system("attrib -s -h -r c://windows//system//ntzd.exe");

 重复2步骤。结果失败了。

 4. 欺骗开始:

 

       首先编个伪造的程序:

  #include

  #include

 

               Void mian()

 

          {

 

               Printf(“Good!^_^!/n”);

 

               Prinft(“We get it!/n”);

 

               Getchar();

 

          }

 

编译运行后保存为prc.exe,暂存到d盘。

 

然后利用程序进行欺骗,欺骗杀进程部分代码如下:

 

void CPrcDlg::OnKILL()

 

{

 

       // TODO: Add your control notification handler code here

 

       UpdateData();

 //计时器,根据CPU时钟周期获得精确的时间,以便可以定时杀进程

 

//***********************************************************

 

       LARGE_INTEGER litmp;

 

       LONGLONG QPart1,QPart2;

 

       double dfMinus, dfFreq, dfTim;

 

       QueryPerformanceFrequency(&litmp);

 

       dfFreq = (double)litmp.QuadPart;// 获得计数器的时钟频率

 

       QueryPerformanceCounter(&litmp);

 

       QPart1 = litmp.QuadPart;// 获得初始值

 

          do

 

       {

 

          QueryPerformanceCounter(&litmp);

 

          QPart2 = litmp.QuadPart;//获得中止值

 

          dfMinus = (double)(QPart2-QPart1);

 

          dfTim = dfMinus / dfFreq;// 获得对应的时间值,单位为秒

 

       }while(dfTim

//***********************************************************

 

 

              CString str,a,b,prcnum;

 

              int CurItem=m_list.GetNextItem(-1,LVIS_SELECTED);

 

              a=m_list.GetItemText(CurItem,2);

 

              HANDLE SnapShot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);

 

              SHFILEINFO shSmall;

 

              PROCESSENTRY32 ProcessInfo;//声明进程信息变量

 

              ProcessInfo.dwSize=sizeof(ProcessInfo);//设置ProcessInfo的大小

 

              //返回系统中第一个进程的信息

 

              BOOL Status=Process32First(SnapShot,&ProcessInfo);

 

              int m_nProcess=0;

 

              int num=0;

 

              while(Status)

 

              {      

 

                     num++;

 

                     m_nProcess++;

 

                     ZeroMemory(&shSmall,sizeof(shSmall));//获取进程文件信息

 

                     SHGetFileInfo(ProcessInfo.szExeFile,0,&shSmall,

 

                                   sizeof(shSmall),SHGFI_ICON|SHGFI_SMALLICON);

 

                     str.Format("%d",ProcessInfo.th32ProcessID);

 

                     if(str==a)

 

                     {

 

HANDLE hProcess= OpenProcess( PROCESS_ALL_ACCESS, FALSE,ProcessInfo.th32ProcessID);

 

                                   if(::TerminateProcess(hProcess,1))  //第一次结束掉进程

 

                                   {

 

 

 

//进程欺骗过程

 

                                          system("attrib -s -h -r c://windows//system/prc.exe");

 

                                          system("ren c://windows//system//prc.exe prc1.exe");

 

                                          system("copy d://prc.exe c://windows//system//prc.exe");

 

                                        m_list.DeleteAllItems();

 

                                          HANDLE SnapShot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);

 

                                          if(SnapShot==NULL)

 

                                          {

 

                                                 MessageBox("检测当前进程失败!");

 

                                          }

 

                                          CPrcDlg::OnREFRESH();

 

                                          prcnum.Format("%d",num);

 

                                          SetDlgItemText(IDC_NUM,prcnum);            

 

                                          break;

 

                                   }

 

                                   else MessageBox("该进程不能被杀!");

 

                        //}

 

                                   break;

 

                     }

 

           //获取下一个进程的信息

 

                     Status=Process32Next(SnapShot,&ProcessInfo);

 

              }

 

              OnREFRESH();

 

              HANDLE hProcess= OpenProcess(PROCESS_ALL_ACCESS, FALSE,Pid);

 

                                   ::TerminateProcess(hProcess,1);      //杀掉explorer.exe.

 

       }

 当程序执行完毕后,我们伪造的进程就被保护起来了,它同样杀不掉,而prc.exe被我们结束掉了。

 4.研究中发现结束掉prc后看不到桌面了,解决办法是:先结束explorer.exe ,然后再运行explorer.exe.

总结:

 1.在欺骗过程中,因未能发现prc.exe被加了s h r属性,屡次欺骗不成功而浪费了很多时间,还差点放弃,所以当全面考虑问题。

 2.这里杀的不是互相守侯的进程,试想用此方法,互相守侯的进程也定能被杀。

 3.在98系统下测试时,发现结束进程后鼠标只能在限定范围移动,然后电脑关机。后来在进程列表里一个一个进程试,终于找到了prc 的保护进程msgsrv32.exe先结束它后(它们不是互相守侯的),再结束 prc.exeprc就不再启动了,电脑也不自动关机了。但鼠标,还受限制,然后我就结束explorer.exe,再启动explorer.exe,并发现有其它进程随它一起启动,有个进程很快闪了下就没了。猜测它是另一个守侯进程,结果证明没错。

 4.在xp下因部分进程系统提示不能结束,因此没能找到保护进程。但我有种隐约的感觉,肯定能把那个保护进程给揪出来。

 5.此文章仅为pc用户杀毒提供一思路之用。有些时候可以给病毒程序所在目录加s,r,h属性以免它被杀后再启动,或进程欺骗以杀之。

6.此文章难免有不少错误与欠缺之出,望各专家技术人员批评指正!希望能起到抛砖引玉之效!