· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.RESEARCH —› Вызов API (MessageBox) по адресу

. 1 . 2 . >>

Посл.отвђт Сообщенiе


Дата: Май 8, 2004 00:50:06

.386
.model flat, stdcall
option casemap:none
.data
AppName     db 04dh,05ah,090h,0
.code
start:    
        push    40h
        push    offset AppName
        push    offset AppName
        push    0
        mov     eax, 077d5add7h 
        call    eax                 ;MessageBox
        
        push    0
        mov     eax, 077e75cb5h
        call    eax                 ;ExitProcess
end start

Подскажите, пожайлуста почему MessageBox не вызывается? Адрес вроде правильный.


Дата: Май 8, 2004 01:10:53

Да хто ж по адресу вызывает?
LoadLibrary
потом GetProcAddress
иначе никак.


Дата: Май 8, 2004 01:16:47

ExitProcess вызывается по адресу без проблем.
Значит буду делать через LoadLibrary.


Дата: Май 8, 2004 01:17:17

иначе

GetModuleHandle
потом GetProcAddress ;-)


Дата: Май 8, 2004 01:23:06 · Поправил: PavPS

Скорее всего user32.dll не проецируется на адресное пр-во по умолчанию. А вот kernel32.dll преецируется. так что getprocadres непричем. у тебя же либ некаких больше не грузится-> конфликтов с VA точно нет, relocation для user32 делать wind-а не будет, а следовательно по этому стандартному адресу и будет находится messagebox.


Дата: Май 8, 2004 01:25:46 · Поправил: Hmmr

Если подключить либы, то можно и прямо и адреса указывать :)


Дата: Май 8, 2004 01:27:59

Кстати, достаточно указать либу в "extern" вместе с ф-ей любой. И можно не юзать LoadLib...


Дата: Май 8, 2004 11:20:43

> ExitProcess вызывается по адресу без проблем

Kernel по умолчанию спроецирован в адр. пространство процесса.
Но адрес верен только для одной версии виндоса. Для другой (или SP) - будут проблемы.


> Если подключить либы, то можно и прямо и адреса указывать

См. выше.
И следом - совет rst


Дата: Май 8, 2004 11:38:54

если уж так хочется по адресам без импорта,
можно получить Kernel IB без импорта и API и адреса LoadLibrary и GetProcAddress, а дальше любой адрес получить можно..


Дата: Май 8, 2004 15:47:08

Подумай зачем придумали GetProcAddress ? Чтоб не гарантировать и не поддерживать во всех версиях ОС и патчах стические адреса функций.
Соответсвенно то, что у тебя работает сейчас - не будет с 90% вероятностью работать после установки патча или следующего сервиспака, который меняет либу.
Вот смотри RVA из разных версий XP (третья колонка).
WinXP w/o SP1
        559  22E 000205D8 LoadLibraryA
        560  22F 000205B8 LoadLibraryExA
        561  230 0002049B LoadLibraryExW
        562  231 0001296F LoadLibraryW

WinXP SP1
        571  23A 0001D961 LoadLibraryA
        572  23B 0001D941 LoadLibraryExA
        573  23C 0001D839 LoadLibraryExW
        574  23D 00013B38 LoadLibrary


И делай выводы


Дата: Май 10, 2004 15:23:53

а ты уверен , что по этому адресу рассположена именно точка входа именно это процедуры ??? а что если User32 реально загружен не по тому ImageB, который ты ожидаешь, да, тут правильнее GetProcAddress, Да, кстати, если твоя прога не юзает импорт из Kernel32, тогда её нтха просто должна послать нахх, по крайней мере у меня так и было (ругалась на инвалидность PE). а судя по адресу, который ты вызываешь, это именно НТ, поскольку в 9х эти библиотеки на ходятся в SharedMem, то есть >2 Гб/ Так что вот, скорее так оно


Дата: Май 10, 2004 17:44:10

Кстати. юзверь32 может далеко не всегда грузиться.
Я к примеру могу сделать так :
написать свою аппликуху, посмотреть preferred address у user32, сделать rebase , чтоб preferred у моей был такой же. И сделать dependencies с user32
тогда user32 гарантированно не будет грузиться по своему адресу.


Дата: Май 11, 2004 14:31:34

а нахрена весь этот геморрой то ????


Дата: Май 11, 2004 16:09:13

Чтоб доказать, что не гарантированно MessageBoxA будет по этому адресу


Дата: Май 12, 2004 16:10:24

Кстати. юзверь32 может далеко не всегда грузиться.
Я к примеру могу сделать так :
написать свою аппликуху, посмотреть preferred address у user32, сделать rebase , чтоб preferred у моей был такой же. И сделать dependencies с user32
тогда user32 гарантированно не будет грузиться по своему адресу.

ага, и мы отжираем ещё один приличный кусок памяти, вместо того, что бы помапить уже существующий код на наш контекст
:)

. 1 . 2 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.046