|
|
| Посл.отвђт | Сообщен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 гарантированно не будет грузиться по своему адресу. ага, и мы отжираем ещё один приличный кусок памяти, вместо того, что бы помапить уже существующий код на наш контекст :) |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.046 |