Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2006.02.12;
Скачать: [xml.tar.bz2];

Вниз

Экспортируемые dll функции   Найти похожие ветки 

 
Хинт ©   (2006-01-22 14:30) [0]

Как получить их список и передаваемые им параметры (их количество и типы)?


 
Lamer@fools.ua ©   (2006-01-22 14:41) [1]

>Как получить их список
tdump.exe

>передаваемые им параметры (их количество и типы)
В общем случае, никак.


 
Джо ©   (2006-01-22 14:50) [2]

Посмотреть в соответствующий заголовочный файл :)


 
Piter ©   (2006-01-22 14:50) [3]

Lamer@fools.ua ©   (22.01.06 14:41) [1]
В общем случае, никак


а не в общем случае? Анализируя код функции что ли? Типа сколько параметров из стека извлекается?

А типы? Анализируя как извлеченные указатели используются что ли? :)


 
sniknik ©   (2006-01-22 14:55) [4]

> а не в общем случае?
к примеру не общий случай, рядом с *.dll файл хедеров *.h лежит... или дока, или телефон разработчика. ;о)


 
Kerk ©   (2006-01-22 14:55) [5]

Количество параметров та же IDA легко определяет автоматически. С типом сложнее, это от языка зависит.


 
GuAV ©   (2006-01-22 15:21) [6]

Kerk ©   (22.01.06 14:55) [5]

> Количество параметров та же IDA легко определяет
> автоматически.


Не уверен что IDA покажет для этих случаев разное количесво параметров:

procedure Proc1(P1, P2, P3, P4: Integer); register;
procedure Proc2(P4: Integer); stdcall;

Буду удивлён, если IDA покажет для этих случаев разное количесво параметров:

procedure Proc3(Message: UINT; wParam: WPARAM;
 lParam: LPARAM; time: DWORD); stdcall;

procedure Proc4(Message: TMsg); stdcall;

{при stdcall нет неявной передачи по ссылке больших записей}


 
GuAV ©   (2006-01-22 15:26) [7]


>procedure Proc3(Message: UINT; wParam: WPARAM;
>  lParam: LPARAM; time: DWORD); stdcall;

Ошбися, имелось ввиду
procedure Proc3(Message: UINT; wParam: WPARAM;
 lParam: LPARAM; time: DWORD; pt: TPoint); stdcall;

, но думаю идея и так понятна.


 
Kerk ©   (2006-01-22 15:35) [8]

program test;

{$APPTYPE CONSOLE}

uses
 Windows,
 SysUtils;

procedure Proc1(P1, P2, P3, P4: Integer); register;
var
 P5: Integer;
begin
 P5 := P1 + P2 + P3 + P4;
 WriteLn(P5);
end;

procedure Proc2(P4: Integer); stdcall;
begin
 WriteLn(P4);
end;

procedure Proc3(Message: UINT; wParam: WPARAM;
lParam: LPARAM; time: DWORD); stdcall;
begin
 SendMessage(time,Message,wParam,lParam);
end;

procedure Proc4(Message: TMsg); stdcall;
begin
 SendMessage(Message.hwnd,Message.message, Message.wParam, Message.lParam);
end;

var
 Msg: TMsg;
begin
 Proc1(1,2,3,4);
 Proc2(5);
 Proc3(0,123,123,0);
 Proc4(Msg);
 ReadLn;
end.


Proc1:
CODE:0040876C sub_40876C      proc near               ; CODE XREF: CODE:0040887Dp
CODE:0040876C
CODE:0040876C arg_0           = dword ptr  8
CODE:0040876C
CODE:0040876C                 push    ebp
CODE:0040876D                 mov     ebp, esp
CODE:0040876F                 push    ebx
CODE:00408770                 lea     ebx, [edx+eax]
CODE:00408773                 add     ebx, ecx
CODE:00408775                 add     ebx, [ebp+arg_0]
CODE:00408778                 mov     eax, ds:off_409304
CODE:0040877D                 mov     edx, ebx
CODE:0040877F                 call    sub_40313C
CODE:00408784                 call    sub_403188
CODE:00408789                 call    @@_IOTest$qqrv  ; __linkproc__ _IOTest(void)
CODE:0040878E                 pop     ebx
CODE:0040878F                 pop     ebp
CODE:00408790                 retn    4
CODE:00408790 sub_40876C      endp


Proc2:
CODE:00408794 sub_408794      proc near               ; CODE XREF: CODE:00408884p
CODE:00408794
CODE:00408794 arg_0           = dword ptr  8
CODE:00408794
CODE:00408794                 push    ebp
CODE:00408795                 mov     ebp, esp
CODE:00408797                 mov     eax, ds:off_409304
CODE:0040879C                 mov     edx, [ebp+arg_0]
CODE:0040879F                 call    sub_40313C
CODE:004087A4                 call    sub_403188
CODE:004087A9                 call    @@_IOTest$qqrv  ; __linkproc__ _IOTest(void)
CODE:004087AE                 pop     ebp
CODE:004087AF                 retn    4
CODE:004087AF sub_408794      endp


