x64dbg 实现插件Socket反向通信

一给  金牌会员 | 2022-9-16 17:27:29 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 878|帖子 878|积分 2634

编写一个带有socket通信功能的插件,x64dbg运行后,用户点击链接按钮可直接连接到外部的python中,python作为服务端,当x64dbg内部出现某个事件后,自动将消息推送到外部python脚本上,实现反向传参的目的。
首先编写插件端代码,代码中直接初始化套接字,用户服务端启动后点击connect按钮链接到服务端,链接成功后,一但调试器加载了程序则自动触发CBINITDEBUG(CBTYPE cbType, PLUG_CB_INITDEBUG* info)回调函数,并通过socket将参数送出到外部。
  1. #include "pluginmain.h"
  2. #include <Windows.h>
  3. #include <process.h>
  4. #pragma comment(lib,"ws2_32.lib")
  5. #define IP "127.0.0.1"
  6. #define PORT 9999
  7. int pluginHandle;
  8. HWND hwndDlg;
  9. int hMenu;
  10. int hMenuDisasm;
  11. int hMenuDump;
  12. int hMenuStack;
  13. WSADATA WSAData;
  14. SOCKET sock;
  15. struct sockaddr_in ClientAddr;
  16. // 在这里初始化插件数据。
  17. bool pluginInit(PLUG_INITSTRUCT* initStruct)
  18. {
  19.         // 返回false以取消加载插件。
  20.         return true;
  21. }
  22. // 在此处取消初始化插件数据。
  23. void pluginStop()
  24. {
  25. }
  26. // 在这里做GUI/菜单相关的事情。
  27. void pluginSetup()
  28. {
  29. }
  30. // 导出函数
  31. extern "C" __declspec(dllexport) void plugsetup(PLUG_SETUPSTRUCT* setupStruct);
  32. extern "C" __declspec(dllexport) bool pluginit(PLUG_INITSTRUCT* initStruct);
  33. // 导出自定义的两个功能
  34. extern "C" __declspec(dllexport) void CBMENUENTRY(CBTYPE cbType, PLUG_CB_MENUENTRY* info);
  35. extern "C" __declspec(dllexport) void CBINITDEBUG(CBTYPE cbType, PLUG_CB_INITDEBUG* info);
  36. // 菜单回调函数(初始化时自动发送套接字)附加进程触发
  37. void CBINITDEBUG(CBTYPE cbType, PLUG_CB_INITDEBUG* info)
  38. {
  39.         send(sock, (char *)&info, 1024, 0);
  40.         _plugin_logprintf("size = %d \n", sizeof(PLUG_CB_INITDEBUG));
  41.         _plugin_logprintf("func = %s \n", info->szFileName);
  42. }
  43. // --------------------------------------------------------------------
  44. // 基础功能
  45. // --------------------------------------------------------------------
  46. // 命令触发: 开启Socket的命令
  47. bool ConnectSocket(int argc, char **argv)
  48. {
  49.         _plugin_logprintf("start socket \n");
  50.         if (WSAStartup(MAKEWORD(2, 0), &WSAData) != SOCKET_ERROR)
  51.         {
  52.                 ClientAddr.sin_family = AF_INET;
  53.                 ClientAddr.sin_port = htons(PORT);
  54.                 ClientAddr.sin_addr.s_addr = inet_addr(IP);
  55.         }
  56.         sock = socket(AF_INET, SOCK_STREAM, 0);
  57.         int Ret = connect(sock, (LPSOCKADDR)&ClientAddr, sizeof(ClientAddr));
  58.         return Ret;
  59. }
  60. // 命令触发: 关闭Socket的命令
  61. bool CloseSocket(int argc, char **argv)
  62. {
  63.         _plugin_logprintf("stop socket \n");
  64.         send(sock, "SocketClose", 11, 0);
  65.         closesocket(sock);
  66.         WSACleanup();
  67.         return true;
  68. }
  69. // 菜单被点击触发此回调
  70. void CBMENUENTRY(CBTYPE cbType, PLUG_CB_MENUENTRY* info)
  71. {
  72.         switch (info->hEntry)
  73.         {
  74.         case 1:
  75.                 ConnectSocket(0, 0);
  76.                 break;
  77.         case 2:
  78.                 CloseSocket(0, 0);
  79.                 break;
  80.         }
  81. }
  82. PLUG_EXPORT bool pluginit(PLUG_INITSTRUCT* initStruct)
  83. {
  84.         initStruct->pluginVersion = PLUGIN_VERSION;
  85.         initStruct->sdkVersion = PLUG_SDKVERSION;
  86.         strncpy_s(initStruct->pluginName, PLUGIN_NAME, _TRUNCATE);
  87.         pluginHandle = initStruct->pluginHandle;
  88.         // 插件初始化
  89.         const char *name = "LyScriptCallBack";
  90.         memset(initStruct->pluginName, 0, 128);
  91.         memcpy(initStruct->pluginName, name, strlen(name));
  92.         return pluginInit(initStruct);
  93. }
  94. PLUG_EXPORT bool plugstop()
  95. {
  96.         pluginStop();
  97.         return true;
  98. }
  99. PLUG_EXPORT void plugsetup(PLUG_SETUPSTRUCT* setupStruct)
  100. {
  101.         hwndDlg = setupStruct->hwndDlg;
  102.         hMenu = setupStruct->hMenu;
  103.         hMenuDisasm = setupStruct->hMenuDisasm;
  104.         hMenuDump = setupStruct->hMenuDump;
  105.         hMenuStack = setupStruct->hMenuStack;
  106.         // 增加连接选项
  107.         char sub_connect[] = "Connect";
  108.         _plugin_menuaddentry(setupStruct->hMenu, 1, sub_connect);
  109.         // 添加关闭连接选项
  110.         char sub_close[] = "CloseConnect";
  111.         _plugin_menuaddentry(setupStruct->hMenu, 2, sub_close);
  112.         // 注册ConnectSocket开启Socket命令
  113.         _plugin_registercommand(pluginHandle, "ConnectSocket", ConnectSocket, true);
  114.         // 注册CloseSocket关闭Socket命令
  115.         _plugin_registercommand(pluginHandle, "CloseSocket", CloseSocket, true);
  116.         pluginSetup();
  117. }
复制代码
客户端则负责接收参数,收到后直接使用MyStruct(Structure)类,格式化为特定结构体,并输出内部成员参数。
  1. import socket
  2. import struct
  3. from ctypes import *
  4. ip_addr=("localhost",9999)
  5. server = socket.socket()
  6. server.bind(ip_addr)
  7. server.listen(5)
  8. class MyStruct(Structure):
  9.     _pack_ = 1
  10.     _fields_ = [
  11.         ("szFileName", c_char * 256)
  12.     ]
  13.     def unpack(self,buffer):
  14.         (self.szFileName) = struct.unpack("< 256s",buffer)
  15. while True:
  16.     conn,addr=server.accept()
  17.     print(addr)
  18.     while True:
  19.         try:
  20.             recv_data = str(conn.recv(8192), encoding="utf-8")
  21.             if len(recv_data) == 11 and recv_data == "SocketClose":
  22.                 conn.close()
  23.                 print("close")
  24.             else:
  25.                 recv_struct = MyStruct()
  26.                 recv_struct.unpack(recv)
  27.                 print(recv_struct.szFileName)
  28.         except Exception:
  29.             break
  30.             server.close()
复制代码
首先运行python脚本让其侦听特定端口,然后再x64dbg中点击connect链接按钮,链接成功后即可看到输出信息。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

一给

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表