new:一种DLL插入方案

Unity连接MySQL的DLL冲突解决方案:从兼容驱动到纯C#实现 在游戏开发中,数据库连接是构建后台数据管理系统的核心技术环节。其原理是通过数据库驱动实现应用程序与MySQL服务器之间的通信协议交互。这一技术的核心价值在于为游戏提供持久化数据存储、玩家状态管理和实时数据同步能力,广泛应用于玩家存档、排行榜、商城系统等场景。然而,在Unity引擎中集成MySQL驱动时,开发者常因DLL版本冲突和平台架构差异而遭遇连接失败问题。本文聚焦Unity与MySQL联动中的DLL冲突痛点,深入解析其根源在于Unity的脚本后端(Mono/IL2CPP)与MySQL官方驱动的.NET版 阅读详情

 by killvxk:

 

typedef unsigned long DWORD;
typedef unsigned short WORD;
typedef unsigned char BYTE;

__declspec(dllimport) DWORD PsLookupProcessByProcessId(HANDLE ProcessId,PEPROCESS* pProcess);
__declspec(dllimport) DWORD ZwOpenProcess(PHANDLE ProcessHandle,ULONG DesiredAccess,POBJECT_ATTRIBUTES ObjectAttributes,PCLIENT_ID Cid);
__declspec(dllimport) DWORD ZwQueryInformationProcess(HANDLE ProcessHandle,PROCESSINFOCLASS ProcessInformationClass,PVOID ProcessInformation,ULONG ProcessInformationLength,PULONG ReturnLength);
__declspec(dllimport) BYTE *PsGetProcessPeb(PEPROCESS Process);

#ifdef _WIN64
#define SHIM_OFFSET 0x2d8
#else
#define SHIM_OFFSET 0x1e8
#endif

STATIC_UNICODE_STRING(shimRegRoot,"//REGISTRY//MACHINE//SOFTWARE//shim");

WCHAR shimName[]=L"shimeng.dll";
WCHAR shimSection[]=L"//knowndlls//shimeng.dll";
STATIC_UNICODE_STRING(shimDllRegKey,"shimdll");
HANDLE hShimSection;
#ifdef _WIN64
WCHAR shimSection32[]=L"//knowndlls32//shimeng.dll";
STATIC_UNICODE_STRING(shimDll32RegKey,"shimdll32");
HANDLE hShimSection32;
#endif

void processNotify(HANDLE parentId,HANDLE processId,BOOLEAN createFlag){
    PVOID memAddress=0;
    SIZE_T memSize=sizeof(shimName);
    HANDLE hProcess;
    BYTE *pPeb;
    OBJECT_ATTRIBUTES objAttr;
    CLIENT_ID idClient;
    PEPROCESS pEProcess;
    DWORD ntStatus;
    KAPC_STATE kaps;   

    if(createFlag){
        RtlZeroMemory(&objAttr,sizeof(OBJECT_ATTRIBUTES));
        idClient.UniqueProcess=processId;
        idClient.UniqueThread=0;
        if(ZwOpenProcess(&hProcess,PROCESS_DUP_HANDLE,&objAttr,&idClient)!=0){
            return;
        }
        if(PsLookupProcessByProcessId(processId,&pEProcess)!=0){
            return;
        }
        pPeb=PsGetProcessPeb(pEProcess);
        if(pPeb==0){
            return;
        }
        ntStatus=ZwAllocateVirtualMemory(hProcess,&memAddress,0,&memSize,MEM_COMMIT,PAGE_READWRITE);
        if(ntStatus!=0){
            return;
        }       
        KeStackAttachProcess(pEProcess,&kaps);
        __try{
            memcpy(memAddress,shimName,sizeof(shimName));
            *(WCHAR**)(pPeb+SHIM_OFFSET)=memAddress;
        }__except(EXCEPTION_EXECUTE_HANDLER){
        }
        KeUnstackDetachProcess(&kaps);
    }
    return;
}

