【发布时间】:2016-11-07 19:46:27
【问题描述】:
我有三张桌子:
文件、模块和函数。
我有来自文件 mssip32.dll 的函数和来自文件 ncsi.dll 的函数。
我想获取所有出现在 mssip32.dll 但不是在 nsci.dll 中的函数
重要提示:
如果名称或模块不同,则功能不同。
例如:
ModuleA.CreateProcess != ModuleB.CreateProcess (because they have different module)
ModuleA.CreateProcess != ModuleA.Sleep (because have different function name)
ModuleA.CreateProcess == ModuleA.CreateProcess (equals)
mssip32.dll 和 nsci.dll 中的函数作为视图:
这是我尝试做的:
SELECT fu.function_name AS 'Imported Function', m.module_name AS 'Library', COUNT(fu.function_name) AS 'Usage Count'
FROM File as f,
Module as m,
Function as fu
WHERE f.listview_name like 'listView1'
AND f.file_id = m.file_id
AND f.file_id = fu.file_id
AND m.module_id = fu.module_id
AND fu.function_name NOT in (
SELECT fu2.function_name
FROM File as f2,
Module as m2,
Function as fu2
WHERE f2.listview_name like 'listView2'
AND f2.file_id = m2.file_id
AND f2.file_id = fu2.file_id
AND m2.module_id = fu2.module_id
)
GROUP BY fu.function_name
ORDER BY COUNT(fu.function_name) DESC
我们缺少ModuleA.CreateProcess,因为它没有出现在“listView2”中。
我希望能够尝试这样的事情(理论上):
...
AND (fu.function_name AND m.module_name) NOT in (
SELECT fu2.function_name, m2.module_name
FROM File as f2,
Module as m2,
Function as fu2
WHERE f2.listview_name like 'listView2'
AND f2.file_id = m2.file_id
AND f2.file_id = fu2.file_id
AND m2.module_id = fu2.module_id
)
...
如果我有:
fu.function_name = "CreateProcess"
m.module_name = "ModuleA"
fu2.function_name = "CreateProcess"
m2.module_name = "ModuleB"
它将返回((fu.function_name != fu2.function_name) OR (m.module_name != m2.module_name))
代码:
表结构:
CREATE TABLE File (
file_id INTEGER NOT NULL ,
name VARCHAR(160) NOT NULL ,
listview_name VARCHAR(30) NOT NULL ,
type VARCHAR(10) NOT NULL ,
recursive VARCHAR(10) NOT NULL ,
PRIMARY KEY (file_id)
) ;
CREATE TABLE Module (
file_id INTEGER NOT NULL ,
module_id INTEGER NOT NULL ,
module_name VARCHAR(30) NOT NULL ,
PRIMARY KEY (file_id)
) ;
CREATE TABLE Function (
file_id INTEGER NOT NULL ,
module_id INTEGER NOT NULL ,
function_name VARCHAR(30) NOT NULL ,
PRIMARY KEY (file_id)
) ;
视图结构:
CREATE VIEW function_List1 AS
SELECT fu.function_name, m.module_name
FROM File as f,
Module as m,
Function as fu
WHERE f.listview_name like 'listView1'
AND f.file_id = m.file_id
AND f.file_id = fu.file_id
AND m.module_id = fu.module_id
CREATE VIEW function_List2 AS
SELECT fu2.function_name, m2.module_name
FROM File as f2,
Module as m2,
Function as fu2
WHERE f2.listview_name like 'listView2'
AND f2.file_id = m2.file_id
AND f2.file_id = fu2.file_id
AND m2.module_id = fu2.module_id
编辑:
我找到了另一种解决方法。
我可以查询 listview2 以将所有具有 same 模块的功能带给我 listview1 中的功能,然后检查 listview1 中的功能是否在该列表中。
我是通过添加 AND m.module_name = m2.module_name 来做到的:
AND fu.function_name NOT in (
SELECT fu2.function_name
FROM File as f2,
Module as m2,
Function as fu2
WHERE f2.listview_name like 'listView2'
AND f2.file_id = m2.file_id
AND f2.file_id = fu2.file_id
AND m2.module_id = fu2.module_id
AND m.module_name = m2.module_name)
【问题讨论】: