Получить собственный адрес функции из dll смешанного режима с помощью IDA или Olly

это мой первый вопрос здесь, поэтому, пожалуйста, не будьте слишком строги ко мне :)

Что я имею:

dll C# смешанного режима, в которой есть код C#, который, в свою очередь, вызывает собственный метод в той же dll, которая меня интересует

Вызов:

int num3 = <Module>.fn_GetBitArray((byte*)(&$ArrayType$$$BY0DC@E), (byte*)(&$ArrayType$$$BY05E2), ref nHardwareType);

as 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 ?!

Спасибо заранее за ваше время

приветс WV


person WarrantyVoider    schedule 22.03.2016    source источник
comment
Фиксированного смещения нет. Функция компилируется точно в срок и будет иметь другой адрес каждый раз, когда вы запускаете программу. Автор этой программы не использовал C#, язык называется C++/CLI. Используйте телефон, чтобы поговорить с ним.   -  person Hans Passant    schedule 22.03.2016
comment
Использовать телефон, чтобы поговорить с ним, wtf?! Автор этой программы не использовал C#, язык называется C++/CLI, так почему любой рефлектор может создавать из него код vb/c#, еще и IL? почему тогда IDA дает два варианта? собственные функции по-прежнему находятся по фиксированному адресу, даже если какая-то таблица, ссылающаяся на нее, меняет адрес, верно? так как определить правильный? Функция компилируется точно в срок, поэтому вы говорите, что часть C ++ тоже или что?!?! также я ничего не компилирую, это готовая программа и автора я не знаю   -  person WarrantyVoider    schedule 22.03.2016


Ответы (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, как хорошо ^^

person WarrantyVoider    schedule 23.03.2016
comment
Какой тип файла и параметры процессора вы выбрали при загрузке DLL в IDA Pro? - person Kesantielu Dasefern; 05.05.2021