Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Объявить прототип ф-ции соглассно соглашению cdecl


Автор: EvilsInterrupt 19.6.2008, 14:36
Есть код:
Код

0101F0BA   57               PUSH EDI                                 ; Адрес куда распаковывать секцию
0101F0BB   FFB5 63050000    PUSH DWORD PTR SS:[EBP+563]              ; Адрес tmp`a
0101F0C1   E8 89020000      CALL <calc_.Func>                  ; хитрый механизм
0101F0C6   83C4 08          ADD ESP,8


а внутри:
Код

0101F34F > 55               PUSH EBP
0101F350   8BEC             MOV EBP,ESP
0101F352   60               PUSHAD
0101F353   55               PUSH EBP
0101F354   8B75 08          MOV ESI,DWORD PTR SS:[EBP+8]
0101F357   8B7D 0C          MOV EDI,DWORD PTR SS:[EBP+C]


Т.е. кажется это соглашение cdecl

С рипил ф-цию и обернул ее в такой прототип:
Код

function UnpackRoutine(aSource, aDestionation : Pointer) : Cardinal; cdecl; 
begin
  asm
    PUSH EBP
    MOV  EBP,ESP


и вызываю:
Код

    UnpackRoutine(lInSectionData, lTmpData );


В момент вызова UnpackRoutine lInSectionData содержит одно значение, но при загрузке в ESI там совершенно другое значение!

Видно проблема в том что надо вместо Pointer в прототипе что-то другое указывать , но что именно и как это победить ?

Очень прошу помочь ;)

Автор: Rennigth 19.6.2008, 14:50
EvilsInterrupt, врятли это из-за Pointer или не Pointer. Теже 4 байта, разницы никакой впринципе. Я в этом не силен, но может проблема в том что сама UnpackRoutine вызывается по умолчанию с register вроде...

Автор: EvilsInterrupt 19.6.2008, 14:53
Это уже эксперимент, ща поправлю, в начале стояло cdecl )

Автор: EvilsInterrupt 19.6.2008, 17:58
Вобщем я вставил весь код-ф-ции из отладчика, но дельфи сама ставит пролог и эпилог ф-ции, т.е. убрал:
Код

PUSH EBP
MOV EBP,ESP

то сразу прошло на ок! ;) Ща пока с эпилогом мучаюсь )

Может кто знает аналог _naked - ф-ций в С на Delphi ?

Добавлено через 6 минут и 10 секунд
Вот эпилог:
Код

u_FormMain.pas.229: MOV  DWORD PTR SS:[EBP-$04],EDI    // EAX будет содержать результат ф-ции
0045FBA9 36897DFC         mov [ebp-$04],edi
u_FormMain.pas.230: POPAD
0045FBAD 61               popad 
u_FormMain.pas.234: end;      
0045FBAE 8BC3             mov eax,ebx
0045FBB0 5B               pop ebx
0045FBB1 5D               pop ebp
0045FBB2 C3               ret 

вот ну никак не пойму, а нафига Delphi eax и ebx портит ?

может все таки кто-то знает как вставить нативные данные ?

Автор: EvilsInterrupt 20.6.2008, 12:28
Кароче решено, орел с cracklab.ru PE_Kill посказал решение и в итоге оно сводится К тому что надо писать без begin end; и в начале асм-вставки прописать pop ebp.

Код

function UnpackRoutine(aSrc, aDest : Pointer) : Cardinal; cdecl;
  asm
     pop ebp
..
 тута ваш нативный код выдранный из какой-либо программы )
..
  end;


видя pop ebp Delphi не будет делать пролог и эпилог ф-ции. Т.е. вы можете таким образом получить то что в си naked

Автор: bems 26.6.2008, 17:34
тут никогда ничего не было smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)