void driverUnload(PDRIVER_OBJECT DriverObject){       
    PsSetCreateProcessNotifyRoutine(processNotify,TRUE);
    ZwClose(hShimSection);
#ifdef _WIN64
    ZwClose(hShimSection32);
#endif
#ifdef SHIM_DEBUG
    DbgPrint("shim injector: unloaded");
#endif
    return;
}

NTSTATUS mapShim(HANDLE *pSection,PUNICODE_STRING dllName,WCHAR *sectionName){
    HANDLE hFile;
    OBJECT_ATTRIBUTES objAttr;
    IO_STATUS_BLOCK ioStatusBlock;   
    UNICODE_STRING usFileName;
    DWORD ntStatus;
    HANDLE hRegKey;
    PKEY_VALUE_PARTIAL_INFORMATION regKeyInfo=0;
    DWORD regKeySize=sizeof(KEY_VALUE_PARTIAL_INFORMATION)+0x200;

    InitializeObjectAttributes(&objAttr,&shimRegRoot,0,0,0);
    ntStatus=ZwOpenKey(&hRegKey,KEY_QUERY_VALUE,&objAttr);
    if(ntStatus!=STATUS_SUCCESS){
        return ntStatus;
    }
    regKeyInfo=(KEY_VALUE_PARTIAL_INFORMATION*)ExAllocatePoolWithTag(PagedPool,regKeySize,'SHIM');
    if(regKeyInfo==0){
        ZwClose(hRegKey);
        return ntStatus;
    }
    ntStatus=ZwQueryValueKey(hRegKey,dllName,KeyValuePartialInformation,regKeyInfo,regKeySize,®KeySize);
    ZwClose(hRegKey);
    if(ntStatus!=STATUS_SUCCESS){
        ExFreePool(regKeyInfo);
        return ntStatus;
    }
#ifdef SHIM_DEBUG
    DbgPrint("shim injector: shim %ls added",regKeyInfo->Data);
#endif
    RtlInitUnicodeString(&usFileName,regKeyInfo->Data);
    InitializeObjectAttributes(&objAttr,&usFileName,OBJ_CASE_INSENSITIVE|OBJ_KERNEL_HANDLE,0,0);
    ntStatus=ZwOpenFile(&hFile,FILE_GENERIC_EXECUTE,&objAttr,&ioStatusBlock,FILE_SHARE_READ,FILE_SYNCHRONOUS_IO_NONALERT);
    if(ntStatus!=STATUS_SUCCESS){
        ExFreePool(regKeyInfo);
        return ntStatus;
    }
    RtlInitUnicodeString(&usFileName,sectionName);   
    ntStatus=ZwCreateSection(pSection,SECTION_ALL_ACCESS,&objAttr,0,PAGE_EXECUTE,SEC_IMAGE,hFile);
    ZwClose(hFile);
    ExFreePool(regKeyInfo);
    return ntStatus;
}

NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject,PUNICODE_STRING RegistryPath){
    DWORD ntStatus;   
#ifdef SHIM_DEBUG   
    DbgPrint("shim injector: loaded");
#endif
    ntStatus=mapShim(&hShimSection,&shimDllRegKey,shimSection);
#ifdef _WIN64
    if(ntStatus==STATUS_SUCCESS){
        ntStatus=mapShim(&hShimSection32,&shimDll32RegKey,shimSection32);
    }
#endif
    if(ntStatus==STATUS_SUCCESS){
        ntStatus=PsSetCreateProcessNotifyRoutine(processNotify,FALSE);
    }
    if(ntStatus!=STATUS_SUCCESS){
        ZwClose(hShimSection);
#ifdef _WIN64
        ZwClose(hShimSection32);
#endif
#ifdef SHIM_DEBUG
        DbgPrint("shim injector: unloaded (0x%x)",ntStatus);
#endif
    }
    DriverObject->DriverUnload=driverUnload;
    return ntStatus;
}
 
 
C#调用C++ DLL实战:C++/CLI桥接方案详解与避坑指南 在Windows平台软件开发中,托管语言(如C#)与非托管原生代码(如C++)的互操作是常见需求,尤其在需要复用高性能算法库或硬件驱动时。其核心原理是通过特定的“桥梁”技术,在公共语言运行时(CLR)与本地运行时之间进行数据类型转换和内存管理,从而实现跨语言调用。这项技术的核心价值在于能最大化利用现有C++代码资产,避免重写成本,同时为C#应用程序注入原生性能。典型的应用场景包括工业控制、游戏引擎、音视频处理等对计算性能要求较高的领域。本文聚焦于**C++/CLI**这一强大方案,通过构建托管包装器,自然封 阅读详情

