Форум: "Прочее";
Текущий архив: 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.042 c