VC++代码注入,实现对Tutorial的外挂控制

代码注入3种方式:

Ⅰ. Windows 钩子

Ⅱ. CreateRemoteThread 和 LoadLibrary 技术

Ⅲ.CreateRemoteThread和WriteProcessMemory技术

这里我我们使用第二种方式,通过动态加载dll实现代码注入。

第一步:创建Dll工程
 

// Helper.cpp : 定义 DLL 应用程序的导出函数。
//

#include "stdafx.h"
#include "Helper.h"

#pragma data_seg(".Shared")     // 声明共享数据段,并命名该数据段
__volatile int g_Acc =100;
__volatile int g_Value=100;

#pragma data_seg()
#pragma comment(linker, "/Section:.Shared,RWS")



void __stdcall IsRoot()
{
	DWORD adr = 0x00460c54;
	int tmp =0;
	tmp = *(DWORD*)adr + 0x314;
	*(DWORD*)tmp += g_Acc;
	g_Value = *(DWORD*)tmp;
	
}

__declspec(naked) void ChangeValue()
{
	__asm
	{
		pushad
		pushfd
		
		mov eax,IsRoot
		call eax

		popfd
		popad

		mov eax,0x0045C49E
		jmp eax
	}
}

void HookMyCtrl()
{
	LPVOID adr =(LPVOID)0x0045C497;
	DWORD offset =(DWORD)ChangeValue - (DWORD)adr -5;
	BYTE code[5];
	code[0]= 0xe9;//jmp
	*PDWORD(code +1) = offset;//ChangeValue的偏移地址
	DWORD oldprotect;
	if(VirtualProtect(adr,5,PAGE_EXECUTE_READWRITE,&oldprotect))
	{
		memcpy(adr,code,5);
		VirtualProtect(adr,5,oldprotect,&oldprotect);
	}

}
HELPER_API int GetValue()
{
	return g_Value;
}

HELPER_API void SetACC(int value)
{
	g_Acc = value;
}
HELPER_API int GetACC()
{
	return g_Acc;
}
HELPER_API int CalcADD(int a,int b)
{
	return a+b;
}


 

第二步:创建MFC对话框工程

        
HMODULE g_hModule = NULL;
WCHAR srClassName[] =L"TForm2";
WCHAR srWindowName[] =L"Step 2";
typedef int (*PROCTYPDEF)(void);
typedef  void (*PROCSETTYPEDEF)(int);
typedef int (*PROCADD)(int a,int b);
PROCTYPDEF proc=NULL;
PROCSETTYPEDEF procSet=NULL;
PROCTYPDEF procGet=NULL;
PROCADD procAdd =NULL;
void CDllInjectDlg::OnBnClickedOk()
{
	// TODO: 在此添加控件通知处理程序代码
	//OnOK();
	//g_hModule = LoadLibrary(L"Helper.dll");
	//FARPROC WINAPI proc= GetProcAddress(g_hModule,"StartHook");
	//proc();

	DWORD procid =0;
	CWnd* pWnd =  FindWindow(srClassName,NULL);
	if (pWnd)
	{
		GetWindowThreadProcessId(pWnd->m_hWnd,&procid);
		if (procid)
		{
			UpdataToken();
			if(InjectProcess(procid,L"Helper.dll"))
			{
				MessageBox(L"注入成功!");
				g_hModule = LoadLibrary(L"Helper.dll");
				if (g_hModule)
				{
					procGet =(PROCTYPDEF)GetProcAddress(g_hModule,"GetACC");
					proc= (PROCTYPDEF)GetProcAddress(g_hModule,"GetValue");
					procSet= (PROCSETTYPEDEF)GetProcAddress(g_hModule,"SetACC");
					procAdd = (PROCADD)GetProcAddress(g_hModule,"CalcADD");
					
				}
				SetTimer(1,100,NULL);

			}

		}
				
	}

}

void CDllInjectDlg::OnBnClickedCancel()
{
	// TODO: 在此添加控件通知处理程序代码
	OnCancel();

}


void CDllInjectDlg::OnTimer(UINT_PTR nIDEvent)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	switch(nIDEvent)
	{
		case 1:
			{
				if (proc)
				{
					SetDlgItemInt(IDC_ET_VALUE,proc(),TRUE);
				}
				if (procGet)
				{
					SetDlgItemInt(IDC_ET_GetValue,procGet(),TRUE);
				}
			}
			break;
		default:
			break;
	}
	CDialog::OnTimer(nIDEvent);
}

void CDllInjectDlg::OnBnClickedBtSet()
{
	// TODO: 在此添加控件通知处理程序代码
	
	if (procSet)
	{
		int AccValue=0;
		MessageBox(L"写入成功!");
		AccValue = GetDlgItemInt(IDC_ET_SValue,NULL,TRUE);
		procSet(AccValue );
	}
	
}

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值