Сейчас на форуме: 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




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

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

GetExitCodeThread ?



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

Создано: 12 июля 2015 16:05
· Личное сообщение · #3

Archerща попробуем

Добавлено спустя 6 минут
Archer пишет:
GetExitCodeThread ?


Дак а че с ним делать? Попробовал так - выдает совсем не то, как и предполагалось. Как пользоватся то?

Code:
  1.    GetExitCodeThread(CRT, code);
  2.    ShowMessage(IntToStr(Integer(code)));




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

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

у GetExitCodeThread второй параметр указатель на переменную



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

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

dant3 пишет:
у GetExitCodeThread второй параметр указатель на переменную

Ага, получается через ReadProcessMemory мы можешь прочитать результат, верно?



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

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

на сях получается так:
Code:
  1. GetExitCodeThread(CRT, &code);

как на делфе не знаю

можно через ReadProcessMemory, если кладется в статическую переменную, со стеком проблематично будет



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

Создано: 12 июля 2015 17:48
· Личное сообщение · #7

Вот так не вышло, выводит 0
Code:
  1. var code : cardinal;
  2.  
  3.    GetExitCodeThread(CRT, code);
  4.    ReadProcessMemory(hProcess, Pointer(code), @res, sizeof(res), bytes);
  5.    fResult:=Integer(res);
  6.    ShowMessage(IntToStr(fResult));




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

Создано: 12 июля 2015 17:51
· Личное сообщение · #8

второй параметр у GetExitCodeThread указатель и в делфе(судя по вашему коду) должно быть записано как:
Code:
  1. GetExitCodeThread(CRT, @code);




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

Создано: 12 июля 2015 17:54
· Личное сообщение · #9

dant3 пишет:
второй параметр у GetExitCodeThread указатель и в делфе(судя по вашему коду) должно быть записано как:


Выдает ошибку:
Code:
  1. [Error] Unit1.pas(155): Types of actual and formal var parameters must be identical


А переменная типа cardinal разве и не служит указателем?

Добавлено спустя 2 минуты
или ты имеешь ввиду что code должен быть такой-же как и возвращаемый функцией тип - т.е. int?



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

Создано: 12 июля 2015 18:00
· Личное сообщение · #10

Code:
  1. http://articles.org.ru/delphispr/Cardinal.php

значит так:
Code:
  1. GetExitCodeThread(CRT, Pointer(code));




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

Создано: 12 июля 2015 18:02
· Личное сообщение · #11

dant3 пишет:
значит так:
Code:
GetExitCodeThread(CRT, Pointer(code));

Та же ошибка



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

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

кстати, косяк еще может быть из-за того, что тред, во время вызова GetExitCodeThread еще не завершился.
Code:
  1. WaitForSingleObject(CRT, INFINITE);
  2. GetExitCodeThread(CRT, code);




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

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

dant3 пишет:
кстати, косяк еще может быть из-за того, что тред, во время вызова GetExitCodeThread еще не завершился.

А эта GetExitCodeThread в переменную code записывает указатель на информацию о завершении функции в памяти или что?

Добавлено спустя 1 минуту
Я просто прочитал что она передает статус завершения



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

Создано: 12 июля 2015 18:26
· Личное сообщение · #14

еще неплохо мсдн читать)
тред нужно создавать с THREAD_QUERY_INFORMATION



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

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

dant3 пишет:
тред нужно создавать с THREAD_QUERY_INFORMATION

Именно тред создать? А функция разве принимает параметр такой? Может процесс открыть с таким флагом, но если что - процесс со всеми правами открыт.

Добавлено спустя 5 минут
По стандарту же тред со всеми правами создается если NIL передать



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

Создано: 12 июля 2015 18:51
· Личное сообщение · #16

с WaitForSingleObject возвращает правильное значение?



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

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

dant3 пишет:
с WaitForSingleObject возвращает правильное значение?

Возвращает 0.

Добавлено спустя 1 минуту
А не, возвращает огромную цифру

Добавлено спустя 2 минуты
Если делаю так - возвращает не 0, но и не то что нужно, я передал 21 - должно вернуть 24.
Code:
  1.    WaitForSingleObject(CRT, INFINITE);
  2.    GetExitCodeThread(CRT, code);
  3.    ReadProcessMemory(HProcess, Pointer(code), @res, SizeOf(res), bytes);
  4.    fResult:=Integer(res);
  5.    ShowMessage(IntToStr(fResult));




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

Создано: 12 июля 2015 21:16
· Личное сообщение · #18

Uz_, не надо делать
ReadProcessMemory(HProcess, Pointer(code), @res, SizeOf(res), bytes);

