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 включать - на результат не повлияло...