Proc3:
CODE:004087B4 ; int __stdcall sub_4087B4(UINT Msg,WPARAM wParam,LPARAM lParam,HWND hWnd)
CODE:004087B4 sub_4087B4      proc near               ; CODE XREF: CODE:00408891p
CODE:004087B4
CODE:004087B4 Msg             = dword ptr  8
CODE:004087B4 wParam          = dword ptr  0Ch
CODE:004087B4 lParam          = dword ptr  10h
CODE:004087B4 hWnd            = dword ptr  14h
CODE:004087B4
CODE:004087B4                 push    ebp
CODE:004087B5                 mov     ebp, esp
CODE:004087B7                 mov     eax, [ebp+lParam]
CODE:004087BA                 push    eax             ; lParam
CODE:004087BB                 mov     eax, [ebp+wParam]
CODE:004087BE                 push    eax             ; wParam
CODE:004087BF                 mov     eax, [ebp+Msg]
CODE:004087C2                 push    eax             ; Msg
CODE:004087C3                 mov     eax, [ebp+hWnd]
CODE:004087C6                 push    eax             ; hWnd
CODE:004087C7                 call    SendMessageA
CODE:004087CC                 pop     ebp
CODE:004087CD                 retn    10h
CODE:004087CD sub_4087B4      endp


Proc4:
CODE:004087D0 ; int __stdcall sub_4087D0(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam)
CODE:004087D0 sub_4087D0      proc near               ; CODE XREF: CODE:004088A6p
CODE:004087D0
CODE:004087D0 hWnd            = dword ptr  8
CODE:004087D0 Msg             = dword ptr  0Ch
CODE:004087D0 wParam          = dword ptr  10h
CODE:004087D0 lParam          = dword ptr  14h
CODE:004087D0
CODE:004087D0                 push    ebp
CODE:004087D1                 mov     ebp, esp
CODE:004087D3                 mov     eax, [ebp+lParam]
CODE:004087D6                 push    eax             ; lParam
CODE:004087D7                 mov     eax, [ebp+wParam]
CODE:004087DA                 push    eax             ; wParam
CODE:004087DB                 mov     eax, [ebp+Msg]
CODE:004087DE                 push    eax             ; Msg
CODE:004087DF                 mov     eax, [ebp+hWnd]
CODE:004087E2                 push    eax             ; hWnd
CODE:004087E3                 call    SendMessageA
CODE:004087E8                 pop     ebp
CODE:004087E9                 retn    1Ch
CODE:004087E9 sub_4087D0      endp


 
Kerk ©   (2006-01-22 15:36) [9]

GuAV ©   (22.01.06 15:26) [7]

Идея ясна. Но это уже специфика ЯВУ. Фактически в Proc3 и Proc4 передается одно и то же, о чем IDA и сообщает.


 
Kerk ©   (2006-01-22 15:39) [10]

В [8] результат автоматического дизасма, если немного подработать руками, намного красивее конечно станет - на то IDA и интерактивная.


 
GuAV ©   (2006-01-22 15:40) [11]

Kerk ©   (22.01.06 15:35) [8]

В Proc3 я ошибся, объяви Proc3 так:
procedure Proc3(hwnd: HWND; Message: UINT; wParam: WPARAM;
lParam: LPARAM; time: DWORD; pt: TPoint); stdcall;

И не используй P1, P2, P3 и различий между Porc1 и Proc2, а тж между Proc3 и PRoc4 не будет


 
Kerk ©   (2006-01-22 15:42) [12]

GuAV ©   (22.01.06 15:40) [11]
И не используй P1, P2, P3 и различий между Porc1 и Proc2, а тж между Proc3 и PRoc4 не будет


Дык а в чем смысл функций, если параметры не использовать? А между Proc3 и Proc4 и не должно быть различий, потому что их просто нет.


 
GuAV ©   (2006-01-22 15:46) [13]


> Фактически в Proc3 и Proc4 передается одно и то же, о
> чем IDA и сообщает.

Именно, а количество параметров разное. Есть такая особенность stdcall. Поэтому определить как было в исходнике невозможно.

Также если регистровые параметры не использовались, то не всегда можно выявить их наличие (Proc1, Proc2). То же касается параметров cdecl.

Т.е. можно написать работающие для этой версии dll объявления, но исходный заголовок восстановить не всегда удастся.


 
Kerk ©   (2006-01-22 15:49) [14]

GuAV ©   (22.01.06 15:46) [13]
Т.е. можно написать работающие для этой версии dll объявления, но исходный заголовок восстановить не всегда удастся.


Это само собой. Просто я показал пессимистам, что не все так страшно и плохо. :)


 
SPeller ©   (2006-01-22 21:05) [15]

Kerk ©   (22.01.06 15:49) [14]
Осталось токо написать дизассеблер, который будет вычислять кол-во и типы парметров :)


 
Игорь Шевченко ©   (2006-01-23 13:47) [16]

Kerk ©   (22.01.06 14:55) [5]


> Количество параметров та же IDA легко определяет автоматически


Натрави ИДУ на системную библиотеку из готовой версии Windows, удивись автоматическому подсчету параметров.

Натрави ИДУ на классическую сишную программу - удивись тому же



Страницы: 1 вся ветка

Форум: "Прочее";
Текущий архив: 2006.02.12;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.048 c
2-1138099309
SergeyZ
2006-01-24 13:41
2006.02.12
Обновление пути в ярлыке.


2-1138188142
VitalikS
2006-01-25 14:22
2006.02.12
Invalid use of keyword


15-1137789335
Cerberus
2006-01-20 23:35
2006.02.12
Рассказик


2-1138183216
aviseral
2006-01-25 13:00
2006.02.12
Из Excel в DBGrid


4-1130924180
Id
2005-11-02 12:36
2006.02.12
Информация о винте





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский