首页
社区
课程
招聘
求助。。我的CreateRemoteThread注入为什么被注入进程会崩溃呢?
发表于: 2010-3-5 23:17 7047

求助。。我的CreateRemoteThread注入为什么被注入进程会崩溃呢?

2010-3-5 23:17
7047
注入正常,也能弹框了。但就是被注入进程会崩溃。

// Test.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <windows.h>


BOOL EnablePriviledge();
typedef struct _MyData
{
	char szWord[12];
	DWORD pMyBox;
} MyData;

static DWORD _stdcall MyFunc(MyData * myd)
{
	typedef int (*pMyMessageBox)(HWND,LPCTSTR,LPCTSTR,UINT);
	pMyMessageBox MyMessageBox;
	MyMessageBox = (pMyMessageBox)myd->pMyBox;
	MyMessageBox(NULL,myd->szWord,myd->szWord,NULL);
	return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
	EnablePriviledge();
	DWORD dwProcID;
	MyData mydata;
	strcpy(mydata.szWord,"ab");
	HMODULE hMessage = LoadLibrary("user32.dll");
	DWORD dwAddress = (DWORD)GetProcAddress(hMessage,"MessageBoxA");
	FreeLibrary(hMessage);
	mydata.pMyBox = dwAddress;
	HWND hNotepad = FindWindow("Notepad",NULL);
	if (NULL == hNotepad)
	{
		MessageBox(NULL,NULL,NULL,NULL);
		return 1;
	}
	GetWindowThreadProcessId(hNotepad,&dwProcID);
	HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS,NULL,dwProcID);
	if (NULL == hProcess)
	{
		MessageBox(NULL,NULL,NULL,NULL);
		return 2;
	}	
	void * dwProcAddress = VirtualAllocEx(hProcess,
		0,
		1000,
		MEM_COMMIT ,
		PAGE_EXECUTE_READWRITE);
	if (NULL == dwProcAddress)
	{
		MessageBox(NULL,NULL,NULL,NULL);
		return 4;
	}
	if(0 == WriteProcessMemory(hProcess,dwProcAddress,&MyFunc,1000,NULL))
	{
		MessageBox(NULL,NULL,NULL,NULL);
		return 4;
	}
	MyData * dwDataAddress = (MyData *)VirtualAllocEx(hProcess,
		0,
		sizeof(MyData),
		MEM_COMMIT| MEM_RESERVE,
		PAGE_READWRITE);
	if (NULL == dwDataAddress)
	{
		MessageBox(NULL,NULL,NULL,NULL);
		return 3;
	}
	if(0 == WriteProcessMemory(hProcess,dwDataAddress,&mydata,sizeof(MyData),NULL))
	{
		MessageBox(NULL,NULL,NULL,NULL);
		return 4;
	}

	HANDLE hRemoteThread = CreateRemoteThread(hProcess,
		0,
		0,
		(LPTHREAD_START_ROUTINE)dwProcAddress,
		dwDataAddress,
		0,
		&dwProcID);
//	VirtualFreeEx(hProcess,dwProcAddress,1000,MEM_DECOMMIT|MEM_RELEASE);
//	VirtualFreeEx(hProcess,dwDataAddress,sizeof(MyData),MEM_DECOMMIT);
	CloseHandle(hProcess);
	CloseHandle(hRemoteThread);
	return 0;
}

BOOL EnablePriviledge()
{
	HANDLE hToken;
	TOKEN_PRIVILEGES tkp;
	tkp.PrivilegeCount = 1;
	if(TRUE == OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken))
	{
		LookupPrivilegeValue(NULL,SE_DEBUG_NAME,&tkp.Privileges[0].Luid);
		tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
		AdjustTokenPrivileges(hToken,FALSE,&tkp,sizeof(TOKEN_PRIVILEGES),NULL,NULL);
		CloseHandle(hToken);
		return TRUE;
	}
	else
		return FALSE;
}

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 68
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
自己顶起来。期待大侠指出错误
2010-3-6 21:10
0
雪    币: 45
活跃值: (31)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
把OD设置成默认调试器,然后在崩溃的时候启动调试自己看看吧。
2010-3-6 21:32
0
雪    币: 68
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
感谢你的指点,我也是这么想的,但是。能说说应该具体怎么做么?以前的时候我没有这样调试过呀。呵呵。谢谢。
2010-3-6 22:10
0
雪    币: 450
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
你在定义函数指针时,忽略了调用类型为 __stdcall , 导致堆栈不平衡,这是崩溃的直接原因。
除此之外,还有许多细节错误,最好也一起改了。
2010-3-7 08:05
0
雪    币: 45
活跃值: (31)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
od的“选项”“实时调试设置”,选择“设置OD为默认调试器,附加前无需确认”就可以了。
顺便可能就是如LS所说,MessageBoxA的函数指针应该定义为stdcall的。
2010-3-7 10:05
0
雪    币: 78
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
GetLastError()+printf()
2010-3-7 10:11
0
雪    币: 68
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
谢谢楼上几位。搞定了。呵呵。除了调用约定的问题之外,还有不能再debug版本下使用,据说是加了一个__chkesp的函数导致调用了非法地址。锁帖。呵呵。
2010-3-7 22:47
0
雪    币: 78
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
__chkesp 代码如下。如果esp不等于函数调用前保存的值,就会转到错误处理代码。

004011E0 jne __chkesp+3 (004011e3)
004011E2 ret
004011E3 ;错误处理代码
__chkesp的错误处理会弹出对话框,报告函数调用造成esp值不正确。 Release版本的汇编代码要简洁得多。也不会增加 __chkesp。如果发生esp错误,程序会继续运行,直到“遇到问题需要关闭”。
2010-3-8 18:17
0
雪    币: 33
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
2011-12-7 22:21
0
雪    币: 244
活跃值: (189)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
看雪论坛好好玩.这样的贴楼主都说锁了.反而还可以回复
2014-11-18 17:39
0
游客
登录 | 注册 方可回帖
返回
//