今天,我读了一篇文章(http://www.codeproject.com/KB/threads/winspy.aspx)来描述源注入,我尝试编写一个程序来做同样的事情。但是我向winmind注入了源码并且它崩溃了。我找不到崩溃的原因。
我的代码:
1.描述注入数据结构
typedef LRESULT (WINAPI *MESSAGEBOX)(HWND, LPCWSTR, LPCWSTR, UINT);
typedef struct {
HWND hwnd;
UINT type;
MESSAGEBOX fnMessageBox; // pointer to user32!SendMessage
BYTE pbText[64 * sizeof(TCHAR)]; // text param
BYTE pbTextCap[64 * sizeof(TCHAR)]; // caption param
} INJDATA, *PINJDATA;
typedef struct {
HWND hwnd;
UINT type;
MESSAGEBOX fnMessageBox; // pointer to user32!SendMessage
BYTE pbText[64 * sizeof(TCHAR)]; // text param
BYTE pbTextCap[64 * sizeof(TCHAR)]; // caption param
} INJDATA, *PINJDATA;
2.正在注入的代码
3.将ThreadFunc和INJDATA复制到远程进程,并启动远程ThreadFunc的执行
static int WINAPI ThreadFunc (INJDATA *pData)
{
int nXferred = 0;
nXferred = pData->fnMessageBox( pData->hwnd, (LPCWSTR)pData->pbText, (LPCWSTR)pData->pbTextCap, pData->type );
pData->pbText [63 * sizeof(TCHAR)] = __TEXT('\0');
pData->pbTextCap [63 * sizeof(TCHAR)] = __TEXT('\0');
return nXferred;
}
// This function marks the memory address after ThreadFunc.
// int cbCodeSize = (PBYTE) AfterThreadFunc - (PBYTE) ThreadFunc.
static void AfterThreadFunc (void) {
}
答案 0 :(得分:3)
不幸的是,这种描述已经过时了。最新版本的Windows有一些称为ASLR(地址空间布局随机化)的保护。它保护它们免受基本代码注入的影响,并确保每个进程都有自己的地址空间。并非所有流程都启用了ASLR,但在大多数情况下,旧技术都不适合。
编辑:执行注入的代码然后崩溃了吗?如果是这样,可能是因为EIP寄存器增加了,但没有更多指令在注入的shellcode中执行。您将指令指针设置为已分配的内存并执行代码,但在此过程之后不再执行有效指令。为了防止这种情况,我会分配更多内存并编写一个简单的shellcode,它只是无限循环并阻止EIP在内存中执行一些随机的事情。