相关推荐

攻防世界GFSJ1184_welcome_CAT_CTF

由于它是 PIE 可执行文件,程序加载地址会随机化,这导致你在 GDB 调试时需要处理地址偏移(如 0x246d 变成 0x55555540246d)。:client 程序通过网络连接(get_nc() 和 get_flag(nc))与 server 通信,server 监听在端口 8888。:client 依赖外部共享库(如 libstdc++.so),因此运行时需要这些库存在系统中。程序就是wasd移动,走到不同标记(* $ @ )下方,输入j回车,会有不同反应。两个文件client和server。

拥抱AI的老粽子 1265

Windows注入与拦截(6) -- 从内存中加载DLL

Windows提供的API(LoadLibrary, LoadLibraryEx)只支持从文件系统上加载DLL文件,我们无法使用这些API从内存中加载DLL。 但是有些时候,我们的确需要从内存中加载DLL,比如: 对发布的文件数量有限制。我们可以将DLL打包到exe的资源中,程序运行时从调用LoadResource等API读取DLL文件到内存中,然后从内存中加载DLL。 需要对DLL进行压缩...

while(1) { smile(); } 4万+

从飞机翼型仿真到燃烧模拟:Fluent多物理场耦合的3种实战策略

本文深入探讨了Fluent在多物理场耦合仿真中的三种实战策略,涵盖可压缩流动与燃烧耦合、湍流模型选择及网格策略,以及顺序耦合、强耦合和混合耦合方法。通过具体案例和工程实践,帮助中高级用户提升仿真精度和效率,适用于航空航天和能源化工等领域。

aa123的博客 994

修改导入表载入DLL

关于修改EXE文件的导入表,实际上是一个很古老的话题了(如果您是此中高手,请不要在这篇文章浪费时间了,如果您发现了其中的问题,还请多多指教).一些PE相关的软件,也都实现了这样的功能,例如Stud_PE.    Stud_PE通过添加一个新节并将导入表连同添加的内容一并复制到新节的方法来实现对DLL的导入.    使用这样的方法只要是PE格式的EXE文件,都可以实现导入DLL的功能,但此方法,实现

白日梦 7124

【OpenCV】复杂场景下的高精度圆检测实战(附完整代码)

本文针对OpenCV霍夫圆检测在复杂场景下易失效的问题,提出了一套基于轮廓分析的高精度圆检测实战方案。通过图像预处理、轮廓发现及多轮几何筛选(面积、周长、椭圆拟合、多边形逼近),有效排除噪声和类圆干扰物,显著提升复杂场景下的检测鲁棒性,并附完整可调参的Python代码实现。

weixin_29095587的博客 201

Mac和VScode配置fortran

macOS系统 vscode fortran gfortran 终端

weixin_43047707的博客 2412

c语言References添加dll,c – 如何修改运行时加载的DLL的导入地址表

