Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

【建议】使用注入模式 #20

Open
bigsinger opened this issue Jan 9, 2024 · 8 comments
Open

【建议】使用注入模式 #20

bigsinger opened this issue Jan 9, 2024 · 8 comments
Labels
enhancement New feature or request

Comments

@bigsinger
Copy link

https://github.com/bigsinger/Ra2Tool
是从你的项目fork的,感谢你的付出。
注入模式相对来说非常简单,只需要写好汇编代码即可,例如我对辅助功能目前只保留了不变态的全图功能,只需要按照如下调用即可:

//全地图内联代码
#pragma pack(1)
void Map_Assemble() {
	_asm {
		pushad
		mov eax, 0x00A83D4C
		mov edx, [eax]
		mov ecx, 0x0087F7E8
		push edx
		mov eax,0x00577D90
		call eax
		popad
	}
}

// 雷达全开 [[0x00A8B230] + 0x34A4] = 1
void RadarOn_Assemble() {
	_asm {
		pushad
		mov eax, 0x00A8B230
		mov eax, [eax]
		mov byte ptr [eax + 0x34A4], 0x1
		popad
	}
}

// 判断游戏是否运行
 bool isGameRunning() {
	 bool isRunning = false;

	 __try {
		 _asm {
			 pushad
			 mov eax, 0x00A83D4C
			 mov eax, [eax]
			 mov eax, 0x0087F7E8
			 mov eax, [eax]
			 popad
		 }

		 isRunning = true;
	 } __except (EXCEPTION_EXECUTE_HANDLER) {
		 isRunning = false;
	 }
	 return isRunning;
}

#pragma pack()



//地图全开
void openAllMap() {
	if (isGameRunning()) {
		Map_Assemble();
		RadarOn_Assemble();
	} else {
		::Beep(523, 400);	// do
	}
}
@AdjWang
Copy link
Owner

AdjWang commented Jan 11, 2024

我觉得从简洁的角度来说,MSVC 的内联汇编比 CE 的脚本繁琐。如果用 aa_engine.dll 可以直接复制粘贴 CE 脚本,更简单。
还有就是这个得注入 DLL 吧。
除了简洁以外还有没有别的好处?

@bigsinger
Copy link
Author

我觉得从简洁的角度来说,MSVC 的内联汇编比 CE 的脚本繁琐。如果用 aa_engine.dll 可以直接复制粘贴 CE 脚本,更简单。 还有就是这个得注入 DLL 吧。 除了简洁以外还有没有别的好处?

  1. 不确定 aa_engine.dll 是否会容易被杀软误杀
  2. aa_engine.dll 这个很多人下载不到,请把这个dll提交到GitHub代码下
  3. 寻址方便吧,相当于直接操作自己的内存空间了
  4. 注入框架我写好了 有现成的 可以发你

@AdjWang
Copy link
Owner

AdjWang commented Jan 11, 2024

  1. 从杀软的角度看,aa_engine.dll 和 CreateRemoteThread,WriteProcessMemory 这些调用都很危险,注入行为不能解决误杀的问题,注入本来就是异常的软件行为
  2. aa_engine.dll 打包到 Releases 那里了,我再去 ReadMe 里加下说明吧
  3. 寻址确实方便,不过和 aa_engine.dll 比起来,又回到了汇编简洁度的对比上
  4. 用的是 CreateRemoteThread + LoadLibrary 吗?

@bigsinger
Copy link
Author

  1. 从杀软的角度看,aa_engine.dll 和 CreateRemoteThread,WriteProcessMemory 这些调用都很危险,注入行为不能解决误杀的问题,注入本来就是异常的软件行为
  2. aa_engine.dll 打包到 Releases 那里了,我再去 ReadMe 里加下说明吧
  3. 寻址确实方便,不过和 aa_engine.dll 比起来,又回到了汇编简洁度的对比上
  4. 用的是 CreateRemoteThread + LoadLibrary 吗?

用消息钩子注入,不会出现CreateRemoteThread,WriteProcessMemory 等敏感API, 比较稳定

@AdjWang
Copy link
Owner

AdjWang commented Jan 11, 2024

ok,那我可以参考下。如果不开源,可以发到我的邮箱 [email protected]

@bigsinger
Copy link
Author

ok,那我可以参考下。如果不开源,可以发到我的邮箱 [email protected]

开源的,请参考:https://github.com/bigsinger/open/tree/master/src/DllLoader_WH_MOUSE 项目

@AdjWang AdjWang added the enhancement New feature or request label Jan 11, 2024
@AdjWang
Copy link
Owner

AdjWang commented Jul 25, 2024

很抱歉作为新手能力低下,给这个本就美中不足的世界火上浇油,制造了许多垃圾代码,污染了贵仓💀。包含本项目旧版资源泄露问题:

HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0) ;

pid = OpenProcess(PROCESS_ALL_ACCESS,false,id);

根据微软的文档1文档2CreateToolhelp32SnapshotOpenProcess 函数返回的句柄需要手动释放。这个 DWORD TrainerBase::getID() 函数实现的功能恐怕要重构了……
我最近重写了修改器,可以参考新的实现:

void Trainer::UpdateProcState() {

经过一番斗争,我觉得还是采纳这个注入模式,下一版做出来。

@bigsinger
Copy link
Author

变态的功能可以在非联网情况下跟电脑对打的时候开启,如果联网对战,建议只开放不变态的功能,例如地图全开,信标自动删除老的实现无限制下信标的功能 #19 这样相当于只是增加了游戏体验。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

2 participants