Сейчас на форуме: tyns777, zombi-vadim, zds (+4 невидимых)

 eXeL@B —› Программирование —› Получить результат выполнения функции в памяти
<< . 1 . 2 .
Посл.ответ Сообщение

Ранг: 12.0 (новичок)
Активность: 0.020
Статус: Участник

Создано: 12 июля 2015 13:43 · Поправил: Uz_
· Личное сообщение · #1

Есть значит функция(она в другом процессе, вызываю ее из его памяти):
Code:
  1. int CallFunc3(int x){
  2.          return x+3;
  3. }


Вызываю ее на Delphi вот так:
Code:
  1.  
  2. type
  3.   PFunctionData = ^TFunctionData;
  4.   TFunctionData = packed record
  5.                   int: Integer;
  6.                   end;
  7.  
  8. function CallRemoteProc3(WinName: PChar; FuncAddr: POINTER; FuncArg: PFunctionData): BOOL;
  9. var
  10. RemotePMem: POINTER;
  11. HProcess, RealWrite, MyThread, CRT : CARDINAL;
  12. v:HWnd;
  13. ProcessId: Integer;
  14. begin
  15.    v:=FindWindow(nil, WinName);
  16.    GetWindowThreadProcessId(v,@ProcessId);
  17.    HProcess := OpenProcess(PROCESS_ALL_ACCESS, FALSE, ProcessId);
  18.    if HProcess = 0 then
  19.    begin
  20.       Result := FALSE;
  21.       Exit;
  22.       end
  23.    else RemotePMem := VirtualAllocEx(HProcess, NIL, SizeOf(FuncArg^) * 2, MEM_COMMIT, PAGE_READWRITE);
  24.    if not Assigned(RemotePMem) then
  25.    begin
  26.       CloseHandle(HProcess);
  27.       Result := FALSE;
  28.       Exit;
  29.       end
  30.    else if not WriteProcessMemory(HProcess, RemotePMem, FuncArg, SizeOf(FuncArg^) * 2, RealWrite) then
  31.    begin
  32.       CloseHandle(HProcess);
  33.       Result := FALSE;
  34.       Exit;
  35.       end
  36.    else CRT := CreateRemoteThread(HProcess, NIL, 0, FuncAddr, RemotePMem, 0, MyThread);
  37.    if CRT = 0 then
  38.    begin
  39.       CloseHandle(HProcess);
  40.       Result := FALSE;
  41.       Exit;
  42.       end
  43.    else
  44.    CloseHandle(HProcess);
  45.    Result := TRUE;
  46. end;


Вопрос:как получить результат этой самой функции? т.е переданное число+3 и вывести его например через MessageBox



Ранг: 441.3 (мудрец), 297thx
Активность: 0.410.04
Статус: Участник

Создано: 13 июля 2015 15:15
· Личное сообщение · #2

моя плакать

| Сообщение посчитали полезным: ClockMan


Ранг: 568.2 (!), 465thx
Активность: 0.550.57
Статус: Участник
оптимист

Создано: 13 июля 2015 15:43
· Личное сообщение · #3

Uz_ пишет:
ShowMessage(IntToStr(Integer(code)));



Code:
  1. var
  2.   crt:cardinal;
  3.   buf:^cardinal;
  4. begin
  5.    if GetExitCodeThread(crt,cardinal(buf)) = true then
  6.      begin
  7.       ShowMessage(IntToStr(Integer(buf)));
  8.      end else
  9.    ShowMessage(IntToHex(Integer(GetLastError),$4));
  10. end;
  11.  
  12.  


-----
Чтобы правильно задать вопрос, нужно знать большую часть ответа. Р.Шекли.




Ранг: 12.0 (новичок)
Активность: 0.020
Статус: Участник

Создано: 13 июля 2015 15:59
· Личное сообщение · #4

ClockMan, дядя, может я ламер но ваш код возвращает мне те же циферки.



Ранг: 42.2 (посетитель), 42thx
Активность: 0.040
Статус: Участник

Создано: 13 июля 2015 17:11 · Поправил: kid
· Личное сообщение · #5

1637272 = 0x18FB98 , не стек ли это ?

тоесть тупо адрес вашей локальной переменной контексте



Ранг: 12.0 (новичок)
Активность: 0.020
Статус: Участник

Создано: 13 июля 2015 18:17
· Личное сообщение · #6

kid пишет:
тоесть тупо адрес вашей локальной переменной контексте

То я рандомные цифры привел, сейчас - 14155779
Вы хотите сказать это адресс(только в другой системе) куда положили то что функция возвращает?



Ранг: 33.9 (посетитель), 22thx
Активность: 0.030
Статус: Участник

Создано: 13 июля 2015 18:40
· Личное сообщение · #7

Uz_ пишет:
Вы хотите сказать это адресс(только в другой системе) куда положили то что функция возвращает?


в чем проблема? есть дебаггер, в нем посмотреть будет гораздо быстрее, чем строить догадки.



Ранг: 42.2 (посетитель), 42thx
Активность: 0.040
Статус: Участник

Создано: 13 июля 2015 19:03
· Личное сообщение · #8

Uz_ пишет:
То я рандомные цифры привел, сейчас - 14155779