GetExitCodeThread должна записать во второй параметр результат выполнившейся на том конце функции, ничего больше чиать не нужно будет.

И в этой строке, кажется что-то не то, указатели в паскале как-то иначе обознааются. (то есть code - тип число, а передается в функцию указатель на неё)
GetExitCodeThread(CRT, code);



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

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

srm60171 пишет:
GetExitCodeThread(CRT, code);


Если в прототипе функции code помечен как VAR в стек упадет указатель .

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

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

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

дак ребят, окей, вот так:
Code:
  1.    GetExitCodeThread(CRT, code);
  2.    ShowMessage(IntToStr(Integer(code)));


я получаю совершенно левое число, в чем причина? что я не так делаю?

Добавлено спустя 1 минуту
srm60171, неа, другое число совсем дает мне этот code.



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

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

code^

не ?



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

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

tihiy_grom пишет:

code^

не ?

Не, [Error]Pointer type required



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

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

Uz_ пишет:
srm60171, неа, другое число совсем дает мне этот code.


уверены что соглашение вызова у функи stdcall ? тоесть функа имеет вид аля :
Code:
  1. mov EAX,[ESP+4]
  2. add eax,3
  3. retn


или же соглашение fastcall ?
тогда вид
Code:
  1. add EAX,3
  2. retn





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

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

Uz_ пишет:
var code : cardinal;

ёпт
var code :pdword ;
и потом
tihiy_grom пишет:
code^


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




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

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

kid пишет:

уверены что соглашение вызова у функи stdcall ? тоесть функа имеет вид аля :
Code:
mov EAX,[ESP+4]
add eax,3
retn


или же соглашение fastcall ?
тогда вид
Code:
add EAX,3
retn

Вот:
Code:
  1. callTest.CallFunc3 - 55                    - push ebp
  2. callTest.CallFunc3+1- 8B EC                 - mov ebp,esp
  3. callTest.CallFunc3+3- 81 EC C0000000        - sub esp,000000C0
  4. callTest.CallFunc3+9- 53                    - push ebx
  5. callTest.CallFunc3+A- 56                    - push esi
  6. callTest.CallFunc3+B- 57                    - push edi
  7. callTest.CallFunc3+C- 8D BD 40FFFFFF        - lea edi,[ebp-000000C0]
  8. callTest.CallFunc3+12- B9 30000000           - mov ecx,00000030
  9. callTest.CallFunc3+17- B8 CCCCCCCC           - mov eax,CCCCCCCC
  10. callTest.CallFunc3+1C- F3 AB                 - repe stosd 
  11. callTest.CallFunc3+1E- 8B 45 08              - mov eax,[ebp+08]
  12. callTest.CallFunc3+21- 83 C0 03              - add eax,03
  13. callTest.CallFunc3+24- 5F                    - pop edi
  14. callTest.CallFunc3+25- 5E                    - pop esi
  15. callTest.CallFunc3+26- 5B                    - pop ebx
  16. callTest.CallFunc3+27- 8B E5                 - mov esp,ebp
  17. callTest.CallFunc3+29- 5D                    - pop ebp
  18. callTest.CallFunc3+2A- C3                    - ret 
  19.  




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

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

а какое значение возвращает сейчас ?
не равно ли оно вашему указателю на память с параметрами + 3 ?




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

Создано: 13 июля 2015 02:05 · Поправил: ClockMan
· Личное сообщение · #27

kid пишет:
а какое значение возвращает сейчас ?

Человек незнает что такое переменные в делфи ты почитай его ответ
Uz_ пишет:
dant3 пишет:
у GetExitCodeThread второй параметр указатель на переменную
Ага, получается через ReadProcessMemory мы можешь прочитать результат, верно?


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


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

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

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

ClockMan пишет:
Uz_ пишет:
var code : cardinal;
ёпт
var code :pdword ;
и потом
tihiy_grom пишет:
code^


что потом code^ - куда мне этот указатель передать?
И не надо пожалуйста сразу кричать что я не знаю что такое переменные, знаю я, знаю.
Вы понимаете, что я получаю совершенно другое число? которое является видимо указателем на переменную
типа int, а вот как этот указатель превратить в int? Так Integer(code^) типо?



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

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

у вас
var code : cardinal;

а надо
ёпт
var code :pdword ;




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

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

tihiy_grom пишет:

у вас
var code : cardinal;

а надо
ёпт
var code :pdword ;

Ну клево, делал так уже, все те же заоблачные цифры. типо 1637272. Делал вот так вот:
Code:
  1.    GetExitCodeThread(CRT, code^);
  2.    ShowMessage(IntToStr(Integer(code)));



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


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