为什么 C# 编组字符串不适用于 C++ DLL

你Q。

我在将字符串传递给外部 DLL 中的某个函数时遇到问题。我会发布一个实际的代码片段,但它有点凌乱,可能难以阅读。以下片段是我的个人代码归结为的内容。

C#文件(UNICODE)

[DllImport("InjectDll.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
private static extern ulong FindProgramProcessId(string procName);
[DllImport("InjectDll.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
private static extern bool InjectIntoProcess(ulong procId, string Dll);
string ProcName = "random_test_game.exe";
string DllPath = @"C:\ProgramData\Hack\File.dll";
ulong procId = FindProgramProcessId(ProcName);
bool Injected = InjectIntoProcess(procId, DllPath);

C++ 文件 (ANSI)

DllExport DWORD FindProgramProcessId(const char* procName)
{
    ...
}
DllExport bool InjectIntoProcess(DWORD procId, const char* Dll)
{
    if (Dll == nullptr)
    {
        MessageBox(NULL, "DLL", "EMPTY", MB_OK);
        return false;
    }
    ...
}

C++ 头文件

#pragma once
#include <Windows.h>
#include <TlHelp32.h>
#include <string>
#ifdef EXPORT
#define DllExport __declspec(dllexport)
#else
#define DllExport __declspec(dllimport)
#endif
extern "C" DllExport DWORD FindProgramProcessId(const char* procName);
extern "C" DllExport bool InjectIntoProcess(DWORD procId, const char* Dll);

引用片段,所产生的问题是,FindProgramProcessId将成功地传递一个字符串,没有problemo,但InjectIntoProcess将显示const char* Dllnullptr根据“额外”的代码,我把这种方法。

请注意,我已尝试通过IntPtr代替string并使用Marshal.StringToHGlobalAnsi,但我仍然遇到Dll == nullptr问题。它破坏了我的代码。更多相同的信息可以在我的GuidedHacking线程中找到。

艾蒂安·德·马泰尔

Win32DWORD是一个 32 位整数,而 C#ulong是一个 64 位整数。混淆源于它DWORD是 的别名unsigned long,但 C++long不一定是 64 位(实际上,在 MSVC 中,它是 32 位;unsigned long long是 64 位无符号整数)。

由于您使用的是 cdecl 调用约定,调用者负责清理堆栈(因此不会发生崩溃),并且参数从右到左传递(因此Dll最终指向传递给 的值中间的某个位置procId,即可能包含零)。或者至少这是我的猜测,因为我们在这里处于未定义的行为领域。

您应该声明as的返回值FindProgramProcessIdprocId参数InjectIntoProcessuint

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C中的HashTable不适用于字符串

来自分类Dev

函数调用适用于字符串文字,但不适用于字符串变量C

来自分类Dev

C#和C ++ dll-编组字符串

来自分类Dev

为什么“ a或b或c”不适用于NumPy数组?

来自分类Dev

C#锁(“字符串”)不适用于动态参数?

来自分类Dev

C中使用无效指针的通用堆栈不适用于字符串

来自分类Dev

C#字符串比较不适用于斜杠

来自分类Dev

C#-Lucene搜索不适用于少数字符串文字

来自分类Dev

C ++ While语句不适用于字符串和“或”

来自分类Dev

C中使用无效指针的通用堆栈不适用于字符串

来自分类Dev

C++ rand() 不适用于字符串数组

来自分类Dev

在 Python 中编译和连接 C DLL 适用于 Unix,但不适用于 Windows。这样做的正确方法是什么?

来自分类Dev

从C#到C-DLL调用/封送该结构时,为什么此字符串为空?

来自分类Dev

<c:if>不适用于比较字符

来自分类Dev

为什么C ++中的“不完整类型错误”不适用于嵌套类

来自分类Dev

为什么fwrite不适用于C中的二进制文件?

来自分类Dev

将字符串日期转换为纪元时间不适用于Cython和POSIX C库

来自分类Dev

C ++字符串流问题:getline不适用于stringstream

来自分类Dev

<c:forEach>不适用于打印字符串列表

来自分类Dev

通过dll边界的C字符串

来自分类Dev

为什么〜(true ^ true)不成立?布尔运算符(否定)适用于`unsigned char`,但不适用于bool?(C ++)

来自分类Dev

为什么〜(true ^ true)不成立?布尔运算符(否定)适用于`unsigned char`,而不适用于布尔值吗?(C ++)

来自分类Dev

为什么这个 C++ 程序适用于第一行输入而不适用于第二行或第三行?

来自分类Dev

C字符串作为模板非类型参数可在gcc 6.3中使用,但不适用于Visual Studio 2017(x64为19.16.27027.1)

来自分类Dev

加速的C ++ 14-5:自定义字符串类和引用计数器适用于一个构造函数,但不适用于另一个构造函数

来自分类Dev

加速的C ++ 14-5:自定义字符串类和引用计数器适用于一个构造函数,但不适用于另一个构造函数

来自分类Dev

为什么字符串concat宏不适用于这种“ +”情况?

来自分类Dev

内置函数不适用于求值字符串,为什么?

来自分类Dev

为什么std :: uppercase不适用于字符串?

Related 相关文章

  1. 1

    C中的HashTable不适用于字符串

  2. 2

    函数调用适用于字符串文字,但不适用于字符串变量C

  3. 3

    C#和C ++ dll-编组字符串

  4. 4

    为什么“ a或b或c”不适用于NumPy数组?

  5. 5

    C#锁(“字符串”)不适用于动态参数?

  6. 6

    C中使用无效指针的通用堆栈不适用于字符串

  7. 7

    C#字符串比较不适用于斜杠

  8. 8

    C#-Lucene搜索不适用于少数字符串文字

  9. 9

    C ++ While语句不适用于字符串和“或”

  10. 10

    C中使用无效指针的通用堆栈不适用于字符串

  11. 11

    C++ rand() 不适用于字符串数组

  12. 12

    在 Python 中编译和连接 C DLL 适用于 Unix,但不适用于 Windows。这样做的正确方法是什么?

  13. 13

    从C#到C-DLL调用/封送该结构时,为什么此字符串为空?

  14. 14

    <c:if>不适用于比较字符

  15. 15

    为什么C ++中的“不完整类型错误”不适用于嵌套类

  16. 16

    为什么fwrite不适用于C中的二进制文件?

  17. 17

    将字符串日期转换为纪元时间不适用于Cython和POSIX C库

  18. 18

    C ++字符串流问题:getline不适用于stringstream

  19. 19

    <c:forEach>不适用于打印字符串列表

  20. 20

    通过dll边界的C字符串

  21. 21

    为什么〜(true ^ true)不成立?布尔运算符(否定)适用于`unsigned char`,但不适用于bool?(C ++)

  22. 22

    为什么〜(true ^ true)不成立?布尔运算符(否定)适用于`unsigned char`,而不适用于布尔值吗?(C ++)

  23. 23

    为什么这个 C++ 程序适用于第一行输入而不适用于第二行或第三行?

  24. 24

    C字符串作为模板非类型参数可在gcc 6.3中使用,但不适用于Visual Studio 2017(x64为19.16.27027.1)

  25. 25

    加速的C ++ 14-5:自定义字符串类和引用计数器适用于一个构造函数,但不适用于另一个构造函数

  26. 26

    加速的C ++ 14-5:自定义字符串类和引用计数器适用于一个构造函数,但不适用于另一个构造函数

  27. 27

    为什么字符串concat宏不适用于这种“ +”情况?

  28. 28

    内置函数不适用于求值字符串,为什么?

  29. 29

    为什么std :: uppercase不适用于字符串?

热门标签

归档