это мой первый вопрос здесь, так что, пожалуйста, не слишком сильно на меня :)Получить родной адрес функции из смешанного режима DLL с IDA или Olly
Что я получил:
смешанный режим C DLL #, что есть C# код, который в свою очередь вызывает нативный метод в той же DLL, что им интересуется
вызывающий:
int num3 = <Module>.fn_GetBitArray((byte*)(&[email protected]), (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: im довольно уверен, что его действительно не импортировали, потому что никакая другая dll не содержит строку имени функции (написал быстрый инструмент для поиска по шестнадцатеричным шаблонам), и все импорты связаны с другими вещами. также ollydbg смущает меня из-за меня по отношению к IL, нормальный c/C++ отлично, но (возможно, как побочный вопрос), как найти имена функций IL там ?!
заранее спасибо за ваше время
Greetz WV
Там нет фиксированного смещения. Функция получает точно в срок скомпилирована и будет иметь разные адреса при каждом запуске программы. Автор этой программы не использовал C#, язык называется C++/CLI. Используйте телефон, чтобы поговорить с ним. –
«Используйте телефон, чтобы поговорить с ним» wtf ?! «Автор этой программы не использовал C#, язык называется C++/CLI», так почему любой отражатель может вывести код vb/C# из него, также IL? почему МАР дает два варианта? нативные функции все еще находятся на фиксированном адресе, даже если какая-то таблица, ссылающаяся на него, меняет адрес, правильно? так как определить правильный? «Функция получает точно в срок, скомпилированный», так что вы тоже говорите, что C++-часть, или что?!?! также я не компилирую ничего, это готовая программа, и я не знаю автора – WarrantyVoider