本帖最后由 wjx8885577 于 2025-12-24 10:21 编辑
1.菜单创建:在CE反汇编窗口的右键菜单中添加"寄存器高亮"主菜单,包含所有通用寄存器的子菜单
2.交互操作:点击寄存器名称可切换该寄存器的高亮状态(勾选/取消勾选)
3.高亮效果:选中的寄存器在反汇编代码中会显示为黄色背景+黑色文字
4.实时更新:切换后立即重绘视图,无需重启或刷新
5.大小写兼容:能匹配不同大小写格式的寄存器名称
1.智能长度:自动确定最短且唯一的特征码长度
2.多格式输出:同时生成CE、IDA、PEiD和C/C++语言格式的特征码
3.指令感知:识别x64指令前缀(REX/0F)和操作数部分
4.线程安全:使用独立线程避免界面卡顿
5.范围限定:仅在目标模块内搜索,提高效率和准确性
特征码会生成5种风格的代码,类似于下面:
[Asm] 纯文本查看 复制代码 CE Style
E8????????41524989
PEiD Style
E8 ?? ?? ?? ?? 41 52 49 89
IDA Style
E8 ? ? ? ? 41 52 49 89
Code style
\xE8\x?\x?\x?\x?\x41\x52\x49\x89 x????xxxx
C/C++ Style
{ 0xE8, ?, ?, ?, ?, 0x41, 0x52, 0x49, 0x89 }
把LUA脚本放进CE的autorun目录里面,这样CE启动后会自动加载脚本
[Lua] 纯文本查看 复制代码 -- 获取内存窗口中的反汇编视图对象
local disasmView = getMemoryViewForm().DisassemblerView
-- 定义64位和32位寄存器对应的配对关系
local registerPairs = {
{"RAX", "EAX"}, {"RBX", "EBX"}, {"RCX", "ECX"}, {"RDX", "EDX"},
{"RSI", "ESI"}, {"RDI", "EDI"}, {"RBP", "EBP"}, {"RSP", "ESP"},
{"R8", ""}, {"R9", ""}, {"R10", ""}, {"R11", ""},
{"R12", ""}, {"R13", ""}, {"R14", ""}, {"R15", ""}
}
-- 创建一个状态表,用于记录每个寄存器是否需要高亮显示,初始化为全部false
local highlightStates = {}
for _, pair in ipairs(registerPairs) do
highlightStates[pair[1]] = false
end
-- 创建主菜单项,添加到反汇编视图的右键弹出菜单中
local mainItem = createMenuItem(disasmView.PopupMenu)
mainItem.Caption = "寄存器高亮" -- 菜单文字
mainItem.ImageIndex = 38 -- 菜单图标索引
disasmView.PopupMenu.Items.add(mainItem)
-- 存储子菜单项的引用表,方便后续操作
local subMenuItems = {}
for _, pair in ipairs(registerPairs) do
local reg64, reg32 = pair[1], pair[2]
-- 为每个寄存器创建子菜单项
local subItem = createMenuItem(mainItem)
-- 设置菜单显示文字(有32位寄存器的显示为"RAX/EAX"格式)
if reg32 and reg32 ~= "" then
subItem.Caption = string.format("%s/%s", reg64, reg32)
else
subItem.Caption = reg64
end
subItem.Checked = false -- 初始未选中状态
mainItem.add(subItem) -- 将子菜单添加到主菜单
subMenuItems[reg64] = subItem -- 保存引用
end
-- 清除全部高亮功能
local separatorItem = createMenuItem(mainItem)
separatorItem.Caption = '-' -- 分隔符
mainItem.add(separatorItem)
-- 创建"清除全部"菜单项
local clearAllItem = createMenuItem(mainItem)
clearAllItem.Caption = "清除全部高亮"
mainItem.add(clearAllItem)
-- 核心高亮函数:在反汇编后处理文本,为寄存器添加颜色标记
local function highlightDisasm(sender, address, LastDisassembleData, result, description)
for _, pair in ipairs(registerPairs) do
local reg64, reg32 = pair[1], pair[2]
-- 如果该寄存器被标记为高亮
if highlightStates[reg64] then
-- 创建大小写不敏感的正则模式(如"RAX"变为"[Rr][Aa][Xx]")
local pattern64 = reg64:gsub("%a", function(c)
return "[" .. c:upper() .. c:lower() .. "]"
end)
-- 在参数字符串中替换为带颜色的格式(B=背景色,C=前景色,N=重置)
LastDisassembleData.parameters = LastDisassembleData.parameters:gsub(
pattern64, '{BFFFF00}{C000000}%0{N}'
)
-- 对32位寄存器执行相同的操作
if reg32 and reg32 ~= "" then
local pattern32 = reg32:gsub("%a", function(c)
return "[" .. c:upper() .. c:lower() .. "]"
end)
LastDisassembleData.parameters = LastDisassembleData.parameters:gsub(
pattern32, '{BFFFF00}{C000000}%0{N}'
)
end
end
end
return result, description
end
-- 为每个子菜单项设置点击事件处理函数
for reg64, menuItem in pairs(subMenuItems) do
menuItem.OnClick = function(sender)
sender.Checked = not sender.Checked -- 切换选中状态
if disasmView then
disasmView.Repaint() -- 刷新反汇编视图
end
-- 更新寄存器高亮状态
highlightStates[reg64] = not highlightStates[reg64]
end
end
-- "清除全部"点击事件处理函数
clearAllItem.OnClick = function(sender)
-- 遍历所有寄存器子菜单项,取消选中状态并重置高亮状态
for reg64, menuItem in pairs(subMenuItems) do
menuItem.Checked = false
highlightStates[reg64] = false
end
if disasmView then
disasmView.Repaint() -- 刷新反汇编视图
end
end
-- 将高亮函数注册到反汇编器的PostDisassemble事件,使其在每次反汇编后自动调用
getVisibleDisassembler().OnPostDisassemble = highlightDisasm
autorun.7z
(13.66 KB, 下载次数: 353)
|