原创 360安全卫士程序员志愿者收藏

9月初,偶然用了360安全卫士,觉得很不错。
以前自己也有这个想法写个小程序来除去这些可恶的流氓软件。
现在看到有了
360安全卫士,心里觉得很爽,所以就去申请加入他们的程序员志愿者。
并且很荣幸的成为了他们中的一员

下面是他们发给我的考核题目和我的解答,希望能给大家编程上一些帮助。


================================================================

    编写一个程序,在此程序中运行a.exe,并使得a.exe认为是由explorer.exe运行它的。

        ================================================================

 
 
假设我写的程序名为ddd.exe
 
在这里,我将使用CreateProcess函数来启动 a.exe ,
 
如果不进行任何操作而直接使用CreateProcess函数来运行 a.exe的话,
它默认的父进程将为ddd.exe.
 
在XP/NT系统中CreateProcess函数的调用过程为
1:CreateProcessInternalW
2:NtCreateProcessEx/NtCreateProcess 
3:PspCreateProcess
 
其中NtCreateProcessEx/NtCreateProcess函数
参数ParentProcess的handle指明谁是父进程
所以我要做的就是 在函数CreateProcess函数的调用NtCreateProcessEX/NtCreatProcess时拦截它,
并且把CreateProcess函数传递的ParentProcess参数值 改为explorer.exe的句柄 既可实现目的。
 
步骤1:使用HOOK拦截NtCreateProcess函数
步骤2:取得进程explorer.exe的句柄 更换ParentProcess参数值后,
       继续调用NtCreateProcess函数
 
关键代码段1:取进程explorer.exe的句柄
 
HANDLE hExplorer; //保存explorer.exe的句柄变量
......
......
//取所有系统进程
BOOL Status=Process32First(SnapShot,&ProcessInfo);
int m_nProcess=0;
while(Status)
{
 CString str1;
 str1.Format("%s",ProcessInfo.szExeFile);
 ProcessID[m_nProcess]=ProcessInfo.th32ProcessID;
 
 if(str1=="explorer.exe")  //表明匹配到explorer.exe
 {  
  hExplorer=OpenProcess (PROCESS_ALL_ACCESS,FALSE,ProcessID[m_nProcess]);
  //保存explorer.exe句柄到hExplorer
  break;   //跳出while 
 }
 Status=Process32Next(SnapShot,&ProcessInfo);
 m_nProcess++;
}  // end while
......
......
 
 
关键代码段2:拦截NtCreateProcess函数,并处理
 
dll关键代码:(注:......为代码省略)
//替换函数定义申明
int _stdcall hook_NtCreateProcess( PHANDLE ProcessHandle,
          ACCESS_MASK DesiredAccess,
          POBJECT_ATTRIBUTES ObjectAttributes,
          HANDLE ParentProcess, //就修改这个参数值
          BOOLEAN InheritHandles,
          HANDLE SectionHandle,
          HANDLE DebugPort,
          HANDLE ExceptionPort
          )
         
{
     ......
  ......   //这里为关键代码段1:取进程explorer.exe的句柄并保存给hExplorer
  ......     
  NtCreateProcess(ProcessHandle,DesiredAccess,ObjectAttributes, 
                   hExplorer,  // hExplorer为explorer.exe的句柄
                   InheritHandles,SectionHandle,DebugPort,ExceptionPort);
     ......
  ......
  ......
}
 
//DLLMain 函数中关键代码
 
  HMODULE m_hNtCP = LoadLibrary( "ntdll.dll" );
  g_pNtCP = ( DWORD )GetProcAddress( m_hNtCP, "NtCreateProcess" );
  
  ReadProcessMemory( INVALID_HANDLE_VALUE, ( void * )g_pNtCP,
          ( void * )g_dwOldBytes[0], sizeof( DWORD )*2, NULL );
  //将00400000改写为我们函数的地址
  *( DWORD* )( g_btNewBytes + 1 ) = ( DWORD )hook_NtCreateProcess;
  WriteProcessMemory( INVALID_HANDLE_VALUE, ( void * )g_pNtCP,
        ( void * )g_btNewBytes, sizeof( DWORD )*2, NULL );
 

发表于 @ 2006年10月07日 02:06:00|评论(loading...)|收藏

新一篇: 我给同学们课堂上讲CVS在linux上的配置使用的PPT | 旧一篇:  做QQ桌球游戏外挂——求游戏中的彩球圆心坐标

Csdn Blog version 3.1a
Copyright © ^ǒ^冬瓜