【问题标题】:Retrieve native function address from mixed mode dll with IDA or Olly使用 IDA 或 Olly 从混合模式 dll 中检索本机函数地址
【发布时间】: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


【解决方案1】:

环顾四周后,解决方案很容易。是的,代码在不同的地方加载,但段偏移是相同的。所以我使用了 ILDASM 并加载了 dll,我的函数现在说:

.method public static pinvokeimpl(/* No map */) 
    uint32 modopt([mscorlib]System.Runtime.CompilerServices.CallConvCdecl) 
    fn_GetBitArray(uint8* A_0,
                   uint8* A_1,
                   uint32* modopt([mscorlib]System.Runtime.CompilerServices.IsImplicitlyDereferenced) A_2) native unmanaged preservesig
{
  .custom instance void [mscorlib]System.Security.SuppressUnmanagedCodeSecurityAttribute::.ctor() = ( 01 00 00 00 ) 
  // Embedded native code
  // Disassembly of native methods is not supported.
  //  Managed TargetRVA = 0x0003FD80
} // end of method 'Global Functions'::fn_GetBitArray

所以我去了IDA,发现它在0x1003FD80,真好^^

【讨论】:

  • 在将 DLL 加载到 IDA Pro 时选择了哪些文件类型和处理器选项?
猜你喜欢
  • 2014-09-08
  • 2011-09-22
  • 2010-12-13
  • 2018-03-27
  • 2015-08-02
  • 1970-01-01
  • 2014-04-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多