Сейчас на форуме: hgdagon, asfa, bartolomeo (+6 невидимых) |
![]() |
eXeL@B —› Программирование —› Снова про DLL :( |
<< . 1 . 2 . 3 . >> |
Посл.ответ | Сообщение |
|
Создано: 29 октября 2006 23:11 · Поправил: crash_rider · Личное сообщение · #1 НУ вроде вытащил из Dll fd_usb.dll---> CreateInterface имеет : CreateInterface proc near CODE:008C3940 push ebp CODE:008C3941 mov ebp, esp CODE:008C3943 mov eax, offset unk_8C5668 вот это что такое????? не понять.... CODE:008C3948 mov dword ptr [eax], offset sub_8C3880 CODE:008C394E mov dword ptr [eax+4], offset nullsub_1 CODE:008C3955 mov dword ptr [eax+8], offset sub_8C388C CODE:008C395C mov dword ptr [eax+0Ch], offset sub_8C3894 CODE:008C3963 mov dword ptr [eax+10h], offset nullsub_2 CODE:008C396A mov dword ptr [eax+14h], offset nullsub_3 CODE:008C3971 mov dword ptr [eax+18h], offset sub_8C38A4 CODE:008C3978 mov dword ptr [eax+1Ch], offset sub_8C38AC CODE:008C397F mov dword ptr [eax+20h], offset nullsub_4 CODE:008C3986 mov dword ptr [eax+24h], offset nullsub_5 CODE:008C398D mov dword ptr [eax+28h], offset nullsub_6 CODE:008C3994 mov dword ptr [eax+2Ch], offset sub_8C38C0 CODE:008C399B mov dword ptr [eax+30h], offset sub_8C38C8 CODE:008C39A2 mov dword ptr [eax+34h], offset sub_8C38D0 CODE:008C39A9 mov dword ptr [eax+38h], offset nullsub_7 CODE:008C39B0 mov dword ptr [eax+3Ch], offset nullsub_8 CODE:008C39B7 mov dword ptr [eax+40h], offset sub_8C38E0 CODE:008C39BE mov dword ptr [eax+44h], offset sub_8C38E8 CODE:008C39C5 mov dword ptr [eax+48h], offset nullsub_9 CODE:008C39CC mov dword ptr [eax+4Ch], offset nullsub_10 CODE:008C39D3 mov dword ptr [eax+50h], offset nullsub_11 CODE:008C39DA mov dword ptr [eax+54h], offset sub_8C38FC CODE:008C39E1 mov dword ptr [eax+58h], offset nullsub_12 CODE:008C39E8 mov dword ptr [eax+5Ch], offset sub_8C3908 CODE:008C39EF mov dword ptr [eax+60h], offset sub_8C3910 CODE:008C39F6 mov dword ptr [eax+64h], offset sub_8C3918 CODE:008C39FD mov dword ptr [eax+68h], offset sub_8C3920 CODE:008C3A04 mov dword ptr [eax+6Ch], offset sub_8C3928 CODE:008C3A0B mov dword ptr [eax+70h], offset sub_8C3930 CODE:008C3A12 mov dword ptr [eax+74h], offset sub_8C3938 CODE:008C3A19 pop ebp CODE:008C3A1A retn CODE:008C3A1A CreateInterface endp Пишу на Delphi Dll с экспортируемой процедурой CreateInterface TIn_Module = record // mov eax, offset unk_8C5668 Arrayof : Array [0..120] of byte ; Sub_Msvcrt: function(a4:integer):integer;stdcall; // sub_8C3880 sub_10002B10: procedure; // nullsub_1 sub_10001110: function(a4:integer):integer;stdcall; // sub_8C388C sub_10001120: function(a4:integer;a84:integer):integer;stdcall; // sub_8C3894 CloseAllHandle: procedure; // nullsub_2 Func_DeviceIoControl: procedure; // nullsub_3 sub_10001220: function(a4:integer):integer;stdcall; // sub_8C38A4 sub_100012F0: function(a4:integer):integer;stdcall; // sub_8C38AC sub_10001210: procedure; // nullsub_4 sub_10001160: procedure; // nullsub_5 sub_100011B0: procedure; // nullsub_6 sub_10001320: function(a4:integer;a8:integer;a16:integer):integer;stdcall; // sub_8C38C0 sub_10001370: function(a4:integer;a8:integer;a16:integer):integer;stdcall; // sub_8C38C8 sub_100013C0: function(a4:integer;a84:integer):integer;stdcall; // sub_8C38D0 sub_10001400: procedure; // nullsub_7 sub_10001450: procedure; // nullsub_8 sub_10001460: function(a4:integer;a84:integer):integer;stdcall; // sub_8C38E0 sub_10001530: function(a4:integer;a84:integer):integer;stdcall; // sub_8C38E8 sub_10001590: procedure; // nullsub_9 sub_10001600: procedure; // nullsub_10 sub_10001450copy: procedure; // nullsub_11 sub_10001640: function(a4:integer;a8:integer;a16:integer):integer;stdcall; // sub_8C38FC sub_10001750: procedure; // nullsub_12 sub_10001D20: function(a4:integer;a8:integer;a16:integer):integer;stdcall; // sub_8C3908 sub_10001D40: function(a4:integer;a8:integer;a16:integer):integer;stdcall; // sub_8C3910 sub_10001D60: function(a4:integer):integer;stdcall; // sub_8C3918 WriteCommand: function(a4:integer):integer;stdcall; // sub_8C3920 WriteCommand2: function(a4:integer;a84:integer):integer;stdcall; // sub_8C3928 ReadCommand: function(a4:integer;a84:integer):integer;stdcall; // sub_8C3930 Facet_locale_std__AEPAXI_Z: function(a4:integer):integer;stdcall; // sub_8C3938 end; обзываю ее fd_usb.dll запускаю менеджер, чтобы посмотреть что там передаеться смотрим в отладчике вылетает эксепшин ![]() ![]() |
|
Создано: 06 ноября 2006 15:23 · Личное сообщение · #2 |
|
Создано: 06 ноября 2006 15:38 · Личное сообщение · #3 |
|
Создано: 06 ноября 2006 19:23 · Личное сообщение · #4 |
|
Создано: 07 ноября 2006 15:12 · Поправил: crash_rider · Личное сообщение · #5 typedef unsigned int ULONG32, *PULONG32; typedef unsigned int DWORD32, *PDWORD32; typedef unsigned int UINT32, *PUINT32; class Big { public: In_Module field1; UINT32 field2; UINT32 theRest[154]; UINT32 lastField; }; class Small { public: UINT32 field1, field2; UINT32 theRest[154]; UINT32 lastField; }; extern Big Class_Big; Big *p1 = new Big; //0x274 bytes, no constructor //p1->field1 = global1; // +0..... то что по адресу 0x10004070 Small *p2 = new Small; // 0x14 bytes, no constructor //sub_100227f0(); //p1->field2 = p2; // +4 //p1->lastField = 0; // +0x270 //return p1; Ну типа объявил а теперь не могу Big Class_Big= { //PDWORD32*(0); 0, 0, //PDWORD32(In_Module)), не проходит преобразование как теперь засунуть In_Module и p2 в UINT32? а In_Module это оффсет по адресу 0x10004070 , 0}; extern "C" __declspec (dllexport) Big *CreateInterface () { return &Class_Big; } ![]() |
|
Создано: 07 ноября 2006 16:00 · Личное сообщение · #6 crash_rider 1) глобальная переменная должна быть не instance a pointer: "Big *g_big;" например 2) extern не надо 3) всё это пинется в одном С++ файле 4) инициализация с { } в C++ не канает 5) выделение памяти должно быть в самом CreateInterface() - так было в оригинале 6) в конче функции пиши "return g_big;" 7) по поводу адресов - запись примерно такая: "g_big->field1 = &g_someOtherGlobal;" а в ней уже адреса функций. Кста, эти адреса можно как раз через { } забить во время компиляции ![]() |
|
Создано: 07 ноября 2006 16:35 · Личное сообщение · #7 |
|
Создано: 07 ноября 2006 16:36 · Поправил: crash_rider · Личное сообщение · #8 |
|
Создано: 07 ноября 2006 18:13 · Поправил: crash_rider · Личное сообщение · #9 In_Module mod = { sub_10001090, sub_10002B10, sub_10001110, sub_10001120, sub_10001140, sub_10001150, sub_10001220, sub_100012F0, sub_10001210, sub_10001160, sub_100011B0, sub_10001320, sub_10001370, sub_100013C0, sub_10001400, sub_10001450, sub_10001460, sub_10001530, sub_10001590, sub_10001600, sub_10001450copy, sub_10001640, sub_10001750, sub_10001D20, sub_10001D40, sub_10001D60, sub_10001D70, sub_10001D80, sub_10001DA0, }; extern "C" пришлось оставить иначе добавляются символы всякие (как там прально манглед или мангл) __declspec (dllexport) Big *CreateInterface () создаю все в CreateInterface как в асм исходнике а VC++ его запихивает кудато ![]() { In_Module mod; Big *p1 = new Big; //0x274 bytes, no constructor p1->field1 = (UINT32)&mod; // +0..... òî ÷òî ëåæèò â 0x10004070 Small *p2 = new Small; // 0x14 bytes, no constructor //sub_100227f0(); p1->field2 = (UINT32)p2; // +4 p1->lastField = 0; // +0x270 return p1; } Вроде скомпилил, но в иде что то не то! CreateInterface proc near jmp sub_10015180 переход на процедуру где уже выполняеться создание классов CreateInterface endp а должно быть вот что public CreateInterface .text:10001000 CreateInterface proc near .text:10001000 .text:10001000 var_14 = dword ptr -14h .text:10001000 var_10 = dword ptr -10h .text:10001000 var_C = dword ptr -0Ch .text:10001000 var_4 = dword ptr -4 .text:10001000 .text:10001000 push 274h .text:10001005 call operator new(uint) .text:1000100A add esp, 4 .text:1000100D test eax, eax .text:1000100F jz short loc_10001018 .text:10001011 mov ecx, eax .text:10001013 jmp loc_10001020 .text:10001018 ; ---------------------------------------------------------------------- ----- .text:10001018 .text:10001018 loc_10001018: ; CODE XREF: CreateInterface+Fj .text:10001018 xor eax, eax .text:1000101A retn .text:1000101A ; ---------------------------------------------------------------------- ----- .text:1000101B align 10h .text:10001020 .text:10001020 loc_10001020: ; CODE XREF: CreateInterface+13j .text:10001020 push 0FFFFFFFFh .text:10001022 push offset loc_10003A53 .text:10001027 mov eax, large fs:0 .text:1000102D push eax .text:1000102E mov large fs:0, esp .text:10001035 sub esp, 8 .text:10001038 push esi .text:10001039 mov esi, ecx .text:1000103B mov [esp+18h+var_14], esi .text:1000103F push 14h .text:10001041 mov [esp+1Ch+var_4], 0 .text:10001049 mov dword ptr [esi], offset off_10004070 .text:1000104F call operator new(uint) .text:10001054 add esp, 4 .text:10001057 mov [esp+18h+var_10], eax .text:1000105B test eax, eax .text:1000105D mov byte ptr [esp+18h+var_4], 1 .text:10001062 jz short loc_1000106E .text:10001064 push esi .text:10001065 mov ecx, eax .text:10001067 call sub_100027F0 .text:1000106C jmp short loc_10001070 .text:1000106E ; ---------------------------------------------------------------------- ----- .text:1000106E .text:1000106E loc_1000106E: ; CODE XREF: CreateInterface+62j .text:1000106E xor eax, eax .text:10001070 .text:10001070 loc_10001070: ; CODE XREF: CreateInterface+6Cj .text:10001070 mov ecx, [esp+18h+var_C] .text:10001074 mov [esi+4], eax .text:10001077 mov dword ptr [esi+270h], 0 .text:10001081 mov eax, esi .text:10001083 pop esi .text:10001084 mov large fs:0, ecx .text:1000108B add esp, 14h .text:1000108E retn .text:1000108E CreateInterface endp Почему VC++ его так делает? ![]() |
|
Создано: 08 ноября 2006 12:40 · Поправил: s0larian · Личное сообщение · #10 эх, чёрт.... RTFM бы тебе по С++....
1) extern надо только на фунции (а не на переменных) что бы выключить name mangling (decoration) 2) ты всё время путаешь instances и pointers.... почитай как работает система типов в C/C++ 3) g_spec это instance, и в ней указатели на функции ![]() |
|
Создано: 08 ноября 2006 14:30 · Поправил: crash_rider · Личное сообщение · #11 2 s0larian Биг сенкс! ![]() извини, что тебя так достал ![]() Вот вопросик в иде смотрю call operator new(uint) .text:10015712 add esp, 4 .text:10015715 mov [ebp+var_4], eax .text:10015718 mov eax, [ebp+var_4] .text:1001571B mov dword_10033EA0, eax .text:10015720 mov ecx, dword_10033EA0 .text:10015726 mov dword ptr [ecx], offset off_1002FA30 .text:1001572C push 274h <------------------------------ а в оригинале 14h ? почему????? .text:10015731 call operator new(uint) ![]() |
|
Создано: 08 ноября 2006 17:39 · Личное сообщение · #12 |
|
Создано: 08 ноября 2006 17:44 · Личное сообщение · #13 |
|
Создано: 09 ноября 2006 09:29 · Поправил: s0larian · Личное сообщение · #14 так, хотел уже на тебя наехать по поводу ошибок, но потом просмотрел thread и понял что пару описок было в моих постах ![]() Вот правильный код:
P.S. только tabs поставь ![]() ![]() |
|
Создано: 09 ноября 2006 15:44 · Личное сообщение · #15 |
|
Создано: 09 ноября 2006 16:21 · Личное сообщение · #16 |
|
Создано: 09 ноября 2006 19:12 · Личное сообщение · #17 |
|
Создано: 12 ноября 2006 15:32 · Личное сообщение · #18 |
|
Создано: 15 ноября 2006 15:10 · Личное сообщение · #19 Короче трабла в этом здесь правильно возвращаеться структура BIG CreateInterface proc near ; DATA XREF: .rdata:008C4094o .text:008C1000 ; .rdata:008C40A8o ... .text:008C1000 .text:008C1000 var_14 = dword ptr -14h .text:008C1000 var_10 = dword ptr -10h .text:008C1000 var_C = dword ptr -0Ch .text:008C1000 var_4 = dword ptr -4 .text:008C1000 arg_EA = dword ptr 0EEh .text:008C1000 arg_EE = dword ptr 0F2h .text:008C1000 arg_F2 = dword ptr 0F6h .text:008C1000 arg_FA = dword ptr 0FEh .text:008C1000 arg_126 = word ptr 12Ah .text:008C1000 .text:008C1000 g_big = ecx .text:008C1000 push 274h .text:008C1005 ; ---------------------------------------------------------------------- ----- .text:008C1005 call operator new(uint) .text:008C100A ; ---------------------------------------------------------------------- ----- .text:008C100A add esp, 4 ; CODE XREF: CreateInterface+5^ .text:008C100A ; CreateInterface+A^ .text:008C100D ; ---------------------------------------------------------------------- ----- .text:008C100D test eax, eax .text:008C100F ; ---------------------------------------------------------------------- ----- .text:008C100F jz short loc_8C1018 .text:008C1011 ; ---------------------------------------------------------------------- ----- .text:008C1011 mov g_big, eax ; CODE XREF: CreateInterface+F^ .text:008C1013 ; ---------------------------------------------------------------------- ----- .text:008C1013 .text:008C1013 loc_8C1013: ; CODE XREF: CreateInterface+D^ .text:008C1013 ; CreateInterface:loc_8C1013^ ... .text:008C1013 jmp loc_8C1020 .text:008C1018 ; ---------------------------------------------------------------------- ----- и т.д. а у меня в иде полсе компиляции вот что CreateInterface proc near jmp sub_100016F0 т.е. результат в некуда... CreateInterface endp как поправить????? ![]() ![]() |
|
Создано: 15 ноября 2006 16:47 · Личное сообщение · #20 |
|
Создано: 15 ноября 2006 19:14 · Поправил: crash_rider · Личное сообщение · #21 эээ ![]() да без толку сидел час игрался результату нил! public CreateInterface CreateInterface proc near jmp _CreateInterface CreateInterface endp и что в исходнике то подругому ![]() и еще у меня cdecl получаеся везде! а в оригинале stdcall ! ставлю при компиляции stdcall, все типа сделал __stdcall,но CreateInterface тоже делает stdcall а он вроде сделан как cdecl! ![]() ![]() |
|
Создано: 16 ноября 2006 09:13 · Личное сообщение · #22 |
|
Создано: 16 ноября 2006 14:47 · Поправил: crash_rider · Личное сообщение · #23 исходник это громко сказано ![]() там пока что прототипы только ![]() ![]() там все и оригинальная длл и менеджер оригинальный для загрузки этой и еще одной(fs_fat.dll) длл принцип загрузки такойже через классы ![]() ![]() |
|
Создано: 16 ноября 2006 16:53 · Поправил: s0larian · Личное сообщение · #24 1) ставишь incremental linking = no 2) link against "multi-threaded dll" (not debug, /MD) получаешь fd_usb.dll на 7680 байт с одним экспортом - правильным. ![]() ![]() |
|
Создано: 16 ноября 2006 17:16 · Личное сообщение · #25 |
|
Создано: 16 ноября 2006 18:15 · Личное сообщение · #26 |
|
Создано: 16 ноября 2006 19:10 · Личное сообщение · #27 ///////////////////мой код \\\\\\\\\\\\\\\\\ CreateInterface proc near var_8= dword ptr -8 var_4= dword ptr -4 push ebp mov ebp, esp sub esp, 8 для чего заносяться в переменную var_8 значения из стека перед созданием класса???? в оригинале DLL этого нет.... mov [ebp+var_8], 0CCCCCCCCh mov [ebp+var_4], 0CCCCCCCCh push 274h call operator new(uint) ; class Big add esp, 4 ; Выделяем память для нового экземпляра объекта BIG и получаем указатель mov [ebp+var_4], eax ///////////////////оригинал \\\\\\\\\\\\\\\\\ CreateInterface proc near var_14= dword ptr -14h var_10= dword ptr -10h var_C= dword ptr -0Ch var_8= byte ptr -8 var_4= dword ptr -4 arg_EA= dword ptr 0EEh arg_EE= dword ptr 0F2h arg_F2= dword ptr 0F6h arg_FA= dword ptr 0FEh arg_126= word ptr 12Ah push 274h ; class Big call operator new(uint) add esp, 4 ; Выделяем память для нового экземпляра объекта BIG и получаем указатель что то я уже задрался ![]() ![]() |
|
Создано: 16 ноября 2006 22:52 · Личное сообщение · #28 crash_rider пишет: для чего заносяться в переменную var_8 значения из стека перед созданием класса???? в оригинале DLL этого нет.... mov [ebp+var_8], 0CCCCCCCCh mov [ebp+var_4], 0CCCCCCCCh CC = INT 3 Видимо "защита от переполнения буфера" или выполнения со стека ![]() Микрософтовские проги напичканы им до опупения - выравнивание на 16 байт им делается... ![]() |
|
Создано: 17 ноября 2006 10:00 · Личное сообщение · #29 |
|
Создано: 19 ноября 2006 14:45 · Личное сообщение · #30 |
|
Создано: 20 ноября 2006 22:18 · Личное сообщение · #31 НУ написал прогу грузит длл, подсовываю класс BIG во время отладки смотрю что там в класе BIG пишет Error expression cannot be evaluated ![]() что не правильно????? ![]() ![]() |
<< . 1 . 2 . 3 . >> |
![]() |
eXeL@B —› Программирование —› Снова про DLL :( |