编写一个带有socket通信功能的插件,x64dbg运行后,用户点击链接按钮可直接连接到外部的python中,python作为服务端,当x64dbg内部出现某个事件后,自动将消息推送到外部python脚本上,实现反向传参的目的。

首先编写插件端代码,代码中直接初始化套接字,用户服务端启动后点击connect按钮链接到服务端,链接成功后,一但调试器加载了程序则自动触发CBINITDEBUG(CBTYPE cbType, PLUG_CB_INITDEBUG* info)回调函数,并通过socket将参数送出到外部。

#include "pluginmain.h"
#include <Windows.h>
#include <process.h>#pragma comment(lib,"ws2_32.lib")
#define IP "127.0.0.1"
#define PORT 9999int pluginHandle;
HWND hwndDlg;
int hMenu;
int hMenuDisasm;
int hMenuDump;
int hMenuStack;WSADATA WSAData;
SOCKET sock;
struct sockaddr_in ClientAddr;// 在这里初始化插件数据。
bool pluginInit(PLUG_INITSTRUCT* initStruct)
{// 返回false以取消加载插件。return true;
}// 在此处取消初始化插件数据。
void pluginStop()
{
}// 在这里做GUI/菜单相关的事情。
void pluginSetup()
{
}// 导出函数
extern "C" __declspec(dllexport) void plugsetup(PLUG_SETUPSTRUCT* setupStruct);
extern "C" __declspec(dllexport) bool pluginit(PLUG_INITSTRUCT* initStruct);// 导出自定义的两个功能
extern "C" __declspec(dllexport) void CBMENUENTRY(CBTYPE cbType, PLUG_CB_MENUENTRY* info);
extern "C" __declspec(dllexport) void CBINITDEBUG(CBTYPE cbType, PLUG_CB_INITDEBUG* info);// 菜单回调函数(初始化时自动发送套接字)附加进程触发
void CBINITDEBUG(CBTYPE cbType, PLUG_CB_INITDEBUG* info)
{send(sock, (char *)&info, 1024, 0);_plugin_logprintf("size = %d \n", sizeof(PLUG_CB_INITDEBUG));_plugin_logprintf("func = %s \n", info->szFileName);
}// --------------------------------------------------------------------
// 基础功能
// --------------------------------------------------------------------// 命令触发: 开启Socket的命令
bool ConnectSocket(int argc, char **argv)
{_plugin_logprintf("start socket \n");if (WSAStartup(MAKEWORD(2, 0), &WSAData) != SOCKET_ERROR){ClientAddr.sin_family = AF_INET;ClientAddr.sin_port = htons(PORT);ClientAddr.sin_addr.s_addr = inet_addr(IP);}sock = socket(AF_INET, SOCK_STREAM, 0);int Ret = connect(sock, (LPSOCKADDR)&ClientAddr, sizeof(ClientAddr));return Ret;
}// 命令触发: 关闭Socket的命令
bool CloseSocket(int argc, char **argv)
{_plugin_logprintf("stop socket \n");send(sock, "SocketClose", 11, 0);closesocket(sock);WSACleanup();return true;
}// 菜单被点击触发此回调
void CBMENUENTRY(CBTYPE cbType, PLUG_CB_MENUENTRY* info)
{switch (info->hEntry){case 1:ConnectSocket(0, 0);break;case 2:CloseSocket(0, 0);break;}
}PLUG_EXPORT bool pluginit(PLUG_INITSTRUCT* initStruct)
{initStruct->pluginVersion = PLUGIN_VERSION;initStruct->sdkVersion = PLUG_SDKVERSION;strncpy_s(initStruct->pluginName, PLUGIN_NAME, _TRUNCATE);pluginHandle = initStruct->pluginHandle;// 插件初始化const char *name = "LyScriptCallBack";memset(initStruct->pluginName, 0, 128);memcpy(initStruct->pluginName, name, strlen(name));return pluginInit(initStruct);
}PLUG_EXPORT bool plugstop()
{pluginStop();return true;
}PLUG_EXPORT void plugsetup(PLUG_SETUPSTRUCT* setupStruct)
{hwndDlg = setupStruct->hwndDlg;hMenu = setupStruct->hMenu;hMenuDisasm = setupStruct->hMenuDisasm;hMenuDump = setupStruct->hMenuDump;hMenuStack = setupStruct->hMenuStack;// 增加连接选项char sub_connect[] = "Connect";_plugin_menuaddentry(setupStruct->hMenu, 1, sub_connect);// 添加关闭连接选项char sub_close[] = "CloseConnect";_plugin_menuaddentry(setupStruct->hMenu, 2, sub_close);// 注册ConnectSocket开启Socket命令_plugin_registercommand(pluginHandle, "ConnectSocket", ConnectSocket, true);// 注册CloseSocket关闭Socket命令_plugin_registercommand(pluginHandle, "CloseSocket", CloseSocket, true);pluginSetup();
}

客户端则负责接收参数,收到后直接使用MyStruct(Structure)类,格式化为特定结构体,并输出内部成员参数。

import socket
import struct
from ctypes import *ip_addr=("localhost",9999)server = socket.socket()
server.bind(ip_addr)
server.listen(5)class MyStruct(Structure):_pack_ = 1_fields_ = [("szFileName", c_char * 256)]def unpack(self,buffer):(self.szFileName) = struct.unpack("< 256s",buffer)while True:conn,addr=server.accept()print(addr)while True:try:recv_data = str(conn.recv(8192), encoding="utf-8")if len(recv_data) == 11 and recv_data == "SocketClose":conn.close()print("close")else:recv_struct = MyStruct()recv_struct.unpack(recv)print(recv_struct.szFileName)except Exception:breakserver.close()

