首页
社区
课程
招聘
[旧帖] 关于远程线程注入的问题 0.00雪花
发表于: 2011-11-29 14:41 5540

[旧帖] 关于远程线程注入的问题 0.00雪花

2011-11-29 14:41
5540
我想实现一个这样的功能,一个外部程序通过远程线程注入的方法,来调用我自己写的程序中的一个函数然后传递变量进去,简单说就是一个lua的脚本执行调试器,我写完后发现执行內镶汇编就会出错,一直找不到问题在哪里,求高人指点。。。
HANDLE				hThread;
HANDLE				hProcess;
void				*pRemoteThread;

BOOL _attachProc(char* fileName,char* winName/* = */ )
{
	if(winName == NULL || fileName == NULL)
	{
		return false;
	}
	HWND hStart = ::FindWindow(NULL,winName);
	if (hStart == NULL)
	{
		DWORD dwError = GetLastError();
		return FALSE;
	}
	DWORD PID,TID;
	TID = ::GetWindowThreadProcessId(hStart,&PID);
	BOOL bSuccess = _enableDebugPriv();
	if(!bSuccess)
	{
		//MessageBox("Fuck _enableDebugPriv挂了 可能加了壳","玩蛋去吧");
		printf_s("Fuck _enableDebugPriv挂了 可能加了壳 玩蛋去吧");
		return false;
	}
	//打开宿主进程
	hProcess = OpenProcess(PROCESS_ALL_ACCESS,false,PID);
	if(!hProcess)
	{
		return FALSE;
	}

	//分配空间
	DWORD cbCodeSize = (BYTE*)AfterThreadProc - (BYTE*)ThreadProc;
	DWORD codeSize = cbCodeSize;
	pRemoteThread = VirtualAllocEx(hProcess,0,40,MEM_COMMIT|MEM_RESERVE,
		PAGE_EXECUTE_READWRITE);
	if (!pRemoteThread)
	{
		DWORD dw = GetLastError();
		char chTemp[MAX_PATH];
		sprintf_s(chTemp,"** VirtualAllocEx Error %d",dw);
		printf_s(chTemp);
		return FALSE;
	}
	if(!WriteProcessMemory(hProcess,pRemoteThread,&ThreadProc,1024,0))
	{
		DWORD dw = GetLastError();
		char chTemp[MAX_PATH];
		sprintf_s(chTemp,"** WriteProcessMemory Error %d",dw);
		printf_s(chTemp);
		return FALSE;
	}

	hThread = CreateRemoteThread(hProcess,0,0,
		(LPTHREAD_START_ROUTINE)pRemoteThread,
		(LPVOID)fileName,0,0);
	if(!hThread)
	{
		DWORD dw = GetLastError();
		char chTemp[MAX_PATH];
		sprintf_s(chTemp,"** CreateRemoteThread Error %d",dw);
		printf_s(chTemp);
		return FALSE;
	}
	_callFunction();
	return TRUE;
}

bool _enableDebugPriv()
{
	HANDLE hToken;  // 进程访问令牌的句柄  
	LUID   luid;	// 用于存储调试权对应的局local unique identifier  
	TOKEN_PRIVILEGES tkp;// 要设置的权限
	BOOL bSuccess = OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,&hToken);
	if(!bSuccess)
	{
		//MessageBox("Fuck OpenProcessToken挂了","悲剧再次上演");
		return false;
	}
	// 获取访问令牌
	bSuccess = LookupPrivilegeValue(NULL,SE_DEBUG_NAME,&luid);
	if(!bSuccess)
	{
		//MessageBox("Fuck LookupPrivilegeValue挂了","悲剧再次上演");
		printf_s("Fuck LookupPrivilegeValue挂了\n");
		CloseHandle(hToken);
		return false;
	}
	tkp.PrivilegeCount = 1;// 设置调试权
	tkp.Privileges[0].Luid = luid;
	tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
	bSuccess = AdjustTokenPrivileges(hToken,FALSE,&tkp,sizeof(tkp),NULL,NULL);// 使进程拥有调试权
	if(!bSuccess)
	{
		//MessageBox("Fuck AdjustTokenPrivileges挂了","悲剧再次上演");
		printf_s("Fuck AdjustTokenPrivileges挂了\n");
		CloseHandle(hToken);
		return false;
	}
	CloseHandle(hToken);
	return true;
}

