用固定值绕过 C# 中的 DLL 调用?

Posted

技术标签:

【中文标题】用固定值绕过 C# 中的 DLL 调用?【英文标题】:Bypass a DLL call in C# with fixed value? 【发布时间】:2022-01-11 08:25:04 【问题描述】:

我有一个 DllImport,它需要一个带有两个字节引用的整数。我没有 DLL 的源代码,并且 DLL 响应的值不正确。

[DllImport("asd.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int state(ref byte ktime, ref byte is_h);

根据我有限的编程知识,这个调用将传递一个包含 15 字节数据的数组,正如需要所述数据的代码所建议的那样?

byte[] array2 = new byte[14];
byte[] array3 = new byte[1];
int num = state(ref array2[0], ref array3[0]);

该数据是一个时间戳 (YYYYMMDDHHMMSS) 和一个 15 字节数组中从 0 到 7 的单个数字。 所以我应该看到像 202112060141307 这样的东西。

我需要做的,不是让软件访问这个 DLL,而是让它只传递我选择的 15 字节数组。 我没有检查代码并对其进行编辑的原因是这被调用了 100 次,我们有多个版本的代码要测试,所以我们有多少版本的 100 倍。

假设我正朝着正确的方向前进,但我完全迷路了。这样做的正确方法是什么?

【问题讨论】:

我不确定我是否理解问题或问题是什么 所以你有一个来自 dll 的导出,它需要 2 个字节数组,你想传递一个数组? 你有100个版本的你正在测试的代码有什么实际的原因吗?如果没有,那么您应该了解源代码控制。 【参考方案1】:

您只需要一个小调解员...保持相同的签名...这样您的 100 个使用“状态”调用的地方就不需要编辑...然后您可以选择是否调用真正的底层 DLL 函数,或者只是设置您的“测试”数据。

这仅在您的代码中有一处(或仅有几处)执行函数的DLLImport 并且可以更改时才有效。

这意味着只需更改 DLLImport 的签名。

[DllImport("asd.dll", EntryPoint = "state", CallingConvention = CallingConvention.Cdecl)]
public static extern int asd_state(ref byte ktime, ref byte is_h);

public static int state(ref byte ktime, ref byte is_h)

    // some flag to control which is called or you could
    // use an #if definition

    if (callunderlyingdll)
        return asd_state(ref ktime, ref is_h);
    else
    
        ktime = ..your array here..
        is_h = ..your value here...

        return 0;
    

另一种方法是使用挂钩来挂钩“C#”“状态”函数,将其指向您的代码以设置返回的状态值......您需要一个挂钩库来执行此操作例如

https://github.com/pardeike/Harmony

【讨论】:

以上是关于用固定值绕过 C# 中的 DLL 调用?的主要内容,如果未能解决你的问题,请参考以下文章

用C++封装了Halcon的算法,返回值为Hobject类型,在C#中调用dll怎么用Hobject类型的返回值。

如何防止根设备绕过 Android 中的证书固定?

c# 中如何设置一个checkBox的值

C# DateTimePicker 显示值总是变化,如何设置使其固定?

从 C# 调用 C++ dll。 “无法封送'返回值':托管/非托管类型组合无效。”

在 Xcode 4.3 中设置属性值不固定/viewDidLoad 被多次调用