AdjWang / RA2YurisRevengeTrainer

红色警戒2 尤里的复仇v1.001 内存修改器
76 stars 8 forks source link

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

Open bigsinger opened 8 months ago

bigsinger commented 8 months ago

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 commented 8 months ago

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

bigsinger commented 8 months ago

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

  1. 不确定 aa_engine.dll 是否会容易被杀软误杀
  2. aa_engine.dll 这个很多人下载不到,请把这个dll提交到GitHub代码下
  3. 寻址方便吧,相当于直接操作自己的内存空间了
  4. 注入框架我写好了 有现成的 可以发你
AdjWang commented 8 months ago
  1. 从杀软的角度看,aa_engine.dll 和 CreateRemoteThread,WriteProcessMemory 这些调用都很危险,注入行为不能解决误杀的问题,注入本来就是异常的软件行为
  2. aa_engine.dll 打包到 Releases 那里了,我再去 ReadMe 里加下说明吧
  3. 寻址确实方便,不过和 aa_engine.dll 比起来,又回到了汇编简洁度的对比上
  4. 用的是 CreateRemoteThread + LoadLibrary 吗?
bigsinger commented 8 months ago
  1. 从杀软的角度看,aa_engine.dll 和 CreateRemoteThread,WriteProcessMemory 这些调用都很危险,注入行为不能解决误杀的问题,注入本来就是异常的软件行为
  2. aa_engine.dll 打包到 Releases 那里了,我再去 ReadMe 里加下说明吧
  3. 寻址确实方便,不过和 aa_engine.dll 比起来,又回到了汇编简洁度的对比上
  4. 用的是 CreateRemoteThread + LoadLibrary 吗?

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

AdjWang commented 8 months ago

ok,那我可以参考下。如果不开源,可以发到我的邮箱 wwang230513@gmail.com

bigsinger commented 8 months ago

ok,那我可以参考下。如果不开源,可以发到我的邮箱 wwang230513@gmail.com

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

AdjWang commented 1 month ago

很抱歉作为新手能力低下,给这个本就美中不足的世界火上浇油,制造了许多垃圾代码,污染了贵仓💀。包含本项目旧版资源泄露问题: https://github.com/AdjWang/RA2YurisRevengeTrainer/blob/03c472498d28e10227e153e0ab061b0ea818b7ae/RATrainer/trainerbase.cpp#L12 https://github.com/AdjWang/RA2YurisRevengeTrainer/blob/03c472498d28e10227e153e0ab061b0ea818b7ae/RATrainer/trainerbase.cpp#L44

根据微软的文档1文档2CreateToolhelp32SnapshotOpenProcess 函数返回的句柄需要手动释放。这个 DWORD TrainerBase::getID() 函数实现的功能恐怕要重构了…… 我最近重写了修改器,可以参考新的实现: https://github.com/AdjWang/RA2YurisRevengeTrainer/blob/4f39fb0377d61ea774e2a90125626487b8129181/src/trainer.cpp#L439

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

bigsinger commented 1 month ago

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