ida pro не показывает полную функцию экспорта в разобранном виде?

Пожалуйста, извините мой вопрос новичка, но когда я попытался экспортировать функцию в заголовок, используя

__declspec(dllexport) void testfunction(double i);

и объявил функцию в файле .cpp следующим образом

void testfunction(double i) {
   for (int k = 0; k<10; k++) {
        double j = 0.1;
   }    
}

Я вижу это только для функции после дизассемблирования файла .exe с помощью IDA pro:

.text:00401130 ; void __cdecl testfunction(double)
.text:00401130                 public ?testfunction@@YAXN@Z
.text:00401130 ?testfunction@@YAXN@Z proc near         ; DATA XREF: .rdata:off_40BE88o
.text:00401130                 jmp     dword_40C000
.text:00401130 ?testfunction@@YAXN@Z endp

Ниже я указал местоположение dword_40C000.

.data:0040C000 ; Section 3. (virtual address 0000C000)
.data:0040C000 ; Virtual size                  : 000004A0 (   1184.)
.data:0040C000 ; Section size in file          : 00000200 (    512.)
.data:0040C000 ; Offset to raw data for section: 0000B200
.data:0040C000 ; Flags C0000040: Data Readable Writable
.data:0040C000 ; Alignment     : default
.data:0040C000 ; ===========================================================================
.data:0040C000
.data:0040C000 ; Segment type: Pure data
.data:0040C000 ; Segment permissions: Read/Write
.data:0040C000 _data           segment para public 'DATA' use32
.data:0040C000                 assume cs:_data
.data:0040C000                 ;org 40C000h
.data:0040C000 dword_40C000    dd 6000001h             ; DATA XREF: testfunction(double)r
.data:0040C004                 align 10h
.data:0040C010                 db    2
.data:0040C011                 db    0
.data:0040C012                 db    0
.data:0040C013                 db    0
.data:0040C014                 db    2
.data:0040C015                 db    0
.data:0040C016                 db    0
.data:0040C017                 db    0
.data:0040C018 dword_40C018    dd 6000003h             ; DATA XREF: .text:004011A0r
.data:0040C01C dword_40C01C    dd 6000004h             ; DATA XREF: .text:004011D0r
.data:0040C020 dword_40C020    dd 6000005h             ; DATA XREF: .text:00401200r
...

Разве не должно быть больше кода, так как у меня есть цикл for и некоторые другие вещи? Где реальный код?


person Mark    schedule 12.01.2014    source источник
comment
Вероятно, его оптимизировали, так как он ничего не делает.   -  person Mike Vine    schedule 13.01.2014
comment
@MikeVine: Понятно, не могли бы вы дать ответ, как отключить оптимизацию для Visual Studio 2010? Редактировать: Кажется, оптимизация была отключена в соответствии с меню конфигурации...   -  person Mark    schedule 13.01.2014
comment
О, и, пожалуйста, покажите нам код, на который указывают прыжки. Я думаю, что это настоящие проблемы, поскольку вы проверяете связь файла с .dll. Динамическое связывание реализовано прыжками (под окнами).   -  person Sebastian Hoffmann    schedule 13.01.2014
comment
@Paranaix: Привет, я указал, куда перешел код.   -  person Mark    schedule 13.01.2014
comment
Ах, мне не нравится синтаксис IDA. Ну, как я уже сказал, ваша ОС (Windows) записывает адрес реального местоположения функции в dword_40C000 после загрузки модуля (файла .dll). Таким образом, когда дизассемблированная функция вызывается, она фактически переходит к реальной функции, содержащейся в загруженном модуле. Это называется динамическим связыванием.   -  person Sebastian Hoffmann    schedule 13.01.2014
comment
Возможно, это только листинг таблицы экспорта, а не фактическая функция?   -  person BeniBela    schedule 13.01.2014
comment
@Paranaix: я не использовал dll. Я запустил новый .exe, используя параметр приложения формы из VS2010, и объявил эту функцию в заголовке и файле .cpp. Откуда берутся динамические ссылки?   -  person Mark    schedule 13.01.2014
comment
@Mark Почему тогда вы объявляете свою функцию с помощью __declspec(dllexport)?   -  person Sebastian Hoffmann    schedule 13.01.2014
comment
@Paranaix: я хотел более легко определить местоположение функции в IDA, поскольку есть хорошее окно экспорта экспортируемых функций. Первоначально я использовал файл dll для эксперимента и использовал __declspec (dllexport), но дизассемблированный вывод был таким же, как exe.   -  person Mark    schedule 13.01.2014
comment
@Mark Ну, компиляция приведенного выше кода без оптимизации с использованием MSVC дает мне ожидаемый asm: pastebin.com/wYWrqvPx . Я действительно считаю, что ваша компиляция или связь как-то испорчены.   -  person Sebastian Hoffmann    schedule 13.01.2014
comment
@Paranaix кажется, что после удаления __declspec(dllexport) я смог увидеть код фактической функции. Раньше я мог видеть только экспортированную таблицу?   -  person Mark    schedule 13.01.2014


Ответы (1)


Кажется, вы используете C++/CLI. Я думаю, что 6000001 - это токен управляемого метода, он будет заменен адресом JIT-кода во время выполнения.

Скомпилируйте свой двоичный файл для нативной x86, чтобы увидеть машинный код.

person Igor Skochinsky    schedule 13.01.2014