Сейчас на форуме: _MBK_, Adler (+6 невидимых)

 eXeL@B —› Вопросы новичков —› Вызов процедуры из своей DLL в чужой программе (Delphi)
Посл.ответ Сообщение

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

Создано: 27 сентября 2011 08:22 · Поправил: Dazz
· Личное сообщение · #1

Привет.

Есть одна самописная программа(без исходников), написанная на Delphi. Назовем ее Immun.exe

Написал на Delphi простенькую MyCall.dll с процедурой testcall , в которой вызывается ShowMessage('I'm from dll!');


Нужно, чтобы по нажатию кнопки в Immun.exe, была вызвана моя процедура.

Нашел такую статью - --> Link <--

По ней, добавил в Import Table свою MyCall.dll и название процедуры testcall.

При запуске программы Immun.exe должна подхватиться моя MyCall.dll. Значит все в порядке, т.к. PeTools показывает, что Immun.exe загрузил мою dll.

А как вызвать мою процедуру? Подскажите пожалуйста. С помощью программы IDR я нашел вызов кнопки, а вот что туда написать?


Выложу пример. В архиве экзешник с одной кнопкой и dll (исходник ее ниже). Нужно по нажатию кнопки, вызвать процедуру testcall.

Code:
  1. library MyCall;
  2.  
  3. uses
  4.  
  5.    Windows, Messages, SysUtils,  Classes, Controls,Dialogs ;
  6.  
  7. {$*.res}
  8.  
  9. Procedure testcall;stdcall ;
  10.  
  11. begin
  12.   ShowMessage('I am from dll!');
  13. end;
  14.  
  15. exports  testcall;
  16.  
  17. begin
  18.  
  19. end.


deac_27.09.2011_EXELAB.rU.tgz - exelab.rar



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

Создано: 27 сентября 2011 16:49 · Поправил: Dazz
· Личное сообщение · #2

Уххх.. Весь день мучил OllyDbg - постоянно выходили эксепшены. И наконец получилось =) Я неверный адрес вызывал Вот что значит поесть жаренной картошечки

Но тут появляется другой вопрос... В моем примере, по нажатию кнопки, в label пишется "Thanks". Я поставил вместо этого, вызов на библиотеку. А нужно оставить оригинал, а после вызвать библиотеку, чтобы добавить функционал.

Мои мысли:
Нужно затереть частично оригинальную функцию и поставить в ней jmp на пустое место. В этом месте написать вызов библиотеки и jmp на оригинальную функцию.

Правильно ли я мыслю?)




Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 27 сентября 2011 16:51
· Личное сообщение · #3

Dazz да всё верно, найди в конце секции кода свободное место с нулями, туда и прыгай, выполни свой код, потом затёртые команды и вернись обратно.

-----
[nice coder and reverser]


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

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

Создано: 27 сентября 2011 17:22
· Личное сообщение · #4

Hellspawn
Спасибо!

После команды вызывавшей "Thanks" есть куча DB 00 . Можно ли их заменить?

На всякий случай. А какая секция в Delphi является секцией кода? Помню есть .code , но в моем примере(Delphi 2006) почему-то только такие секции:

.text .itext .data .bss .idata .tls .rdata .reloc .rsrc




Ранг: 164.6 (ветеран), 65thx
Активность: 0.120
Статус: Участник
Волшебник

Создано: 27 сентября 2011 17:40 · Поправил: neomant
· Личное сообщение · #5

По DB 00 - нужно рассмотривать в конкретном случае. Секция кода в Delphi 7 - CODE, в вашем случае это быстрее всего .text. Так же верным признаком секции кода является её атрибут на исполнение и EP. Так же можете глянуть соседнюю ветку.

-----
Следуй за белым кроликом


| Сообщение посчитали полезным: Dazz
 eXeL@B —› Вопросы новичков —› Вызов процедуры из своей DLL в чужой программе (Delphi)
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


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