VC++另类实现进程插入(三)

2014-11-23 19:30:42 · 作者: · 浏览: 81
raryName:
nop
nop
nop
nop
nop
nop
nop
nop


//*******代码开始的真正位置*******
REMOTE_THREAD_CODE:

//*******实现地址重定位,ebx保存差值*******
call relocal
relocal:
pop ebx
sub ebx , offset relocal

//////////////////////////////////////////////////////////////////////////
//*******调用LoadLibrary*******
//////////////////////////////////////////////////////////////////////////
//*******压入LoadLibrary参数(动态链接库名)*******
mov eax , ebx
add eax , offset LibraryName
push eax

//*******调用LoadLibrary*******
mov eax , ebx
add eax , offset LoadLibraryAddr
mov eax , [eax]
call eax

or eax , eax
jnz NEXT1
ret
//////////////////////////////////////////////////////////////////////////
//*******以上调用LoadLibrary*******
//////////////////////////////////////////////////////////////////////////

NEXT1:
// *******压入FreeLibrary参数*******
push eax

// *******调用FreeLibrary*******
mov eax , ebx
add eax , offset FreeLibraryAddr
mov eax , [eax]
call eax
//////////////////////////////////////////////////////////////////////////
//*******以上调用FreeLibrary*******
//////////////////////////////////////////////////////////////////////////
ret

}
REMOTE_THREAD_END:
//////////////////////////////////////////////////////////////////////////
////以上为远程线程代码
//////////////////////////////////////////////////////////////////////////


//*******首先获取选中的进程句柄*******

int nSelectedThreadId;
nSelectedThreadId = ((CComboBox *)GetDlgItem(IDC_COM_Proc))->GetCurSel();

nSelectedThreadId = szThreadId[nSelectedThreadId];

HANDLE hSelectedProcHandle;

hSelectedProcHandle = OpenProcess(PROCESS_ALL_ACCESS , FALSE , nSelectedThreadId);
if(!hSelectedProcHandle)
{
MessageBox("打开进程失败!");
return;
}

// *******得到远程线程代码长度*******

int nRemoteThreadCodeLength;

_asm
{
mov eax , offset REMOTE_THREAD_END
mov ebx , offset REMOTE_THREAD_BEGIN
sub eax , ebx
mov nRemoteThreadCodeLength , eax
}

// *******在宿主进程中申请远程线程代码空间*******

LPVOID pRemoteThreadAddr;

pRemoteThreadAddr = VirtualAllocEx(hSelectedProcHandle , NULL , nRemoteThreadCodeLength ,
MEM_COMMIT,PAGE_EXECUTE_READWRITE);

if(!pRemoteThreadAddr)
{
MessageBox("Alloc Memory Error!");
return;
}


//*******向宿主进程空间中复制远程线程代码*******

LPVOID pRemoteThreadCodeBuf;
DWORD nWritenNum , nSuccess;

_asm mov eax , offset REMOTE_THREAD_BEGIN
_asm mov pRemoteThreadCodeBuf , eax

nSuccess = WriteProcessMemory(hSelectedProcHandle