OpenProcess - проблема в правах доступа?

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Kromeshnik
Новичок
Сообщения: 18
Зарегистрирован: 27 Август 2012, 22:59

OpenProcess - проблема в правах доступа?

Сообщение Kromeshnik »

Мозг сломал, идеи закончились...помогите, плиз, разобраться...
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
LOC:PID - подставляю PID запущенного моего другого процесса - еще одна скомпиленная кларой прога (там тупо окно и кнопка выход)
в итоге - проверяю через 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
делаю все тоже самое, но на visualstudio:

Код: Выделить всё

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);
все отрабатывает норм, без всяких траблов при закрытии... грешу на экваты в ProcessHandle = OpenProcess(STANDARD_RIGHTS_ALL + SPECIFIC_RIGHTS_ALL, false, LOC:PID), пробовал уже и десятичные подставлять: 2097151 и 2035711 (полный доступ для xp) - пофиг...

вставлял GetLastError после каждой функции - ошибок нет
что заметил: на клариной проге ProcessHandle = 340, на VS - хендл 144

Короче, мысли закончились, прошу совета, в какую сторону рыть...да, еще пробовал привелегию SE_DEBUG_NAME включать - на результат не повлияло...
Kromeshnik
Новичок
Сообщения: 18
Зарегистрирован: 27 Август 2012, 22:59

OpenProcess - проблема в правах доступа?

Сообщение Kromeshnik »

вопрос снимается...колдовал, колдовал..решил уже сделать в visual studio dll с этими функциями, а из клары вызывать...и начало падать сразу после вызова функции, т.е. подключил dll, прописал функцию InjDLL, вызываю:
LOC:Long = InjDLL(GLO:PID)
message(LOC:Long)
и после мессаги получаю опять креш... в общем, все дело было в мессаге, ее убрал - все заработало как надо. Привык я к мессагам, удобно дебажить, а вон оно как получается...
вопрос закрыт
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

OpenProcess - проблема в правах доступа?

Сообщение Yufil »

Kromeshnik писал(а):вопрос снимается...колдовал, колдовал..решил уже сделать в visual studio dll с этими функциями, а из клары вызывать...и начало падать сразу после вызова функции, т.е. подключил dll, прописал функцию InjDLL, вызываю:
LOC:Long = InjDLL(GLO:PID)
message(LOC:Long)
и после мессаги получаю опять креш... в общем, все дело было в мессаге, ее убрал - все заработало как надо. Привык я к мессагам, удобно дебажить, а вон оно как получается...
вопрос закрыт
А так не сработает ?

Код: Выделить всё

UnlockThread() 
Loc:Long = ... 
LockThread() 
message(....)
Kromeshnik
Новичок
Сообщения: 18
Зарегистрирован: 27 Август 2012, 22:59

OpenProcess - проблема в правах доступа?

Сообщение Kromeshnik »

ну да, я догнал, что надо в отдельном потоке делать :)
Ответить