记录 Wireshark lua 5.2.4 插件 调用 C/C++ DLL 动态库 的心得

lu@TOC

在Wireshark 插件开发中

由于本人在 网络抓包分析 过程中需要反复的分析数据包,因此需要用到一种能实现自动 解包 功能,于是使用了 Wireshark 插件来实现 “自动 分析 协议” Wireshark 支持使用lua或者c来开发插件,具体怎么搭建开发后续可能会另开专题。本文主要讲解: lua 插件调用 C/C++ DLL 动态库 可能会遇到的问题和解决办法

问题的由来

不得不吐槽一下国内技术分享气氛确实没有国外好啊,关于调用这个问题我折腾了好几天一直没搜到合适的解决办法,最后在国外一篇文章中找到了一丝踪迹。

上代码

interface.cpp

extern "C" {
#include <lua.h>
#include <lauxlib.h>
}

/// <summary>
/// 我们的测试方法
/// </summary>
/// <param name="L"></param>
/// <returns></returns>
static int TestBox(lua_State* L)
{
    const char* sTitle = luaL_checkstring(L, 1);    // 获取虚拟栈的参数
    MessageBoxA(NULL, sTitle, "", 0);
    return 0;                                       // 返回的参数数量
}

static const struct luaL_Reg mylib[] =
{
    {"Test", TestBox},                              // 注册方法 参数一:lua 代码使用的方法名;参数二:lua 调用以后我们要执行的函数
    {NULL, NULL}                                    // 哨兵,lua用来判断参数是否到末尾了
};

/// <summary>
/// lua加载本库的入口函数
/// </summary>
/// <param name="L">参数列表</param>
/// <returns></returns>
//extern "C"
int __declspec(dllexport) luaopen_QQTea(lua_State * L)
{
    luaL_newlib(L, mylib);
    return 1;
}

注意开始刨坑:

  1. lua 入口函数 luaopen_QQTea 这个函数名前半部分 luaopen_ 是固定的“区分大小写”,后半部分:QQTea 生成的 DLL文件名 必须和这个名称相同 如:QQTea.dll
  2. 我们自己实现的注册函数如果要返回参数的话通过 lua_pushxxx xxx 为具体的类型,详情可查看官方文档:lua参考手册:https://www.lua.org/manual/5.4/
  3. 入口函数 标记导出函数关键字 __declspec(dllexport) 其次必须是C语法因此需要加上:extern “C” 关键字;当然你也可以定义 .def 文件来导出函数,这里我用的是def方式。

Source.def

LIBRARY  QQTea
EXPORTS
	luaopen_QQTea

到此似乎我们可以生成文件了,当然没有我们的头文件还没个来龙去脉呢!

下载并编译lua5.2.4

1.这里为什么用5.2.4呢,主要准确的是当前最新版Wireshark 3.6.3只支持5.2.4,但是怕外面的程序不安全就去官网下载了:lua 官网地址:https://github.com/lua/lua/releases
在这里插入图片描述
在这里插入图片描述
下载了以后我们解压得到如下文件:
在这里插入图片描述

新建一个C/C++ DLL 项目

1.这也算一个坑了,如果你新建lib的话,会导致堆栈问题和函数找不到

2.然后我们将 lua 源码目录 src 下的文件除了lua.cluac.c以外全部文件复制到项目如下图:
在这里插入图片描述
3.最后在 属性》》C/C++ 》》预编译器 添加:LUA_BUILD_AS_DLL;

4.由于**Wireshark**根目录下lua库的名字为:lua52.dll 所以我们 生成的DLL也得同名

,以便我们的DLL使用 lua52.lib
5. 项目右键生成DLL

此时在我们原本的项目 属性》 》链接器 》》 输入 》 》附加依赖项:lua52.lib;。常规 》》附加库目录:lua52.lib 的生成目录。

在这里插入图片描述

编译 QQTea.dll 复制到 **Wireshark**根目录下,重新加载lua插件即可

切记把dll复制到>根目录下 \Wireshark\QQTea.dll 这也是我踩一个大坑,不然就会如图

在这里插入图片描述
除非你在lua代码 写上:

package.cpath = "./plugins/?.dll"
local QQTea = require("QQTea")

\Wireshark\plugins\test.lua

local QQTea = require("QQTea")
local ret = QQTea.Test("hhh")

在这里插入图片描述

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Wireshark是一款常用的网络抓包工具,而Wireshark Lua插件可以帮助我们从pcap报文中提取出文件、图片和视频等特定类型的数据。 首先,我们需要通过Wireshark打开一个pcap文件,在“File”菜单中选择“Open”,然后选择相应的pcap文件并打开它。接下来,我们需要使用Wireshark Lua插件来提取我们所需的文件、图片或视频。 对于文件的提取,我们可以编写一个简单的Lua脚本来实现。首先,在Wireshark的安装目录下找到“plugins”文件夹,创建一个新的文件夹,并将Lua脚本命名为“extract_files.lua”。然后,打开该Lua脚本,在其中编写以下代码: ``` -- 获取所有的数据包 local packets = {} do local iter = 0 -- 遍历每个数据包 -- 通过wireshark.file()来获取文件 function process_packet(pinfo, tvb) iter = iter + 1 local filedata = wireshark.file():open(pinfo.number .. "_file") if filedata then table.insert(packets, filedata) end end -- 便利数据包 -- 这个函数将在每个数据包到达时被调用 -- 这里定义了我们要捕获的协议为HTTP function main() ip_proto_table = DissectorTable.get("ip.proto") ip_proto_table:add(6, http_proto) ip_proto_table:add(17, http_proto) end end ``` 以上代码的功能是在每个HTTP数据包到达时打开一个文件,然后将该文件添加到`packets`列表中。 接下来,我们可以在终端中使用Wireshark Lua插件来运行我们的脚本。在终端中输入以下命令: ``` wireshark -X lua_script:extract_files.lua -r your_pcap_file.pcap ``` 在运行命令后,Wireshark将根据我们的脚本提取pcap文件中的所有文件,并将其保存在新的文件夹中。 对于提取图片和视频,我们可以编写类似的脚本,只需要根据特定的协议或数据包格式来过滤和提取我们所需的图片或视频文件即可。 总之,Wireshark Lua插件提供了一种灵活的方式来从pcap报文中提取文件、图片和视频等特定类型的数据。通过编写适当的Lua脚本,我们可以轻松地提取出我们需要的数据,并进一步分析和处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值