【发布时间】:2016-07-09 12:58:47
【问题描述】:
这是我在这里的第一个问题,所以请不要对我太苛刻:)
我得到了什么:
一个混合模式的 C# dll,它具有 C# 代码,而 C# 代码又在同一个 dll 中调用本机方法,我对此很感兴趣
召唤:
int num3 = <Module>.fn_GetBitArray((byte*)(&$ArrayType$$$BY0DC@E), (byte*)(&$ArrayType$$$BY05E2), ref nHardwareType);
作为 IL
IL_0117: stind.i1
IL_0118: ldloca.s 9
IL_011a: ldloca.s 8
IL_011c: ldloca.s 7
IL_011e: call uint32 modopt([mscorlib]System.Runtime.CompilerServices.CallConvCdecl) '<Module>'::fn_GetBitArray(uint8*, uint8*, uint32* modopt([mscorlib]System.Runtime.CompilerServices.IsImplicitlyDereferenced) )
有这样的定义(ILSpy)
// <Module>
[SuppressUnmanagedCodeSecurity]
[MethodImpl(MethodImplOptions.Unmanaged | MethodImplOptions.PreserveSig)]
public unsafe static extern uint fn_GetBitArray(byte*, byte*, uint*);
我不知道如何从这里继续。当我在 IDA 中加载这个时,我可以选择 .NET 加载器,在那里我可以看到所有 C# 代码和调用,但看不到“外部”函数的偏移量,然后我可以选择 x86 模式,但所有函数都有编号通过(sub_XXXXXXXX),所以我需要偏移量。
问题: 我怎样才能知道这个调用是如何被解析并检索目标函数的?
PS:我很确定它真的没有导入,因为没有其他 dll 包含函数名称字符串(编写了一个快速工具来按十六进制模式搜索)并且所有导入都与其他内容相关。 ollydbg 也让我对 IL 感到困惑,正常的 c/c++ 很好,但是(也许是附带问题)我如何在那里找到 IL 函数名称?!
提前感谢您的宝贵时间
问候西弗吉尼亚州
【问题讨论】:
-
没有固定的偏移量。该函数得到即时编译,并且每次运行程序时都会有不同的地址。这个程序的作者没有使用C#,语言叫做C++/CLI。使用电话与他交谈。
-
“用电话和他说话” wtf?! “该程序的作者没有使用 C#,该语言称为 C++/CLI”那么为什么任何反射器都可以从中生成 vb/c# 代码,还有 IL?那为什么IDA会给出两种选择呢?本机函数仍然位于固定地址,即使链接到它的某些表更改了地址,对吗?那么如何识别正确的呢? “函数得到即时编译”所以你也说c ++部分还是什么?!?!我也不编译任何东西,这是一个现成的程序,不,我不知道作者
标签: c# c++ dll ida mixed-mode