首先运行python脚本让其侦听特定端口,然后再x64dbg中点击connect链接按钮,链接成功后即可看到输出信息。

x64dbg 实现插件Socket反向通信相关推荐

  1. socket简单通信

    原文:socket简单通信 粗糙简略的初版,后续多加点功能权当练手 /* =============================================================== ...

  2. Java Socket编程----通信是这样炼成的

    转载自 Java Socket编程----通信是这样炼成的 Java最初是作为网络编程语言出现的,其对网络提供了高度的支持,使得客户端和服务器的沟通变成了现实,而在网络编程中,使用最多的就是Socke ...

  3. 基于Android的聊天软件,Socket即时通信,实现用户在线聊天

    基于Android的聊天软件,Socket即时通信,单聊,聊天室,可自行扩展功能,完善细节. [实例功能] 1.运行程序,登录界面, 注册账号功能 2.进入主界面,有通讯录, 个人信息. 3.点击好友 ...

  4. Dubbo底层采用Socket进行通信详解

    由于Dubbo底层采用Socket进行通信,自己对通信理理论也不是很清楚,所以顺便把通信的知识也学习一下. n  通信理论 计算机与外界的信息交换称为通信.基本的通信方法有并行通信和串行通信两种. 1 ...

  5. Socket的通信是基于连接的通信,通信结束时,Socket将不再有用,关闭时为了节约宝贵的系统资源

    Socket的通信是基于连接的通信,通信结束时,Socket将不再有用,关闭时为了节约宝贵的系统资源. package p1;import java.io.DataInputStream; impor ...

  6. Socket的通信原理和使用

     目录 一.什么是 Socket? 二.Socket 通信过程 2.1 通信过程介绍 2.2 实现TCP建立连接的三次握手过程 三. 使用Socket进行通信[php] 3.1 PHP中Socket常 ...

  7. python实现socket简单通信

    python实现socket简单通信 首先先来简单介绍下socket: (具体更详细介绍的可以在网上找找,都讲得非常详细),这里主要是我自己的一些理解. socket是在应用层与传输层之间的一个抽象层 ...

  8. 使用Socket实现通信聊天室

    使用Socket实现通信聊天室 通信聊天室是一个比较酷的项目. 建立通信聊天室之前我们会想到这些问题: ①聊天室得要有一个发送窗口和一个接受窗口,如何在这两个窗口建立联系? ②如何发送信息并且接受信息 ...

  9. 使用NIO实现异步非阻塞Socket tcp通信

    使用NIO实现异步非阻塞Socket tcp通信 一.BIO与NIO IO(BIO)和NIO区别:其本质就是阻塞和非阻塞的区别 阻塞概念:应用程序在获取网络数据的时候,如果网络传输数据很慢,就会一直等 ...

最新文章

  1. LeetCode 102. Binary Tree Level Order Traversal--递归,迭代-Python,Java解法
  2. gpu浮点计算能力floaps_聊聊 GPU 峰值计算能力
  3. Leetcode1694. 重新格式化电话号码[C++题解]:字符串模拟题
  4. hdu 5672(尺取法)
  5. 【Python】Pandas profiling 生成报告并部署的一站式解决方案
  6. DHAT:动态堆分析工具
  7. 在CentOS7上使用FastDFS搭建文件服务器
  8. Struts2学习笔记(十八) 防止表单重复提交
  9. error: storage class specified for parameter问题-转
  10. Mysql自动设置时间(自动获取时间,填充时间)
  11. Julia: Dates =DateFormat, format,parse.......
  12. 2015计算机二级office真题,2015年计算机二级office题库及答案
  13. Windows ToolTips简要介绍
  14. 7位白手起家的亿万富豪的7大独特做事准则 凤凰科技02-0411:46 原标题:7位白手起家的亿万富豪的7大独特做事准则 那些白手起家的亿万富翁企业家是否有一些独特的思维方式和做事准则,从而让自己获得
  15. 我被炒了! 一位36岁程序员的的焦虑与困惑...
  16. 计算机windows前台运行图标,获取 window任务栏已经打开应用程序窗口(也就是任务管理器中前台进程)的图标...
  17. 数仓构建维表--行政区域维度表的构建
  18. Gridview的HyperLinkField操作
  19. 西南大学大数据8天实训
  20. opencv学习笔记 边缘滤波保留(EPF) 高斯双边 均值迁移

热门文章

  1. 补交20145226蓝墨云班课 -- MyOD
  2. @codeforces - 793G@ Oleg and chess
  3. 鸿蒙初开再往前是什么,鸿蒙初开造句,用鸿蒙写一句话
  4. android 获取粗略位置_android – 如何使用Wifi或GSM或GPS获取粗略的位置,以哪一个可用?...
  5. Objective-C之父Brad J. Cox去世,他推动了今天苹果的软件生态
  6. 计算两个矩形的IOU交并比_Python
  7. Android 適配器的回調
  8. 可视化全链路日志追踪
  9. AJAX 提交表单以及文件上传
  10. 谷歌、百度循环多次翻译、语音下载python脚本