我是靠谱客的博主 文静小丸子,最近开发中收集的这篇文章主要介绍利用进程欺骗杀受保护进程,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

欺骗原理:

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

实现过程:

此过程在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.此文章难免有不少错误与欠缺之出,望各专家技术人员批评指正!希望能起到抛砖引玉之效!

最后

以上就是文静小丸子为你收集整理的利用进程欺骗杀受保护进程的全部内容,希望文章能够帮你解决利用进程欺骗杀受保护进程所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(33)

评论列表共有 0 条评论

立即
投稿
返回
顶部