Debugging¶
Get the assignments in a function with variable names¶
SELECT
n1.name AS dst, si1.value AS dstname, p1 AS dstp, n2.name AS src, si2.value AS srcname, p2 AS srcp
FROM VirtualAssign va
JOIN IntCInsn_InFunction iif USING (insn)
JOIN CVar_Name n1 ON (n1.var = v1)
JOIN CVar_Name n2 ON (n2.var = v2)
-- join to get the name of the variable. the nested select is crucial
LEFT JOIN
(SELECT * FROM CVar_SourceInfo WHERE key = 'name') si1
ON (va.v1 = si1.var)
LEFT JOIN
(SELECT * FROM CVar_SourceInfo WHERE key = 'name') si2
ON (va.v2 = si2.var)
-- Function whose assigns you want
WHERE iif."function" = 'THEFUNCTION'
ORDER BY iif."function", iif."index"
(SELECT insn, "to" AS v1, "to_path" AS p1, "from" AS v2, "from_path" AS p2, "move" AS reason FROM CInsn_Move)
CInsn_Move: v1 -> to, p1 -> to_path, v2 -> from, p2 -> from_path
All the callsites with arguments and callees, grouped¶
SELECT
insn,
GROUP_CONCAT(('[' || act."index" || '] ' || act.param || act.ap), char(10)) AS actualv,
GROUP_CONCAT(ce.function,char(10)) AS callees
FROM CCall_ActualParam act
JOIN IntCInsn_InFunction iif USING (insn)
LEFT OUTER JOIN CallEdge ce USING (insn)
WHERE
-- Function whose call instructions you want
iif.function = 'THEFUNCTION'
AND act."index" >= 0
GROUP BY insn
ORDER BY insn, act."index"
Summary entries grouped by from,to¶
SELECT
m1, n1, name1.name, p1, n2, name2.name, p2, ctx
FROM SummaryFlow
JOIN
CFunction_FormalParam param1 ON (
param1.function = m1 AND param1."index" = n1
)
JOIN CVar_Name name1 ON (param1.param = name1.var)
JOIN
CFunction_FormalParam param2 ON (
param2.function = m1 AND param2."index" = n2
)
JOIN CVar_Name name2 ON (param2.param = name2.var)
WHERE m1 = 'THEFUNCTION'
ORDER BY m1, n1, n2
Tainted variables and instructions¶
SELECT
rv.v1,
si.value,
GROUP_CONCAT(p1, char(10)) AS "path",
rv.direction
FROM (SELECT DISTINCT v1, p1, direction FROM 'flow.ReachableVertex') rv
JOIN CVar_Name n1 ON (n1.var = v1)
LEFT JOIN
(SELECT * FROM CVar_SourceInfo WHERE key = 'name') si
ON (rv.v1 = si.var)
GROUP BY rv.v1, rv.p1
ORDER BY rv.v1, rv.p1
SELECT
--re.insn,
dstn.var AS dst_var,
dstsi.value AS dst_name,
dst.p1,
srcn.var AS src_var,
srcsi.value AS src_name,
src.p1,
re.direction
FROM 'natural_flow.ReachableEdge' re
JOIN
'flow.ReachableVertex' dst ON (
re.vertex_to = dst.id
AND re.direction = dst.direction
)
JOIN
'flow.ReachableVertex' src ON (
re.vertex_from = src.id
AND re.direction = src.direction
)
JOIN CVar_Name dstn ON (dstn.var = dst.v1)
JOIN CVar_Name srcn ON (srcn.var = src.v1)
LEFT JOIN
(SELECT * FROM CVar_SourceInfo WHERE key = 'name') dstsi
ON (dst.v1 = dstsi.var)
LEFT JOIN
(SELECT * FROM CVar_SourceInfo WHERE key = 'name') srcsi
ON (src.v1 = srcsi.var)
ORDER BY re.insn
PCODE¶
SELECT
printf("%x", target.target_address) AS addr,
o.vnode_id AS output,
mnem.mnemonic,
i0.vnode_id AS in0,
i1.vnode_id AS in1,
i2.vnode_id AS in2
FROM PCODE_INDEX idx
JOIN PCODE_MNEMONIC mnem USING (id)
JOIN PCODE_TARGET target USING (id)
JOIN PCODE_PARENT par USING (id)
JOIN BB_HFUNC bbf USING (bbid)
LEFT JOIN PCODE_OUTPUT o USING (id)
JOIN PCODE_INPUT i0 ON (i0.id=idx.id AND i0.i=0)
LEFT JOIN PCODE_INPUT i1 ON (i1.id=idx.id AND i1.i=1)
LEFT JOIN PCODE_INPUT i2 ON (i2.id=idx.id AND i2.i=2)
WHERE
-- Function to fetch
bbf.hfunc = 'main@1400014d2'
ORDER BY target.target_address, idx."index"
Indexes¶
CREATE INDEX idx_PCODE_TOSTR_0 ON _PCODE_TOSTR ("0");
CREATE INDEX idx_PCODE_MNEMONIC_0 ON _PCODE_MNEMONIC ("0");
CREATE INDEX idx_PCODE_OPCODE_0 ON _PCODE_OPCODE ("0");
CREATE INDEX idx_PCODE_PARENT_0 ON _PCODE_PARENT ("0");
CREATE INDEX idx_PCODE_TARGET_0 ON _PCODE_TARGET ("0");
CREATE INDEX idx_PCODE_INPUT_COUNT_0 ON _PCODE_INPUT_COUNT ("0");
CREATE INDEX idx_PCODE_INPUT_0 ON _PCODE_INPUT ("0");
CREATE INDEX idx_PCODE_OUTPUT_0 ON _PCODE_OUTPUT ("0");
CREATE INDEX idx_PCODE_NEXT_0 ON _PCODE_NEXT ("0");
CREATE INDEX idx_PCODE_TIME_0 ON _PCODE_TIME ("0");
CREATE INDEX idx_PCODE_INDEX_0 ON _PCODE_INDEX ("0");
CREATE INDEX idx_VNODE_ADDRESS_0 ON _VNODE_ADDRESS ("0");
CREATE INDEX idx_VNODE_IS_ADDRESS_0 ON _VNODE_IS_ADDRESS ("0");
CREATE INDEX idx_VNODE_IS_ADDRTIED_0 ON _VNODE_IS_ADDRTIED ("0");
CREATE INDEX idx_VNODE_PC_ADDRESS_0 ON _VNODE_PC_ADDRESS ("0");
CREATE INDEX idx_VNODE_DESC_0 ON _VNODE_DESC ("0");
CREATE INDEX idx_VNODE_NAME_0 ON _VNODE_NAME ("0");
CREATE INDEX idx_VNODE_OFFSET_0 ON _VNODE_OFFSET ("0");
CREATE INDEX idx_VNODE_OFFSET_N_0 ON _VNODE_OFFSET_N ("0");
CREATE INDEX idx_VNODE_SIZE_0 ON _VNODE_SIZE ("0");
CREATE INDEX idx_VNODE_SPACE_0 ON _VNODE_SPACE ("0");
CREATE INDEX idx_VNODE_TOSTR_0 ON _VNODE_TOSTR ("0");
CREATE INDEX idx_VNODE_HVAR_0 ON _VNODE_HVAR ("0");
CREATE INDEX idx_VNODE_HFUNC_0 ON _VNODE_HFUNC ("0");
CREATE INDEX idx_VNODE_DEF_0 ON _VNODE_DEF ("0");