2016-03-22 5 views
0

это мой первый вопрос здесь, так что, пожалуйста, не слишком сильно на меня :)Получить родной адрес функции из смешанного режима 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

+0

Там нет фиксированного смещения. Функция получает точно в срок скомпилирована и будет иметь разные адреса при каждом запуске программы. Автор этой программы не использовал C#, язык называется C++/CLI. Используйте телефон, чтобы поговорить с ним. –

+0

«Используйте телефон, чтобы поговорить с ним» wtf ?! «Автор этой программы не использовал C#, язык называется C++/CLI», так почему любой отражатель может вывести код vb/C# из него, также IL? почему МАР дает два варианта? нативные функции все еще находятся на фиксированном адресе, даже если какая-то таблица, ссылающаяся на него, меняет адрес, правильно? так как определить правильный? «Функция получает точно в срок, скомпилированный», так что вы тоже говорите, что C++-часть, или что?!?! также я не компилирую ничего, это готовая программа, и я не знаю автора – WarrantyVoider

ответ

0

осмотрев решения было легко. да, код загружается в разных местах, но смещение сегмента такое же. так что я использовал 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, как мило ^^