14155779 = 0xD80003

Это есть ни что иное как новая страница памяти которая была выделена командой VirtualAlloc , после к ней добавили 0х3 .
Отсюда логично предположить что функция берет из стека переменную сразу , а не указатель на нее .
сделайте так :

Code:
  1. RemotePMem := Pointer(FuncArg.int);
  2. else CRT := CreateRemoteThread(HProcess, NIL, 0, FuncAddr, RemotePMem, 0, MyThread);




Ранг: 12.0 (новичок)
Активность: 0.020
Статус: Участник

Создано: 13 июля 2015 19:22
· Личное сообщение · #9

kid, тож самое.



Ранг: 42.2 (посетитель), 42thx
Активность: 0.040
Статус: Участник

Создано: 13 июля 2015 19:32
· Личное сообщение · #10

Uz_ пишет:
kid, тож самое.

а так ?

Code:
  1. function CallRemoteProc3(WinName: PChar; FuncAddr: POINTER; FuncArg: PFunctionData): BOOL;
  2. var
  3. RemotePMem: POINTER;
  4. HProcess, RealWrite, MyThread, CRT : CARDINAL;
  5. v:HWnd;
  6. ProcessId: Integer;
  7. begin
  8.    v:=FindWindow(nil, WinName);
  9.    GetWindowThreadProcessId(v,@ProcessId);
  10.    HProcess := OpenProcess(PROCESS_ALL_ACCESS, FALSE, ProcessId);
  11.    if HProcess = 0 then
  12.    begin
  13.       Result := FALSE;
  14.       Exit;
  15.    end;
  16.    RemotePMem := Pointer(FuncArg.int);
  17.    CRT := CreateRemoteThread(HProcess, NIL, 0, FuncAddr, RemotePMem, 0, MyThread);
  18.    if CRT = 0 then
  19.    begin
  20.       CloseHandle(HProcess);
  21.       Result := FALSE;
  22.       Exit;
  23.       end
  24.    else
  25.    CloseHandle(HProcess);
  26.    Result := TRUE;
  27. end;


| Сообщение посчитали полезным: Uz_

Ранг: 12.0 (новичок)
Активность: 0.020
Статус: Участник

Создано: 13 июля 2015 20:50
· Личное сообщение · #11

kid пишет:
а так ?

результат запишет куда? че-то я не пойму, в FuncArg.int?



Ранг: 42.2 (посетитель), 42thx
Активность: 0.040
Статус: Участник

Создано: 13 июля 2015 20:52
· Личное сообщение · #12

никуда. получите его через getexitcodethread



Ранг: 12.0 (новичок)
Активность: 0.020
Статус: Участник

Создано: 13 июля 2015 20:53
· Личное сообщение · #13

по идее это э аргумент который мы передаем, там же будет то что передали.

Добавлено спустя 3 минуты
kid, 259 возвращает. При любых условиях, что это - я не знаю.
Сделал так:
Code:
  1. if GetExitCodeThread(crt,cardinal(buf)) = true then
  2.      begin
  3.       ShowMessage(IntToStr(Integer(buf)));
  4.      end 





Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 13 июля 2015 22:20
· Личное сообщение · #14

#define STILL_ACTIVE 0x103
Сколько ещё страниц топика понадобится, чтобы прочитать мсдн и 1 единственную функу вызвать?

| Сообщение посчитали полезным: SReg

Ранг: 12.0 (новичок)
Активность: 0.020
Статус: Участник

Создано: 13 июля 2015 23:00
· Личное сообщение · #15

Archer, getexitcodethread ?



Ранг: 431.7 (мудрец), 390thx
Активность: 0.730.32
Статус: Участник

Создано: 13 июля 2015 23:08 · Поправил: dosprog
· Личное сообщение · #16

-----------------------------------------------
The ExitThread function ends a thread.
VOID ExitThread(
DWORD dwExitCode // exit code for this thread
);
Parameters:
dwExitCode
Specifies the exit code for the calling thread. Use the GetExitCodeThread function to retrieve a thread's exit сode.
------------------------------------------------------------
The GetExitCodeThread function retrieves the termination status of the specified thread.
BOOL GetExitCodeThread(
HANDLE hThread, // handle to the thread
LPDWORD lpExitCode // address to receive termination status
);
------------------------------------------------------------



Ветка должна завершиться так:

ExitThread( CallFunc3( 1 ) ); // например, 1, или что там другое..

Тогда:

GetExitCodeThread( hThread, &retcode );

retcode - будет равно (1+3) = 4.









ajax пишет:
phucking hosting--> Link <--







| Сообщение посчитали полезным: Uz_

Ранг: 12.0 (новичок)
Активность: 0.020
Статус: Участник

Создано: 13 июля 2015 23:19
· Личное сообщение · #17

dosprog, затестим




Ранг: 337.6 (мудрец), 224thx
Активность: 0.210.1
Статус: Участник
born to be evil

Создано: 14 июля 2015 01:02 · Поправил: ajax
· Личное сообщение · #18

phucking hosting--> Link <--

-----
От многой мудрости много скорби, и умножающий знание умножает печаль



<< . 1 . 2 .
 eXeL@B —› Программирование —› Получить результат выполнения функции в памяти
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати