编写一个带有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 9999 int 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:
break
server.close()

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

x64dbg 实现插件Socket反向通信的更多相关文章

  1. (3)MEF插件系统中通信机制的设计和实现

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 一般的WinForm中通过C#自带的Event机制便能很好的实 ...

  2. 使用Socket进行通信

    客户端通常可使用Socket的构造器来连接到指定服务器,Socket通常可使用如下两个构造器. Socket(lnetAddress/String  remoteAddress , int  port ...

  3. java socket报文通信(一)socket的建立

    java socket报文通信(一) socket的建立  今天来和大家分享一下java中如何使用socket进行通信.先来啰嗦两句,看看Tcp/ip和udp: TCP是Transfer Contro ...

  4. java socket线程通信

    关于socket线程通信的一些知识整理 一般我们需要要让两台机子进行通信,需要创建一个Server 类,一个Client类,还需要创建一个线程类 server public class Server ...

  5. MEF插件系统中通信机制的设计和实现

    MEF插件系统中通信机制的设计和实现 1.背景 一般的WinForm中通过C#自带的Event机制便能很好的实现事件的注册和分发,但是,在插件系统中却不能这么简单的直接用已有的类来完成.一个插件本不包 ...

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

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

  7. 《java入门第一季》之Socket编程通信和TCP协议通信图解

    Socket编程通信图解原理: TCP协议通信图解

  8. socket 编程通信实例

    socket 编程通信实例:TCPserver: , ServerThread,  ;    WSADATA wsaData;    ,),  ;    }    ;    }    } ;    g ...

  9. 【Android实战】Socket消息通信

    这篇博客的内容是基于http://my.oschina.net/fengcunhan/blog/178155进行改造的.所以须要先看完这篇博客,然后再来看以下的内容. 1.须要完毕的功能是直播间的so ...

  10. Android native进程间通信实例-socket本地通信篇之——基本通信功能

    导读: 网上看了很多篇有关socket本地通信的示例,很多都是调通服务端和客户端通信功能后就没有下文了,不太实用,真正开发中遇到的问题以及程序稳定性部分没有涉及,代码健壮性不够,本系列(socket本 ...

随机推荐

  1. 【邀请有礼】全球视频云创新挑战赛邀请有礼:参与 100% 获得 “壕” 礼,更有机会获得 JBL 音箱、Cherry 机械键盘

    活动背景: 2021 年首届全球视频云创新挑战赛报名火热进行中,这里奖金池高达四十万,有业界顶尖专家指导,有展示自我技能的广阔舞台,还有入职阿里的绿色招聘通道.如果你有一点点心动,那请不要错过这场挑战 ...

  2. ElasticSearch 分组聚合统计

    统计总数: GET mytest-statistics/_search { "size": 0, "query": { "bool": { ...

  3. VSCode一键调用DOSBox运行MASM/TASM代码的自定义任务

    在学习汇编的时候,发现很多教程都未使用 VSC 进行开发,今天在 Gitee 看有意思的项目时候发现了这个 DOS汇编/VSC-ASMtasks 通过配置VSCode的自定义任务来实现调用dosbox ...

  4. POJ3414 Pots( BFS搜索)

    题目: 给你两个容器,分别能装下A升水和B升水,并且可以进行以下操作 FILL(i) 将第i个容器从水龙头里装满(1 ≤ i ≤ 2); DROP(i) 将第i个容器抽干 POUR(i,j) 将第i个 ...

  5. AtCoder Beginner Contest 210 (A~E)

    比赛链接:Here A - Cabbages 略 B - Bouzu Mekuri 略 C - Colorful Candies 用map维护连续一段区间的不同元素即可. int main() { c ...

  6. 【每日一题】29.maze (BFS 进阶)

    补题链接:Here 本题代码由贺佬完成 这道题基本算一道 BFS 进阶题,有少许细节要小心 (WA1发.. #include <bits/stdc++.h> #define x first ...

  7. 开源:Taurus.DTS 微服务分布式任务框架,支持即时任务、延时任务、Cron表达式定时任务和广播任务。

    前言: 在发布完:开源:Taurus.DTC 微服务分布式事务框架,支持 .Net 和 .Net Core 双系列版本,之后想想,好像除了事务外,感觉里面多了一个任务发布订阅的基础功能. 本想既然都有 ...

  8. 看这个视频,4万人学会云上部署 Stable Diffusion

    目前大火的 AIGC 领域中, 除了 ChatGPT,Stable Diffusion 在文生图领域大放异彩,深刻影响着绘画.视频制作等相关领域.<动手吧,开发者>本期活动邀请 B 站知识 ...

  9. SAE 最佳实践范本:助力视野数科进入云原生“快车道”

    阿里云生态金融科技行业标杆 -- ​ 2021 年,云原生的商业价值正在被加速释放. ​ 一个公认的事实是,Serverless 是当下云原生方向内绝对的亮点.可以看作,它的出现,让企业用户真正地免除 ...

  10. 简单实现el-dialog的拖拽功能

    首先还是要明确几个概念,这里通过修改css并截图给大家介绍下,理解了这几个概念,代码写起来会得心应手许多. clientWidth,clientHeight scrollWidth,scrollHei ...