всем привет. делаю первые шаги(..ващета еще ползаю) в изучении вирмейкинга. написал тут койкак код, который получает адрес кернела, затем используя GetProcAddress получает адреса АПИ. пока не переставил винду все работало. щас же делаю push [adres of 'user32'], call GetModuleHandleA и на выходе в EAX лежит НОЛЬ. опытным путем(при непосредственном участии OLLYDBG) установил, что он не вызывает те библы, которые не проецируются в адрессное пространство моего процесса.. но вот вопрос почему же раньше проецирывалась (user32), а теперь -нет.код я не менял!!!
зависит от билда винды, но лучше как сказал great ксли GetModuleHandle вернул 0, то вызывать LoadLibrary
IceStudent +1, я так и сказал. Вообще в чем прикол дергать GetModuleHandle если LoadLibrary сама все сделает =\
LoadLibrary по любой увеличивает счетчик ссылок. В этом и прикол дергания GetModuleHandle, но это только в том случае, когда доподлинно известно, что либа уже подгружена.
Great в вирусологии да - надо сразу LoadLibrary. А вообще - GetModuleHandle позволяет узнать, загружена ли библиотека. Мало ли для чего, но это может пригодиться. Кроме того, LoadLibrary увеличивает количество загрузок библиотеки. Для этого есть спец. счетчик. Таким образом, сколько раз ты сделал LoadLibrary, столько же раз и должен сделать FreeLibrary. Поэтому, если библиотеку надо будет потом освободить, то лучше вызвывать GetModuleHandle.
MSoft Юзерную либо освобождать вряд-ли придется. Что значит надо? Все зависит от того, что необходимо реализовать. В последнем своем вире я устанавливал перехват MessageBoxA, но при условии, что она уже загружена. Что было б, если я вызывал LoadLibrary вместо GetModuleHandle?
А не юзерную? Я ж сказал, если надо будет освободить, а библиотеки-то разные бывают - не только ж юзер32. Ну оговорился. "Надо" = "лучше" или "желательно", т.к. не все вири как у тебя и, как правило, либы нужны для использования функций, а не для их перехвата, а уж тем более MessagеBox'а. Даже если сделать поправку на перехват, то я, к примеру, в любом случае подгружаю библлиотеку и делаю перехват. Это связано с тем, что перехват надо сделать в любом случае, а библиотека может быть загружена и потом динамически. Чтобы не отлавливать такие моменты и не делать код дополнительно сложным и запутанным, я делаю перехваты сразу и на все.
а есть ли способ вызвать только ту библу, которая мне нужна в данный момент? ...а то у меня при использовании LoadLibraryA с параметром 'user32' подгружается очень много библиотек(смотрел в олли).
LoadLibraryEx( LPCTSTR lpFileName, HANDLE hFile, DWORD dwFlags) dwFlags = DONT_RESOLVE_DLL_REFERENCES If this value is used, and the executable module is a DLL, the system does not call DllMain for process and thread initialization and termination. Also, the system does not load additional executable modules that are referenced by the specified module.
хм... и в чем прикол такой загрузки? Руками обрабатывать импорты или зачем? Просто интересует, зачем такое ввели и для чего оно может быть использовано