Акцэс вюлишэн на GetProcAddress , почему? Код (C): char CopyFileAfunc[10] = {0}; HMODULE hModule = GetModuleHandleA("kernel32.dll"); lstrcpyA(CopyFileAfunc,"CopyFileA"); _asm { xor eax,eax lea eax, [CopyFileAfunc] push eax push hModule call GetProcAddress push 0 push file2 push file1 call eax } вываливается на push 0
Код (Text): char Copyfunction[10] = "CopyFileA"; HMODULE hMod = GetModuleHandle("kernel32.dll"); __asm { push 0; mov eax, [File1]; push eax; mov eax, [File2]; push eax; lea eax, [Copyfunction]; push eax; mov eax, hModule; push eax; call GetProcAddress; call eax; }; // Через асм вставку, хочу вызвать функцию в чём же тут дело?
Чуть оптимизовал от MsRem'a юзаю в крипторе Код (Text): typedef HMODULE (WINAPI* GETMODULEHANDLE)( __in_opt LPCSTR lpModuleName ); PVOID GetProcAddressEx( IN PVOID Image, IN PCSTR lpProcName, IN GETMODULEHANDLE CsGetModuleHandle ) { PIMAGE_DOS_HEADER dHeader = (PIMAGE_DOS_HEADER) Image; PVOID Result = NULL; if (dHeader->e_magic == IMAGE_DOS_SIGNATURE) { PIMAGE_NT_HEADERS ntHeaders = (PIMAGE_NT_HEADERS) RVATOVA(Image, dHeader->e_lfanew); if (ntHeaders->Signature == IMAGE_NT_SIGNATURE) { ULONG ExpRVA = ntHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT]. VirtualAddress; ULONG ExpSize = ntHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT]. Size; if (ExpRVA && ExpRVA < ntHeaders->OptionalHeader.SizeOfImage) { PIMAGE_EXPORT_DIRECTORY Export = (PIMAGE_EXPORT_DIRECTORY) RVATOVA(Image, ExpRVA); ULONG NamesAddr = (ULONG)RVATOVA(Image, Export->AddressOfNameOrdinals); ULONG NameAddr = (ULONG)RVATOVA(Image, Export->Name); PULONG pName = (PULONG)RVATOVA(Image, Export->AddressOfNames); ULONG r; for (r = 0; r < Export->NumberOfFunctions; r++) { BOOLEAN bFindByOrdinal = ((ULONG)lpProcName == (USHORT)lpProcName); ULONG nOrdinal, dwFuncRva; if (r * 2 + NamesAddr == NameAddr) break; nOrdinal = ((PUSHORT)NamesAddr)[r]; dwFuncRva = ((PULONG)RVATOVA(Image, Export->AddressOfFunctions))[nOrdinal]; nOrdinal += (USHORT)Export->Base; if (!bFindByOrdinal && pName && r < Export->NumberOfNames) { if (!_stricmp(lpProcName,(PCHAR)RVATOVA(Image, *pName))) { if (abs((LONG)(dwFuncRva - ExpRVA)) <= ExpSize) { CHAR DllName[0x100]; PCHAR fwdName = (PCHAR) RVATOVA(Image, dwFuncRva); PCHAR fnName = strchr(fwdName, '.'); PVOID pLibrary; if (fnName) { memset(DllName, 0, sizeof(DllName)); strncpy(DllName, fwdName, fnName - fwdName); strcat(DllName, ".dll"); fnName++; pLibrary = CsGetModuleHandle(DllName); if (pLibrary) { Result = GetProcAddressEx(pLibrary, fnName, CsGetModuleHandle); } } } else Result = (PVOID) RVATOVA(Image, dwFuncRva); break; } } else if (bFindByOrdinal && (nOrdinal == (USHORT)lpProcName)) { Result = (PVOID)RVATOVA(Image, dwFuncRva); break; } pName++; } } } } return Result; }
9two, Нормально следует показать описание ошибки. Она всегда содержит код(ntstatus), адрес инструкции и адрес выборки данных. Почему вы это не показали ? Ваша загрузочная функция может падать при огромном числе событий. Для того что бы разобраться загрузчик реализует механизм логгирования, лн может быть включен для конкретного апп в ifeo. Думаю врядле это интернал проблема. У меня вызывает сомнение инструкция lea eax, [CopyFileAfunc].
Я лично дал исчерпывающую инфу ТС честно про привилегии не подумал)))) плюс pushad popad и в настройках проекта надо sdcall инлайн асм штука капризная
RET, Вы как всегда немного отрешены от реальности, показали пример кода, но зачем, если тема резолвить ошибку.
Indy_, если ошибку резолвить то есть тема Ваша она закреплена, я писал там функу даже https://wasm.in/threads/oshibki-v-polzovatelskom-rezhime.20412/
9two, на "push 0" не может вываливаться. Из исходника непонятно, что собой File1/File2 представляют. Возможно, вместо "mov eax, [File1]" надо "lea eax, [File1]" ?