7sp1x86, Clarion 10.0.12211
делаю инжект своей длл-ки в чужой процесс:
Код: Выделить всё
MAP
VirtualAllocEx(LONG,LONG,LONG,LONG,LONG),LONG,PASCAL,RAW
WriteProcessMemory(LONG,LONG,LONG,LONG,*LONG),BYTE,PASCAL,RAW
CreateRemoteThread(LONG,LONG,LONG,LONG,LONG,LONG,*LONG),LONG,PASCAL,RAW
GetModuleHandle(*CString lpModuleName),LONG,pascal,raw,name('GetModuleHandleA')
OpenProcess(LONG dwDesiredAccess,BOOL bInheritHandle,LONG dwProcessId),LONG,PASCAL,RAW,NAME('OpenProcess')
END
STANDARD_RIGHTS_ALL EQUATE(001F0000h)
SPECIFIC_RIGHTS_ALL EQUATE(0000FFFFh)
pszLibFileRemote LONG,STATIC
ProcessHandle LONG,STATIC
fp LONG, STATIC
lpszProcName CSTRING(1024),STATIC
lpModuleName CSTRING(1024),STATIC
w BYTE,STATIC
LOC:Last LONG,STATIC
LOC:param2 LONG,STATIC
HandleThread LONG,STATIC
LOC:DLLName STRING(255),STATIC
LOC:PID LONG,STATIC
LOC:FileName STRING(255),STATIC
LOC:DllSize LONG,STATIC
lpModuleName = 'KERNEL32.DLL'
lpszProcName = 'LoadLibraryA'
LOC:Last = 0
LOC:param2 = 0
LOC:DllName = 'C:\1\test.dll'
LOC:DllSize = LEN(CLIP(LOC:DllName))
fp = GetProcAddress(GetModuleHandle(lpModuleName),lpszProcName)
ProcessHandle = OpenProcess(STANDARD_RIGHTS_ALL + SPECIFIC_RIGHTS_ALL, false, LOC:PID)
IF ProcessHandle
pszLibFileRemote = VirtualAllocEx(ProcessHandle, 0, LOC:DllSize, MEM_COMMIT + MEM_RESERVE, PAGE_READWRITE)
w = WriteProcessMemory(ProcessHandle,ADDRESS(pszLibFileRemote),ADDRESS(LOC:DllName),LOC:DllSize,LOC:Last)
IF w
HandleThread = CreateRemoteThread(ProcessHandle,LOC:param2,0,fp,ADDRESS(pszLibFileRemote),0,LOC:Last)
END
CloseHandle(ProcessHandle)
END
в итоге - проверяю через Process Explorer - длл внедряется, но по закрытии этой проги с внедренной длл прога падает:
Код: Выделить всё
Exception occurred at address 004D7EA7
Exception code C0000005: Access Violation
Process PID=3412 Image: C:\Users\Vitaly\Desktop\Empty.exe
Thread 1 Handle=000000B0 TID=3468
Код: Выделить всё
char str1[] = "C:\\1\\test.dll";
strncpy_s(_dll_name, str1, BUFF);
HANDLE process = OpenProcess(PROCESS_ALL_ACCESS, false, pid);
LPVOID fp = (LPVOID)GetProcAddress(GetModuleHandleA("kernel32.dll"), "LoadLibraryA");
LPVOID alloc = (LPVOID)VirtualAllocEx(process, 0, strlen(_dll_name), MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
BOOL w = WriteProcessMemory(process, (LPVOID)alloc, _dll_name, strlen(_dll_name), 0);
HANDLE thread = CreateRemoteThread(process, 0, 0, (LPTHREAD_START_ROUTINE)fp, (LPVOID)alloc, 0, 0);
CloseHandle(process);
вставлял GetLastError после каждой функции - ошибок нет
что заметил: на клариной проге ProcessHandle = 340, на VS - хендл 144
Короче, мысли закончились, прошу совета, в какую сторону рыть...да, еще пробовал привелегию SE_DEBUG_NAME включать - на результат не повлияло...