eXeLab
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 8 мая!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

Русский / Russian English / Английский

Сейчас на форуме: (+3 невидимых)
 · Начало · Статистика · Регистрация · Поиск · ПРАВИЛА ФОРУМА · Язык · RSS · SVN ·

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

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

Создано: 12 июля 2015 13:43 · Поправил: 12 июля 2015 13:45 Uz_ New!
Цитата · Личное сообщение · #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

Ранг: 438.2 (мудрец)
Статус: Участник

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

моя плакать

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



Ранг: 527.0 (!)
Статус: Участник
оптимист

Создано: 13 июля 2015 15:43 New!
Цитата · Личное сообщение · #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 (новичок)
Статус: Участник

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

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

Ранг: 42.2 (посетитель)
Статус: Участник

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

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

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

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

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

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

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

Ранг: 33.9 (посетитель)
Статус: Участник

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

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


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

Ранг: 42.2 (посетитель)
Статус: Участник

Создано: 13 июля 2015 19:03 New!
Цитата · Личное сообщение · #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 (новичок)
Статус: Участник

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

kid, тож самое.

Ранг: 42.2 (посетитель)
Статус: Участник

Создано: 13 июля 2015 19:32 New!
Цитата · Личное сообщение · #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 (новичок)
Статус: Участник

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

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

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

Ранг: 42.2 (посетитель)
Статус: Участник

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

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

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

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

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

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


Ранг: 1984.9 (!!!!)
Статус: Модератор
retired

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

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

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


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

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

Archer, getexitcodethread ?

Ранг: 404.8 (мудрец)
Статус: Участник

Создано: 13 июля 2015 23:08 · Поправил: 14 июля 2015 05:46 dosprog New!
Цитата · Личное сообщение · #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 (новичок)
Статус: Участник

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

dosprog, затестим


Ранг: 325.7 (мудрец)
Статус: Участник
born to be evil

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

phucking hosting--> Link <--
<< . 1 . 2 .
 eXeL@B —› Программирование —› Получить результат выполнения функции в памяти

Оригинальный DVD-ROM: eXeL@B DVD !

Вы находитесь на форуме сайта EXELAB.RU
Проект ReactOS