我想在运行时挂钩从加载的DLL中调用的函数,我使用了“Windows Via C/C++”一书中的CAPIHook类(通过安装系统范围挂钩完成的DLL注入和通过修改IAT挂钩)但是这个只有在可执行文件的IAT中存在DLL名称/符号时,代码才有效. (即用于隐式DLL链接)这是DLL代码:CAPIHook::CAPIHook(PSTR pszCalleeModName,PSTR pszFuncNam...

weixin_35661054的博客 352

Debian 11 下用hostapd+dnsmasq搭建WiFi热点:从命令行到实战(避坑指南)

本文详细介绍了在Debian 11系统上,使用hostapd和dnsmasq从命令行搭建稳定WiFi热点的完整实战流程。内容涵盖环境准备、无线网卡AP模式检查、服务深度配置,并重点提供了从服务启动失败到客户端无法上网等常见问题的系统性排错指南,帮助用户避开配置陷阱,成功创建可用的无线接入点。

CAT789的专栏 777

一个向别的进程插入dll的代码

 --------- Functions in C ---------------CONTEXT OriginalContext; //Get/SetThreadContext's parameterchar OriginalCodePage[4096];DWORD sizeofCP=0;VOID* mySec; //my section...Offset of CodePage in t

1049

【乐鑫】唤醒词修改方法

乐鑫科技的语音识别模块(如ESP-SR)支持自定义唤醒词,但需通过官方工具链完成。

以实战经验介绍行业知识 828

OpenClaw 开机自启配置:Windows/macOS/Linux 全平台技术指南

OpenClaw 开机自启全平台配置指南 本文提供了在Windows、macOS和Linux系统上配置OpenClaw开机自启的完整技术方案。主要内容包括: Windows配置:提供三种方法(Windows服务、任务计划程序、启动文件夹),详细说明服务脚本创建、服务注册和测试流程 macOS配置:使用LaunchAgent实现开机自启,包含配置文件创建和加载方法 Linux配置:通过systemd服务实现,包括服务单元文件创建和启用步骤 系统要求:明确硬件(64位CPU/4GB内存)和软件(各平台操作系统版

一键难忘的博客 2995

[DLL 劫持] 修改 IAT ,让程序启动时加载自己的 DLL

请转到以下链接食用 ???? ????:https://www.cnblogs.com/LyShark/p/13697577.html

LYSM 1286

080、多轴运动控制:插补器设计(螺旋线插补)

本文分享了螺旋线插补器设计的实战经验。针对五轴点胶机Z轴抖动问题,作者分析了螺旋线数学本质,提出基于归一化时间参数的速度规划方法,强调各轴严格同步的重要性。文章详细介绍了速度分解、加减速处理、嵌入式优化技巧(查表法、定点化),并总结了起点闭合、速度波动、数值处理等常见问题解决方案。最后给出5条实用建议:注重速度规划而非纯数学推导、预先仿真、保留调试接口、考虑机械谐振、防范编码器丢脉冲。通过优化插补周期、电子齿轮比和S形速度曲线,成功将设备良率从60%提升至95%。

m0_50546716的博客 87

如何在EXE上绑定一个DLL

下面代码将在EXE文件中重建一个导入表,并将指定的DLL文件作为新的引用添加到导入表中,为什么要这样做呢?呵呵,用得到这种代码的人肯定不会想拿去做什么好事吧,所以用途就不介绍了!顺便说一下,下面代码已经处理了程序的附加数据和绑定引入,不会因为EXE存在附加数据或绑定引入导致添加失败。 #define NTSIGNATURE(a) ((LPVOID)((BYTE *)a + ((PIMAGE_D

tttx的专栏 2598

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

mfc.dll中间插入段为什么在遍历资源表开始进入第二层的时候就崩溃了。请大神指点指点

/资源表偏移+0x1000。//printf("资源类型ID:%d %s\n", pResDirEntry1[i].Id, szResName[pResDirEntry1[i].Id]);//dll地址 = LoadLibraryA("E:\\工作\\学习和例子\\mfc.dll中间插入段\\Release\\New_mfcdll.dll");//printf(" -->数据偏移:%p\n", RVA2FOA(pResData->OffsetToData, nt_header));

nmb60_100的博客 84

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

关于CAPL中Seed2Key DLL生成与调用

在实际的工程应用中,经常会遇到一些Seed2Key的算法问题,而且为了安全保密,这个算法的源码又不想公开,我们可以将其打包成DLL,然后在CAPL里面直接调用DLL即可。 1. Seed2Key DLL生成 1.1 复制工程模板 Vecory已经提供了DLL生成的工程模板,以Win7系统, CANoe 8.5为例,工程路径如下: C:\Users\Public\Documents\Vector\C...

farmer00的博客 1万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

在 C++Builder 工程里使用 Visual C++ DLL——第1部分:C函数

在 C++Builder 工程里使用 Visual C++ DLL——第1部分:C函数译者序:  第一次读这篇文章是在 2001 年 10 月,帮我解决了一点小问题。本来不好意思翻译,因为英语水平实在太差。最近发现不少网友在问在 C++Builder 的工程里调用 Visual C++ DLL 的问题,也许是用 C++Builder 的人比以前多了吧。于

shadowstar's blog 2967

【VC】DLL文件中添加对话框资源。。

创建“MFC DLL”工程,工程命CTestDll,接下来选择“使用 MFC DLL 共享 DLL”,点击“完成”。 资源工程中,从菜单中选择Insert->Resource,添加“Dialog”, 选择“New”,至此对话框已添加到DLL工程中。 为对话框添加一新类,如:CTestDlg,基类为CDialog。 在TestDll.cpp中添加接口函数: #include "TestDl

shen_wei的专栏 3711

在 C++Builder 工程里调用 DLL 函数

调用 Visual C++ DLL 给 C++Builder 程序员提出了一些独特的挑战。在我们试图解决 Visual C++ 生成的 DLL 之前,回顾一下如何调用一个 C++Builder 创建的 DLL 可能会有所帮助。调用 C++Builder 创建的 DLL 要比 Visual C++ 的少了许多障碍。   为了在你的 C++Builder 工程里调用 DLL,你需要三种元素:DLL ...

weixin_34117211的博客 848

c语言dll bcb,如何实现C++Builder调用DLL

尝试着进行C++Builder生成的 DLL 之前,回顾一下如何调用一个 C++Builder 创建的 DLL 可能会有给您的操作带来很大帮助,你可以在运行时载入 DLL,而不是使用引入库。调用 DLL 函数,首先通过选择菜单 Project | Add to Project 的方法,把引入库添加到你的 C++Builder 工程里;其次,在需要调用 DLL 函数的 C++ 源文件里为 DLL ...

weixin_36018773的博客 271

MFC三大dll使用总结

DLL指的是动态链接库(Dynamic Link Library),它是一个可以被多个应用程序(甚至是不同语言编写的应用程序)同时调用的可执行二进制文件,是一个可共享的库。DLL是建立在客户/服务器通信的概念上,包含若干函数、类或资源的库文件,函数和数据被存储在一个DLL(服务器)上并由一个或多个客户导出而使用,这些客户可以是应用程序或者是其它的DLL。显然,DLL是VC职业程序员的必修课,因为在

优秀技术文章收录 6500

扩展DLL中的资源使用

碰到了扩展DLL中的资源使用的问题,解决后,共享:) 简单的说:每个DLL有自己特有的资源。在使用时,明确的告诉系统要使用哪个DLL的资源。OK,现在的问题就是如何告诉系统使用哪个DLL的资源。函数:AfxSetResourceHandle() 可以完成这个功能。参数是资源的句柄。 那怎么得到某个DLL的资源句柄 呢?如下:在扩展DLL的入口函数extern "C" int APIENTRY Dl

anakin.jin的专栏 1806

用VC编制DLL程序的方法小结

作者: 赵永华 出处: yesky   DLL指的是动态链接库(Dynamic Link Library),它是一个可以被多个应用程序(甚至是不同语言编写的应用程序)同时调用的可执行二进制文件,是一个可共享的库。DLL是建立在客户/服务器通信的概念上,包含若干函数、类或资源的库文件,函数和数据被存储在一个DLL(服务器)上并由一个或多个客户导出而使用,这些客户可以是应用程序或者是其它的DLL。显然

要饭's Blog 1326

matlab编译dll vb调用,用matlab的deploytool生成DLL,VB无法调用的问题

matla使用的版本是2010a,VB6,例子来自一篇论文。练习时成功用deploytool函数生成了DLL,但最后在VB中调用时却报错,不知哪位大大知道是什么原因?谢谢!参考的例子如下第 一步 : MATLAB 软 件编译(1)新建函数文件(add.m)。 ( 保存至 C:\Users\Administrator\Desktop\DEMO),m文件内容如下:function y=Add(X1,X...

weixin_33199715的博客 2100
上一篇: Rootkit Unhooker 3.8.341.552新增MBR rootkit检测原理
下一篇: shellcode的一种ascii编码方法
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值