Нашол пару статей на хакере, но не понятна там как то ... а инфы больше найти не смог ... может кто еще подкинет что то ... буду очень благодарен....
Найти базу kernel32 ,найти в таблице экспорта LoadLibrary и GetProcAddress.И грузить все функции динамически.
Вот, например: Code: ; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ include \masm32\include\masm32rt.inc includelib dlltute.lib ; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ comment * ----------------------------------------------------- Build this console app with "MAKEIT.BAT" on the PROJECT menu. ----------------------------------------------------- * .data pass db "password",0 my_lib db "mydll.dll",0 My_proc db "crypt",0 cmd dd 0 .code start: ; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ call main ;inkey exit ; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ main proc ; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ invoke LoadLibrary,addr my_lib; invoke GetProcAddress,eax, addr My_proc; push eax push offset test_str push offset pass call eax call FreeLibrary RET main endp end start
а на си пример не дадите ?? А то я делаю 1 только вылетает.. tLoadLibraryA pLoadLibraryA = (tLoadLibraryA)GetProcAddress(hKernel32,"LoadLibraryA"); HMODULE hUser32 = pLoadLibraryA ("user32.dll"); в этих 2 строках вылетает не знаю почему... не может загрузить pLoadLibraryA ("user32.dll")... когда делаю LoadLibraryA ("user32.dll"); все гуд.. Жду советов ..
а не судьюа в отладчике потыкать и посмотреть, что возвращает GetLastError() после Code: tLoadLibraryA pLoadLibraryA = (tLoadLibraryA)GetProcAddress(hKernel32,"LoadLibraryA"); а возвращает она ERROR_PROC_NOT_FOUND. и pLoadLibraryA указывает на нуль.
Code: .386 .model flat,stdcall option casemap:none .code FindFuncAddr: pushad mov ebx,eax mov eax,dword ptr[eax+3ch] add eax,ebx mov eax,dword ptr[eax+78h] add eax,ebx mov ecx,dword ptr[eax+14h] mov edx,dword ptr[eax+1Ch] add edx,ebx mov esi,dword ptr[eax+20h] add esi,ebx xor ebp,ebp next_func: push ecx lodsd add eax,ebx push edi xchg ecx,eax @@: test eax,eax jnz no_end_str rcl ebp,2 add ebp,edx add ebx,[ebp] xchg ebx,[esp+4*7+4*2] jmp @f no_end_str: movzx eax,byte ptr[ecx] inc ecx scasb jz @b @@: pop edi pop ecx inc ebp loop next_func popad ret start: pop eax push eax @@: dec eax xor al,al cmp word ptr[eax],"ZM" jnz @b call delta delta: pop ebx lea edi,[ebx-(offset delta-offset _LoadLibraryA)] lea esi,[ebx-(offset delta-offset FindFuncAddr)] call esi lea edx,[ebx-(offset delta-offset _user32)] push edx call eax lea edi,[ebx-(offset delta-offset offset _MessageBoxA)] call esi push 40h lea edx,[ebx-(offset delta-offset see)] push edx lea edx,[ebx-(offset delta-offset string)] push edx push 0 call eax no_find: ret _LoadLibraryA db "LoadLibraryA",0 _MessageBoxA db "MessageBoxA",0 _user32 db "user32.dll",0 string db 052h,054h,046h,04Dh,02Ch,020h,062h,06Ch,065h,061h,074h,027h,021h,0 see db 05Ah,072h,069h,020h,076h,020h,06Bh,06Fh,072h,065h,06Eh,027h,02Ch,061h,03Fh,0 end start
не, ну что за люди, в инете 100500 страниц по данной теме. 1) Работа с LoadLibrary и GetProcessAddress есть в MSDN 2) Поиск базы ядра - тоже есть на многих форумах. 3) поиск функции в экспорте тоже есть в инете причем на любых языках. Так что нехрен тупить, мучай гугл. Единственное что подскажу, так это только то, что надо искать не LoadLibraryA, а LoadLibraryExA/W потому что в Win7 (может даже уже и в Win Vista) в PEB (откуда берется адрес на базу kernel32) находится не kernel32.dll а kernelbase.dll которая является укороченным вариантом kernel32.dll и она не содержит функции LoadLibrary. А также запомни и такую вещь: Если импорт пустой, то антивири вообще обозлятся. Да и если прямое обращение к PEB то же будут возмущаться. по этому лучше GetProcessAddress и LoadLibrary оставь в импорте. и с их помощью грузи нудный тебе wininet
Ну в данном случае не нужно в шеллкод стиле писать,так что можно по большой части без асма обойтись и сделать так: Code: int noncrt_strcmpW(wchar_t *s1,wchar_t *s2) { while ( *s1 && *s2 && *s1 == *s2 ) ++s1, ++s2; return *s1 - *s2; } DWORD GetKernel32Base() { DWORD k32b=0; DWORD PEBadr=0; __asm { mov ecx,FS:[30h] mov PEBadr,ecx } PEB *peb=(PEB*)PEBadr; PEB_LDR_DATA *ldr=(PEB_LDR_DATA*)peb->LoaderData; LDR_MODULE *mod=(LDR_MODULE *)ldr->InInitializationOrderModuleList.Flink; for(;;) { if(mod->BaseDllName.Buffer==NULL){break;} if(noncrt_strcmpW(L"kernel32.dll",mod->BaseDllName.Buffer)==0 || noncrt_strcmpW(L"KERNEL32.dll",mod->BaseDllName.Buffer)==0) { k32b=(DWORD)mod->BaseAddress; } mod=(LDR_MODULE *)mod->ModuleList.Flink; } return(k32b); }