源注入和程序崩溃

时间:2012-11-10 15:06:58

标签: c

今天,我读了一篇文章(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) {
}

1 个答案:

答案 0 :(得分:3)

不幸的是,这种描述已经过时了。最新版本的Windows有一些称为ASLR(地址空间布局随机化)的保护。它保护它们免受基本代码注入的影响,并确保每个进程都有自己的地址空间。并非所有流程都启用了ASLR,但在大多数情况下,旧技术都不适合。

编辑:执行注入的代码然后崩溃了吗?如果是这样,可能是因为EIP寄存器增加了,但没有更多指令在注入的shellcode中执行。您将指令指针设置为已分配的内存并执行代码,但在此过程之后不再执行有效指令。为了防止这种情况,我会分配更多内存并编写一个简单的shellcode,它只是无限循环并阻止EIP在内存中执行一些随机的事情。