void _callFunction()
{
      _asm
    {

	PUSH fileName;
	MOV EAX,0x004789E0;//此处的调用地址 我通过IDA得到的 release版 为静态函数
	CALL EAX;
}
//函数原型如下
int CScriptEnvironment::DoScriptFileExternal(LPCTSTR szFileName)


我尝试将调用的函数地址替换为messagebox messagebox有弹出无错

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 168
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
为什么没有人回答?我自己顶
2011-11-29 16:09
0
雪    币: 23
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
兄弟,现在远程线程注入已经过时了,写出来的东西,连360的关也过不了,和我一起研究rootkit吧,呵呵,不过你这个想法倒是不错
2011-11-29 21:30
0
雪    币: 19
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
楼主我这里有些源码,你可以加我好友!自己慢慢看。。但是一定WW把所有KX都给我。。
留个QQ990669769
2011-11-30 00:13
0
雪    币: 5
活跃值: (108)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
来这里这么久了

什么还不懂!
2011-12-4 16:40
0
雪    币: 121
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
hThread = CreateRemoteThread(hProcess,0,0,
    (LPTHREAD_START_ROUTINE)pRemoteThread,
    (LPVOID)fileName,0,0);
你的 fileName 没有写进注入的进程空间啊?
fileName 的值也必须写进去!
2011-12-11 19:51
0
雪    币: 121
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
还没有解决?
我给你一个例子:
void CRemote_InjectDlg::OnInject() 
{
	UpdateData(TRUE);
	HANDLE  m_hRemote=::OpenProcess(PROCESS_QUERY_INFORMATION |   // Required by Alpha
		PROCESS_CREATE_THREAD     |   // For CreateRemoteThread
		PROCESS_VM_OPERATION      |   // For VirtualAllocEx/VirtualFreeEx
        PROCESS_VM_WRITE, 
		NULL,m_PID);
	if (NULL==m_hRemote)
	{
		AfxMessageBox("OpenProcess Error !");
	}

	DWORD RemoteThread_PID=0;
	PWSTR MyParameter = NULL;     //base address of the allocated region of pages.

	char *pszLibFile="ago.dll"; 
	int cb  = (1+strlen(pszLibFile))* sizeof(char);
	MyParameter=(PWSTR) VirtualAllocEx(m_hRemote,0,cb,MEM_COMMIT, PAGE_READWRITE);
	if(MyParameter==NULL)
	{
       AfxMessageBox("VirtualAllocEx Error !");
	}

	if(! WriteProcessMemory(m_hRemote,MyParameter,(LPVOID)pszLibFile,cb,NULL)   )
	{
		AfxMessageBox("WriteProcessMemory Error !");
	}
	HMODULE h_dll=LoadLibrary("Kernel32.dll");
	LPTHREAD_START_ROUTINE FuncAdrr=(LPTHREAD_START_ROUTINE)GetProcAddress(h_dll,"LoadLibraryA");
	HANDLE m_hRemoteThread=::CreateRemoteThread(m_hRemote,NULL,0,FuncAdrr,MyParameter,0,&RemoteThread_PID);
	if (NULL==m_hRemoteThread)
	{
		AfxMessageBox("CreateRemoteThread Error !");
	}
//-------------------------------------------------------------------
	WaitForSingleObject(m_hRemoteThread, INFINITE);
	if (MyParameter != NULL) 
		VirtualFreeEx(m_hRemote, MyParameter, 0, MEM_RELEASE);
	
	if (m_hRemoteThread  != NULL) 
		CloseHandle(m_hRemoteThread);
	
	if (m_hRemote != NULL) 
		CloseHandle(m_hRemote);	
	FreeLibrary(h_dll);
//	FreeLibrary(m_dll);

	
}

这个例子是创建一个远程线程,把我的DLL加载到其他进程的地址空间
2011-12-15 10:48
0
雪    币: 2210
活跃值: (12)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
是不是分配内存时出了问题?
2011-12-16 18:00
0
雪    币: 131
活跃值: (161)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
hio
9
_cdecl必须由主调函数恢复堆栈,至于原堆栈在哪……自己找吧
2011-12-18 22:03
0
游客
登录 | 注册 方可回帖
返回