Loading...
Loading...
Compare original and translation side by side
connectconnectdecompilertypesre-sourcedecompilertypesre-source-- 1) Confirm target row/function before editing
SELECT * FROM funcs WHERE address = 0x401000;
-- 2) Inspect current comment state
SELECT ea, line, comment
FROM pseudocode
WHERE func_addr = 0x401000
LIMIT 30;
-- 3) Inspect existing disassembly comments
SELECT * FROM comments WHERE address BETWEEN 0x401000 AND 0x401100;func_addr + eaidxslot-- 1) 编辑前确认目标行/函数
SELECT * FROM funcs WHERE address = 0x401000;
-- 2) 检查当前注释状态
SELECT ea, line, comment
FROM pseudocode
WHERE func_addr = 0x401000
LIMIT 30;
-- 3) 检查现有汇编代码注释
SELECT * FROM comments WHERE address BETWEEN 0x401000 AND 0x401100;func_addr + eaidxslotannotationsdecompilerannotationstypesannotationsre-sourceannotationsdecompilerannotationstypesannotationsre-sourceannotate this functionfuncs.rpt_commentdecompile(addr, 1)add a commentfunc-summaryfunction summaryannotate this functionfuncs.rpt_commentdecompile(addr, 1)funcspseudocodecommentsfuncs.commentfuncs.rpt_commentadd function commentUPDATE funcs SET rpt_comment = ...funcs.commentpseudocodeSELECT address, name, comment, rpt_comment
FROM funcs
WHERE address = 0x401000;
UPDATE funcs
SET rpt_comment = 'One-paragraph summary of what the function does, inputs/outputs, and key behavior.'
WHERE address = 0x401000;funcspseudocodecommentsfuncs.commentfuncs.rpt_commentUPDATE funcs SET rpt_comment = ...funcs.commentpseudocodeSELECT address, name, comment, rpt_comment
FROM funcs
WHERE address = 0x401000;
UPDATE funcs
SET rpt_comment = '一段描述函数功能、输入/输出及关键行为的摘要。'
WHERE address = 0x401000;pseudocodedecompile(addr)decompilerpseudocode.commentpseudocodeset_func_cmt()funcs.commentfuncs.rpt_commentcommentcomment_placementsemi;block1block2curly1curly2coloncaseelsedoea{}line_numea + comment_placementeaeaSELECT line_num, ea, line, comment
FROM pseudocode
WHERE func_addr = 0x401000
ORDER BY line_num;-- The example UPDATEs below assume 0x401020 is an already resolved writable
-- non-brace anchor from the inspection query above; do not substitute func_addr.
-- Edit: Add inline comment to decompiled code
UPDATE pseudocode SET comment_placement = 'semi',
comment = 'buffer overflow here'
WHERE func_addr = 0x401000 AND ea = 0x401020;
-- Edit: Add block comment (own line above statement)
UPDATE pseudocode SET comment_placement = 'block1', comment = 'vulnerable call'
WHERE func_addr = 0x401000 AND ea = 0x401020;
-- Edit: Delete comments at a resolved unique anchor
-- Warning: comment = NULL currently clears all placements at that ea.
UPDATE pseudocode SET comment = NULL
WHERE func_addr = 0x401000 AND ea = 0x401020;
-- Read edited pseudocode with comments
SELECT ea, line, comment FROM pseudocode WHERE func_addr = 0x401000;pseudocodedecompile(addr)decompilerpseudocode.commentpseudocodeset_func_cmt()funcs.commentfuncs.rpt_commentcommentcomment_placementsemi;block1block2curly1curly2coloncaseelsedoea{}line_numea + comment_placementeaeaSELECT line_num, ea, line, comment
FROM pseudocode
WHERE func_addr = 0x401000
ORDER BY line_num;-- 以下UPDATE示例假设0x401020是从上述检查查询中确认的可编辑非大括号锚点;请勿替换为func_addr。
-- 编辑:为反编译代码添加行内注释
UPDATE pseudocode SET comment_placement = 'semi',
comment = '此处存在缓冲区溢出'
WHERE func_addr = 0x401000 AND ea = 0x401020;
-- 编辑:添加块注释(语句上方单独一行)
UPDATE pseudocode SET comment_placement = 'block1', comment = '易受攻击的调用'
WHERE func_addr = 0x401000 AND ea = 0x401020;
-- 编辑:删除已确认唯一锚点处的注释
-- 注意:comment = NULL会清除该ea处的所有位置注释。
UPDATE pseudocode SET comment = NULL
WHERE func_addr = 0x401000 AND ea = 0x401020;
-- 读取带有注释的编辑后伪代码
SELECT ea, line, comment FROM pseudocode WHERE func_addr = 0x401000;pseudocodeSELECT func_addr, func_name, orphan_count
FROM pseudocode_v_orphan_comment_groups
ORDER BY orphan_count DESC
LIMIT 20;
SELECT ea, comment_placement, orphan_comment
FROM pseudocode_orphan_comments
WHERE func_addr = 0x401000
ORDER BY ea, comment_placement;UPDATE pseudocode_orphan_comments
SET orphan_comment = NULL
WHERE func_addr = 0x401000
AND ea = 0x401020
AND comment_placement = 'semi';pseudocode_orphan_commentsWHERE func_addr = ...pseudocodeSELECT func_addr, func_name, orphan_count
FROM pseudocode_v_orphan_comment_groups
ORDER BY orphan_count DESC
LIMIT 20;
SELECT ea, comment_placement, orphan_comment
FROM pseudocode_orphan_comments
WHERE func_addr = 0x401000
ORDER BY ea, comment_placement;UPDATE pseudocode_orphan_comments
SET orphan_comment = NULL
WHERE func_addr = 0x401000
AND ea = 0x401020
AND comment_placement = 'semi';pseudocode_orphan_commentsWHERE func_addr = ...function summaryfunc-summaryfunction summaryfunc-summaryfuncs.rpt_commentadd function commentpseudocode.commentfuncs.rpt_commentfuncs.commentSELECT address, name, comment, rpt_comment
FROM funcs
WHERE address = 0x401000;
UPDATE funcs
SET rpt_comment = 'One-paragraph summary of what the function does, inputs/outputs, and key behavior.'
WHERE address = 0x401000;function summary 0x401000func-summary DriverEntryfunc-summary this functionfunction summaryfunc-summaryfunction summaryfunc-summaryfuncs.rpt_commentpseudocode.commentfuncs.rpt_commentfuncs.commentSELECT address, name, comment, rpt_comment
FROM funcs
WHERE address = 0x401000;
UPDATE funcs
SET rpt_comment = '一段描述函数功能、输入/输出及关键行为的摘要。'
WHERE address = 0x401000;function summary 0x401000func-summary DriverEntryfunc-summary this functioncommentsSELECT COALESCE(NULLIF(comment, ''), NULLIF(rpt_comment, '')) AS comment
FROM comments
WHERE address = 0x401000
LIMIT 1;comments| Table | INSERT | UPDATE columns | DELETE |
|---|---|---|---|
| Yes | | Yes |
INSERT INTO comments(address, comment) VALUES (0x401000, 'regular comment');
INSERT INTO comments(address, rpt_comment) VALUES (0x401000, 'repeatable comment');
UPDATE comments SET comment = 'updated comment' WHERE address = 0x401000;
DELETE FROM comments WHERE address = 0x401000;commentsset_cmt()funcs.commentfuncs.rpt_commentset_func_cmt()commentsSELECT COALESCE(NULLIF(comment, ''), NULLIF(rpt_comment, '')) AS comment
FROM comments
WHERE address = 0x401000
LIMIT 1;comments| 表名 | INSERT | 可更新列 | DELETE |
|---|---|---|---|
| 支持 | | 支持 |
INSERT INTO comments(address, comment) VALUES (0x401000, '常规注释');
INSERT INTO comments(address, rpt_comment) VALUES (0x401000, '可重复注释');
UPDATE comments SET comment = '更新后的注释' WHERE address = 0x401000;
DELETE FROM comments WHERE address = 0x401000;commentsset_cmt()funcs.commentfuncs.rpt_commentset_func_cmt()bookmarks| Column | Type | Description |
|---|---|---|
| INT | Bookmark slot index |
| INT | Bookmarked address |
| TEXT | Bookmark description |
-- List all bookmarks
SELECT printf('0x%X', address) as addr, description FROM bookmarks;
-- Edit: Add bookmark
INSERT INTO bookmarks (address, description) VALUES (0x401000, 'interesting branch');
-- Edit: Update bookmark description
UPDATE bookmarks SET description = 'confirmed branch' WHERE slot = 0;
-- Edit: Delete bookmark
DELETE FROM bookmarks WHERE slot = 0;../connect/references/schema-catalog.mdbookmarksbookmarks| 列名 | 类型 | 描述 |
|---|---|---|
| INT | 书签槽索引 |
| INT | 书签地址 |
| TEXT | 书签描述 |
-- 列出所有书签
SELECT printf('0x%X', address) as addr, description FROM bookmarks;
-- 编辑:添加书签
INSERT INTO bookmarks (address, description) VALUES (0x401000, '值得关注的分支');
-- 编辑:更新书签描述
UPDATE bookmarks SET description = '已确认的分支' WHERE slot = 0;
-- 编辑:删除书签
DELETE FROM bookmarks WHERE slot = 0;../connect/references/schema-catalog.mdbookmarksctree_lvarsnametypecommentdecompileridxfunc_addr + idxUPDATE ctree_lvars SET name = ...type = ...comment = ...func_addr + nameidxidx-- Inspect current locals before renaming
SELECT idx, name, type, comment
FROM ctree_lvars
WHERE func_addr = 0x401000
ORDER BY idx;
-- Edit: Rename a local variable by index (canonical, deterministic)
UPDATE ctree_lvars SET name = 'buffer_size' WHERE func_addr = 0x401000 AND idx = 2;
-- Edit: Rename by current name after selecting one deterministic idx
UPDATE ctree_lvars SET name = 'buffer_size'
WHERE func_addr = 0x401000
AND idx = (
SELECT idx FROM ctree_lvars
WHERE func_addr = 0x401000 AND name = 'v2'
ORDER BY idx LIMIT 1
);
-- Edit: Set local-variable comment by index
UPDATE ctree_lvars SET comment = 'points to decrypted buffer' WHERE func_addr = 0x401000 AND idx = 2;
-- Edit: Change variable type
UPDATE ctree_lvars SET type = 'char *'
WHERE func_addr = 0x401000 AND idx = 2;ctree_lvarsnametypecommentdecompileridxfunc_addr + idxUPDATE ctree_lvars SET name = ...type = ...comment = ...func_addr + nameidxidx-- 重命名前检查当前局部变量
SELECT idx, name, type, comment
FROM ctree_lvars
WHERE func_addr = 0x401000
ORDER BY idx;
-- 编辑:通过索引重命名局部变量(标准、确定性方式)
UPDATE ctree_lvars SET name = 'buffer_size' WHERE func_addr = 0x401000 AND idx = 2;
-- 编辑:选择确定性idx后按当前名称重命名
UPDATE ctree_lvars SET name = 'buffer_size'
WHERE func_addr = 0x401000
AND idx = (
SELECT idx FROM ctree_lvars
WHERE func_addr = 0x401000 AND name = 'v2'
ORDER BY idx LIMIT 1
);
-- 编辑:通过索引设置局部变量注释
UPDATE ctree_lvars SET comment = '指向解密后的缓冲区' WHERE func_addr = 0x401000 AND idx = 2;
-- 编辑:修改变量类型
UPDATE ctree_lvars SET type = 'char *'
WHERE func_addr = 0x401000 AND idx = 2;label_num-- Inspect labels before renaming
SELECT label_num, name, printf('0x%X', item_ea) AS item_ea
FROM ctree_labels
WHERE func_addr = 0x401000
ORDER BY label_num;
-- Rename deterministically by label number
UPDATE ctree_labels SET name = 'fail' WHERE func_addr = 0x401000 AND label_num = 12;
-- Equivalent UPDATE path
UPDATE ctree_labels
SET name = 'fail'
WHERE func_addr = 0x401000 AND label_num = 12;label_num-- 重命名前检查标签
SELECT label_num, name, printf('0x%X', item_ea) AS item_ea
FROM ctree_labels
WHERE func_addr = 0x401000
ORDER BY label_num;
-- 通过标签编号确定性重命名
UPDATE ctree_labels SET name = 'fail' WHERE func_addr = 0x401000 AND label_num = 12;
-- 等效的UPDATE方式
UPDATE ctree_labels
SET name = 'fail'
WHERE func_addr = 0x401000 AND label_num = 12;parse_decls()set_type()namesfuncstypes-- Apply type to a function
UPDATE funcs SET prototype = 'void __fastcall exec_command(command_t *cmd);'
WHERE address = 0x140001BD0;
-- Apply via set_type function
SELECT set_type(0x140001BD0, 'void __fastcall exec_command(command_t *cmd);');parse_decls()set_type()namesfuncstypes-- 为函数应用类型
UPDATE funcs SET prototype = 'void __fastcall exec_command(command_t *cmd);'
WHERE address = 0x140001BD0;
-- 通过set_type函数应用类型
SELECT set_type(0x140001BD0, 'void __fastcall exec_command(command_t *cmd);');instructionsoperand*_format_spec-- Edit: Apply enum representation to operand 1
UPDATE instructions
SET operand1_format_spec = 'enum:MY_ENUM'
WHERE address = 0x401020;
-- Edit: Apply struct-offset representation
UPDATE instructions
SET operand0_format_spec = 'stroff:MY_STRUCT,delta=0'
WHERE address = 0x401030;
-- Edit: Clear representation back to plain
UPDATE instructions
SET operand1_format_spec = 'clear'
WHERE address = 0x401020;instructionsoperand*_format_spec-- 编辑:为操作数1应用枚举表示
UPDATE instructions
SET operand1_format_spec = 'enum:MY_ENUM'
WHERE address = 0x401020;
-- 编辑:应用结构体偏移表示
UPDATE instructions
SET operand0_format_spec = 'stroff:MY_STRUCT,delta=0'
WHERE address = 0x401030;
-- 编辑:清除表示方式恢复为默认
UPDATE instructions
SET operand1_format_spec = 'clear'
WHERE address = 0x401020;set_union_selection*get_union_selection*decompilerset_union_selection*get_union_selection*decompiler-- 1. Define the enum type (skip if it already exists)
SELECT parse_decls('typedef enum { DLL_PROCESS_DETACH=0, DLL_PROCESS_ATTACH=1 } fdw_reason_t;');
-- 2. Retype the parameter/variable
UPDATE ctree_lvars SET type = 'fdw_reason_t'
WHERE func_addr = 0x180001050 AND idx = 1;
-- 3. Verify
SELECT decompile(0x180001050, 1);set_numform*get_numform*decompiler-- 1. 定义枚举类型(已存在则跳过)
SELECT parse_decls('typedef enum { DLL_PROCESS_DETACH=0, DLL_PROCESS_ATTACH=1 } fdw_reason_t;');
-- 2. 重新定义参数/变量类型
UPDATE ctree_lvars SET type = 'fdw_reason_t'
WHERE func_addr = 0x180001050 AND idx = 1;
-- 3. 验证
SELECT decompile(0x180001050, 1);set_numform*get_numform*decompilerFollow the read -> edit -> refresh -> verify cycle defined inGlobal Agent Contracts.connect
遵循全局Agent协议中定义的读取 -> 编辑 -> 刷新 -> 验证循环。connect
decompile(addr, 1)-- Good: structural typing first, then refresh, then naming cleanup
UPDATE ctree_lvars SET type = 'MY_CTX *' WHERE func_addr = 0x401000 AND idx = 0;
SELECT decompile(0x401000, 1);
UPDATE ctree_lvars SET name = 'ctx' WHERE func_addr = 0x401000 AND idx = 0;
UPDATE ctree_lvars SET name = 'size' WHERE func_addr = 0x401000 AND idx = 1;
SELECT decompile(0x401000, 1); -- final refresh after cleanuppseudocodedecompile(addr, 1)ctree_lvarsidxsave_database()decompile(addr, 1)-- 推荐顺序:先设置结构类型,再刷新,最后清理命名
UPDATE ctree_lvars SET type = 'MY_CTX *' WHERE func_addr = 0x401000 AND idx = 0;
SELECT decompile(0x401000, 1);
UPDATE ctree_lvars SET name = 'ctx' WHERE func_addr = 0x401000 AND idx = 0;
UPDATE ctree_lvars SET name = 'size' WHERE func_addr = 0x401000 AND idx = 1;
SELECT decompile(0x401000, 1); -- 清理完成后最终刷新pseudocodedecompile(addr, 1)ctree_lvarsidxsave_database()