Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.08.2011, 00:20   #1
Larboss
Недо
Участник клуба
 
Регистрация: 11.08.2011
Сообщений: 1,394
По умолчанию Вызов функций другой программы

Приветствую!
Более менее опытные программисты знают, как можно вызывать функцию из DLL, как найти адрес функции зная имя (WINAPI)...

Вопрос: зная адрес функции (функция внутренняя, программы самой, не апи) во внешней программе, а также ее параметры как в делфи произвести такой вызов? Не нашел ответа в сети.
С помощью программирования можно разбогатеть и изменить мир к лучшему (с) Бьерн Страуструп
Larboss вне форума Ответить с цитированием
Старый 11.08.2011, 00:24   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

процесс А и процесс Б существую совершенно независимо друг от друга(ну и исключения взаимодействия через АПИ)
если не сделать специальную архитектуру(например COM или чтото еще) для обмена данными, то так сделать не выйдет.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 11.08.2011, 00:36   #3
Larboss
Недо
Участник клуба
 
Регистрация: 11.08.2011
Сообщений: 1,394
По умолчанию

Может быть я не правильно выражаюсь...но мне точно известно, что в С++ используется функция CALL для этой задачи, один не очень близкий знакомый вызывает функцию из игрового приложения с соответствующими параметрами, например, очистка консоли. Находит адреса и параметры используя IDA. Я бы хотел понять как он это делает, принцип работы?
С помощью программирования можно разбогатеть и изменить мир к лучшему (с) Бьерн Страуструп
Larboss вне форума Ответить с цитированием
Старый 11.08.2011, 00:41   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

в самом С++ не существует такой функции.
она самописна, так что просите у знакомого исходники этой функции(у меня есть мысли как она работает, но разбиратся я с этим не хочу, мне компилятора своего хватает...)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 11.08.2011, 11:46   #5
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Внедрить в чужое адресное пространство библиотеку, сделать из неё call. Но это небезопасно, т.к. нет гарантии, что программа не решит в этот же момент обратиться к тем же данным, по-хорошему нужно вначале приостановить основной поток.

http://programmersforum.ru/showpost....6&postcount=18
пыщь

Последний раз редактировалось JTG; 11.08.2011 в 11:48.
JTG вне форума Ответить с цитированием
Старый 11.08.2011, 14:28   #6
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Кой-какая мат-часть:
http://www.gunsmoker.ru/2011/04/windows.html
http://www.transl-gunsmoker.ru/2009/...e-hmodule.html
http://www.delphikingdom.ru/asp/view...?catalogid=548
http://msdn.microsoft.com/en-us/libr...74(VS.85).aspx
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 11.08.2011, 22:44   #7
Larboss
Недо
Участник клуба
 
Регистрация: 11.08.2011
Сообщений: 1,394
По умолчанию

JTG, да, спасибо, это по сути то, что нужно. Однако, инъекцию получается сделать, но код DLL не исполняется. Думаю.

Не подскажите что может послужить причиной не выполнения кода внедренной DLL? Функция внедрения возвращает истину, но ничего не происходит.

Функция внедрения:
Код:
Function InjectDll(Process: dword; ModulePath: PChar): boolean;
var
  Memory:pointer;
  Code: dword;
  BytesWritten: dword;
  ThreadId: dword;
  hThread: dword;
  hKernel32: dword;
  Inject: packed record
           PushCommand:byte;
           PushArgument:DWORD;
           CallCommand:WORD;
           CallAddr:DWORD;
           PushExitThread:byte;
           ExitThreadArg:dword;
           CallExitThread:word;
           CallExitThreadAddr:DWord;
           AddrLoadLibrary:pointer;
           AddrExitThread:pointer;
           LibraryName:array[0..MAX_PATH] of char;
          end;
begin
  Result := false;
  Memory := VirtualAllocEx(Process, nil, sizeof(Inject),
                           MEM_COMMIT, PAGE_EXECUTE_READWRITE);
  if Memory = nil then Exit;

  Code := dword(Memory);
  //инициализация внедряемого кода:
  Inject.PushCommand    := $68;
  inject.PushArgument   := code + $1E;
  inject.CallCommand    := $15FF;
  inject.CallAddr       := code + $16;
  inject.PushExitThread := $68;
  inject.ExitThreadArg  := 0;
  inject.CallExitThread := $15FF;
  inject.CallExitThreadAddr := code + $1A;
  hKernel32 := GetModuleHandle('kernel32.dll');
  inject.AddrLoadLibrary := GetProcAddress(hKernel32, 'LoadLibraryA');
  inject.AddrExitThread  := GetProcAddress(hKernel32, 'ExitThread');
  lstrcpy(@inject.LibraryName, ModulePath);
  //записать машинный код по зарезервированному адресу
  WriteProcessMemory(Process, Memory, @inject, sizeof(inject), BytesWritten);
  //выполнить машинный код
  hThread := CreateRemoteThread(Process, nil, 0, Memory, nil, 0, ThreadId);
  if hThread = 0 then Exit;
  CloseHandle(hThread);
  Result := True;
end;
Код DLL:
Код:
library Caller;

uses
  SysUtils,
  Windows,
  Classes;

{$R *.res}

type TRemoteFunction = function(param1, param2: pchar): integer;

var RemoteFunction: TRemoteFunction;
    result: integer;

begin

  MessageBox(0,'Привет!!! Я Внедрилась!','',0);

  RemoteFunction := TRemoteFunction(ptr($004501A4));
  result := RemoteFunction('Oh hi! Я - чужая функция. Это - параметр 1',
                           'Это - параметр 2');
  Case result of
  ID_OK: MessageBox(0,'нажали "OK"','',0);
  ID_CANCEL: MessageBox(0,'нажали "отмена"','',0);
  else MessageBox(0,'не удалось получить результат работы функции','',0);
  end;



  end.
С помощью программирования можно разбогатеть и изменить мир к лучшему (с) Бьерн Страуструп

Последний раз редактировалось Stilet; 12.08.2011 в 20:44.
Larboss вне форума Ответить с цитированием
Старый 12.08.2011, 20:48   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
TRemoteFunction(ptr($004501A4));
Это что действительно имеет смысл???
Ты куда указываешь то адресом?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 12.08.2011, 20:49   #9
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

WriteProcessMemory - это функция

Цитата:
куда указываешь то адресом?
По барабану куда он указывает.
У него сама либа не инжектируется.

Последний раз редактировалось Stilet; 12.08.2011 в 21:34.
mss вне форума Ответить с цитированием
Старый 12.08.2011, 21:08   #10
Larboss
Недо
Участник клуба
 
Регистрация: 11.08.2011
Сообщений: 1,394
По умолчанию

Mss, возможно так. Я запускал программу в режиме отладки (IDA pro) ту, в которую делаю инжект. В логе видно, что в момент инжекта создается новый поток, но он тут же закрывается (Exit Thread).

Почему не происходит инжект? Есть предположения? Антивируса в системе нет.
С помощью программирования можно разбогатеть и изменить мир к лучшему (с) Бьерн Страуструп
Larboss вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Dll в ресурсах и вызов функций из нее Obsever0 Общие вопросы Delphi 15 15.09.2015 23:46
Вызов функций на Ассемблере в программе на С++ РагнаР Общие вопросы C/C++ 1 30.05.2011 16:15
объявление функций и вызов SnOoPKa Общие вопросы C/C++ 3 30.01.2011 01:53
Вызов другой программы Anatoly555 Помощь студентам 1 18.03.2010 08:08
Повторный вызов функций Roman Общие вопросы C/C++ 1 10.06.2009 14:48