首页
社区
课程
招聘
[原创]汇编学习-《王国保卫战》修改器项目开发
发表于: 1天前 220

[原创]汇编学习-《王国保卫战》修改器项目开发

1天前
220

背景

  • 这是一个32位的程序
  • 基于lua引擎

功能导向,思路与进度

一,游戏关卡中

  1. 实现无限金币
    1. 实现不死基质和指针(由于lua引擎机制导致无法找到不死基质)
    2. 找游戏本体汇编进行代码注入(我们这里抓取访问的代码,抓到的都是专门用于修改的东西,这玩意甚至在游戏暂停时都在不断执行,可能用于修改时间,帧数这种东西,所以我们现在不得不选择其他的方法)
    3. 对操作相关代码实现代码注入,通过对变量名的读取来实现功能性的区分修改——这个方法是合理且正确的
  2. 实现技能冷却为零
  3. 实现英雄无敌
    二,游戏首页成长界面
  4. 实现无限星星
  5. 实现英雄全解锁
    三,综合
  6. 制作静态修改器

全详细流程


首先从系统任务管理器中可以看到这个王国保卫战1是一个32位的游戏,我们正式开始,存在三个思路
1. 实现不死基质和指针(由于lua引擎机制导致我无法轻易找到不死基质)
2. 找游戏本体汇编进行代码注入(我们这里抓取访问的代码,抓到的都是专门用于修改的东西,这玩意甚至在游戏暂停时都在不断执行,可能用于修改时间,帧数这种东西,所以我们现在不得不选择其他的方法)
3. 对操作相关代码实现代码注入,通过对变量名的读取来实现功能性的区分修改——这个方法是合理且正确的,(这其实是第二种方法的延申,事实上这个是可行的)


我们后续的一切修改都基于这个游戏的一个有趣特性,这个游戏在传递变量的同时,下一个地址上的指针正偏移10的地方tmd居然会存储变量名,我们后续将这个变量名视为一种特征值,对整个流通的“管道”进行筛选,改写被我们提前标注的特征值对应的变量

然后寻找注入点,这里有两个注入点(这里随便选一种就可以)

  1. 注入用于读取变量的语句

  2. 注入用于写入变量的语句

下一步就要开始写注入代码了,这里涉及的就是ce的AOB注入相关的知识点,也就是我们通过aob来搜索我们的注入点,然后在注入点这里的ecx就是运输我们变量的寄存器,我们在注入的代码中实现对于我们特征值(lives,player....)这些的筛选

我的脚本如下

{ Game   : Kingdom Rush.exe
  Version:
  Date   : 2026-07-28
  Author : 93953
  Description : 修改金钱、生命、星
}

[ENABLE]

aobscanmodule(INJECT,lua51.dll,8B 29 8B 49 04 89 2C C2) // should be unique
alloc(newmem,$1000,INJECT)
alloc(man_pointer,24)

registersymbol(INJECT)
registersymbol(man_pointer)

label(original_code)
label(return)
label(restore_reg)
label(check_is_gold)
label(check_is_gold_END)
label(check_is_live)
label(check_is_live_END)
label(check_is_star)
label(check_is_star_END)

newmem:
  pushfd
  push eax
  mov eax,[ecx+08] // 拿到指向字符串结构的指针

// 判断此值的类型是否为金钱(player_gold)
check_is_gold:
  cmp dword ptr [eax+10],'play'
  jne check_is_gold_END
  cmp dword ptr [eax+14],'er_g'
  jne check_is_gold_END
  cmp word ptr [eax+18],'ol'
  jne check_is_gold_END
  cmp byte ptr [eax+1A],'d'
  jne check_is_gold_END
  mov [man_pointer],ecx
check_is_gold_END:

// 判断此值的类型是否为生命(lives)
check_is_live:
  cmp dword ptr [eax+10],'live'
  jne check_is_live_END
  cmp byte ptr [eax+14],'s'
  jne check_is_live_END
  mov [man_pointer+8],ecx
check_is_live_END:

// 判断此值的类型是否为升级用的星(total_stars)
check_is_star:
  cmp dword ptr [eax+10],'tota'
  jne check_is_star_END
  cmp dword ptr [eax+14],'l_st'
  jne check_is_star_END
  cmp word ptr [eax+18],'ar'
  jne check_is_star_END
  cmp byte ptr [eax+1A],'s'
  jne check_is_star_END
  mov [man_pointer+10],ecx
check_is_star_END:

restore_reg:
  pop eax
  popfd
  jmp original_code

original_code:
  mov ebp,[ecx]
  mov ecx,[ecx+04]
  jmp return

INJECT:
  jmp newmem
return:

[DISABLE]
INJECT:
  db 8B 29 8B 49 04

unregistersymbol(man_pointer)
dealloc(man_pointer)
unregistersymbol(INJECT)
dealloc(newmem)

注入结束,这下我们就不用每一个关卡都使用手动定位这些金钱血量了


学习到的内容

  1. 一部分本质就是,在变化中寻找不变,这里的不变是一个我们要找的变量,或者是一段运行过程中的特征代码,然后我们围绕这个“特征值”做文章
  2. 综合思路
    1. 就是先寻找到一个变量,然后还原结构体,在相关代码附近发现了其变量名。通过变量名我们就可以对修改的内容进行区分,从而实现修改。
    2. 在这个lua引擎的游戏中,对于数值的修改我们发现都经过了一个步骤,就是使用了一个lua的动态链接库中的一段操作,我们讲这段操作码视为特征值,进行代码注入(这里通过AOB相关函数;来实现定位)

一些想法

  • 在实现代码注入功能时,使用ai的程度该怎么把握
  • 在功能实现后,我们能不能把这个功能从ce中脱离出来,重新封装,来制作成一个完整的游戏修改器.exe
  • 我感觉这个就和餐前小菜一样,对于我的成长收益不太大,其次这玩意学了真的有用吗

参考

        这是一篇关于写这个王国保卫战的修改器的方向非常重合的一篇博客https://tsanfer.com/views/Hack/Cheat_engine-Kingdom_rush.html#cheat-engine-%E6%B1%87%E7%BC%96%E4%BB%A3%E7%A0%81


ai-prompt记录

我现在通过使用ce制作一个王国保卫战的游戏修改器,来学习x86和x64汇编相关的知识和逆向相关的知识点,详细讲讲我这个项目应该怎么进行,学习效果最佳



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

最后于 1天前 被书贤编辑 ,原因:
收藏
免费 0
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回