首页
社区
课程
招聘
[原创]算不算Inline Patch
发表于: 2013-6-25 20:07 7871

[原创]算不算Inline Patch

2013-6-25 20:07
7871
  //以挂起的方式启动进程
	PROCESS_INFORMATION pi;
	STARTUPINFO si;
	memset(&pi,0,sizeof(pi));
	memset(&si,0,sizeof(si));
	BOOL lRet= CreateProcess("test.exe",NULL,NULL,NULL,FALSE,CREATE_SUSPENDED,NULL,NULL,&si,&pi);
	if (lRet==FALSE)
	{
		MessageBoxA(0,"Not Find File!",0,0);
		return;
	}
	BYTE command[]={0xEB,0xFE};//2个字节让代码一直jmp当前地址
	HMODULE hModule=GetModuleHandle("user32.dll");
	FARPROC lApi=GetProcAddress(hModule,"CreateWindowExA");//以CreateWindowExA为例
	WriteProcessMemory(pi.hProcess,(LPVOID)lApi,&command,2,NULL);//向API写入EBFE
	ResumeThread(pi.hThread);//恢复线程
	BYTE OldApi[2]={0x8B,0xFF};
  CONTEXT context;
	context.ContextFlags=CONTEXT_FULL;
	while(1)//等待到达CreateWindowExA
	{
		GetThreadContext(pi.hThread,&context);
		if (context.Eip==(UINT)lApi)
		{
			SuspendThread(pi.hThread);//当到达API时,挂起进程
			break;
		}
	}
	//此处进行Patch
	WriteProcessMemory(hProcess,(LPVOID)lApi,&OldApi,1,NULL);//恢复原指令
  ResumeThread(pi.hThread);

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

收藏
免费 5
支持
分享
最新回复 (6)
雪    币: 143
活跃值: (263)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
2
用个 sleep() 不就好了 , 或者把 内存校验给 补丁掉

这个想法很不错 , 补丁到 getVersion 更好
2013-6-25 20:37
0
雪    币: 1042
活跃值: (500)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
getVersion 有些壳也会多次调用的,除非你给补丁加一个次数判断...Sleep 稳定性太差。
2013-6-25 22:13
0
雪    币: 137
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
8错8错
2013-6-25 22:50
0
雪    币: 218
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
不是说对活动线程执行GetThreadContext的结果将不会得到正确结果的么,万一哪天得到了奇怪的结果你也不知道怎么回事
WriteProcessMemory能写入函数头么?那个页面应该是不可写入的啊
而且这么做效率太差了
2013-6-26 12:15
0
雪    币: 1042
活跃值: (500)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
表示实际应用起来效率还真出乎意料。加一个VirtualProtect?
2013-6-26 17:16
0
雪    币: 645
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
VirtualProtect 能设置吗? 貌似不能
2013-12-3 21:34
0
游客
登录 | 注册 方可回帖
返回
//