CE Lua 与 Auto Assembler 协作
CE 允许 Lua 与 Auto Assembler 配合:Lua 管理条件和资源,AA 处理声明、分配及汇编。本文介绍执行边界与启停配对,供已有 AA 基础的读者参考。
分清两种入口
地址表中的 AA 脚本可以包含 {$lua} 和 {$asm} 段;Lua 段不等于独立 Lua 文件。表格加载、脚本启用、脚本停用及语法检查的时机不同。在 Lua 段开头用 if syntaxcheck then return end 避免仅检查脚本时执行带副作用的操作。仅用于生成文本时也应明确预期,避免提前读写目标。
由 Lua 调用 AA
autoAssemble(text) 接受 AA 文本;成功时会返回成功状态及可用于停用的附加信息。启用和停用必须针对同一套脚本及对应的 disableInfo,官方还列出 targetself 参数,默认为目标进程;不要错误地在 CE 自身执行本用于练习目标的代码。先用不写入目标的简单示例学习调用形式。
保存停用信息
成功后妥善保存返回的 disableInfo,停用时调用 autoAssemble(text, disableInfo),并检查是否成功。脚本停用前不要丢失信息或卸载目标;如果启用失败,不要假定分配、注册和跳转都已经完成。AA 的 [DISABLE] 仍要正确还原原始字节、注销符号并释放分配内存。
错误处理与验证
先在官方 Tutorial 中手动启用和停用经过检查的脚本,再考虑自动化。确认启用效果、停用后字节恢复、符号消失;进程重启之后重新解析地址,避免重复使用旧信息。对跳转覆盖长度、原指令搬迁与 RIP 相对寻址有疑问时,先读高级注入章节,不把示例地址当作通用配置。
分配并停用的最小示例
先附加自己启动的 Tutorial。下面只演示在目标进程分配内存、注册符号和停用清理,不覆盖目标指令;一次执行就会启用并随后停用。分配失败时会报告错误。不要在存在同名符号时运行。
local script = [[
[ENABLE]
alloc(MyPracticeBuffer, 256)
registersymbol(MyPracticeBuffer)
[DISABLE]
unregistersymbol(MyPracticeBuffer)
dealloc(MyPracticeBuffer)
]]
local ok, disableInfo = autoAssemble(script)
if not ok then
print("启用失败")
return
end
print("启用后地址: " .. tostring(getAddressSafe("MyPracticeBuffer")))
local stopped = autoAssemble(script, disableInfo)
if not stopped then
print("停用失败,请检查目标进程和脚本")
else
print("停用后地址: " .. tostring(getAddressSafe("MyPracticeBuffer")))
end
成功时第一次地址应可解析,停用后应为 nil。具体错误消息和支持的参数以当前版本附带文档为准;真正的注入脚本还须验证原指令、跳转和原字节。
进一步验证
建议把一次启停当作完整事务来检查。启用前记录目标进程和可验证的原始字节;启用后检查预期代码位置及符号;停用后核对原始字节是否恢复、分配内存和符号是否被释放。若中间某一步失败,先停止继续尝试并记录具体报错。不要混用不同启用操作返回的停用信息,也不要把前一个进程的结果拿到新进程继续使用。