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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.03.2009, 21:34   #1
SoundMan
Пользователь
 
Регистрация: 25.05.2008
Сообщений: 27
По умолчанию Поиск процедуры в исполняемом файле.

Уже несколько дней ломаю голову над реализацией следующего:
Допустим есть процедура

Код:
procedure MsgBox;
begin
  MessageBox(0, 'Hello world', 'ddd', mb_iconinformation + mb_ok);
end;
Мне нужно найти эту процедуру в уже скомпилированном экзешнике.
Я пробовал вставлять метки, а потом уже искать их:

Код:
procedure MsgBox;
begin
  asm
    db 'L_00_00_start'
  end;
  MessageBox(0, 'Hello world', 'ddd', mb_iconinformation + mb_ok);
  asm
    db 'L_00_00_end'
  end;
end;
Но если посмотреть на это место через 16-тиричный редактор, то там будет не то, что мне нужно:



Как я понял, здесь хранятся строки, которые я использую в программе. Но как тогда найти саму процедуру?
SoundMan вне форума Ответить с цитированием
Старый 18.03.2009, 21:49   #2
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Вы можете попробовать сначала найти строковые переменные ('Hello world', 'ddd'), вернее, их относительные адреса, по которым они расположены в скомпилированной программе, а потом, если повезет - участок программы, где извлекаются (используются) данные по этим адресам.
Думаю, так...
mihali4 вне форума Ответить с цитированием
Старый 18.03.2009, 22:45   #3
uberchel
Участник клуба
 
Аватар для uberchel
 
Регистрация: 19.01.2009
Сообщений: 1,453
По умолчанию

Если надо вызвать эту процедуру из другой программы, то пишеться так

Код:
procedure MsgBox; stdCall;
begin
  asm
    db 'L_00_00_start'
  end;
  MessageBox(0, 'Hello world', 'ddd', mb_iconinformation + mb_ok);
  asm
    db 'L_00_00_end'
  end;
end;

......
exports
MsgBox; name='MsgBox';
uberchel вне форума Ответить с цитированием
Старый 18.03.2009, 23:40   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

SoundMan, ну, мне не совсем понятно, зачем Вам таких сложным и извращённым способом искать процедуру (или любой код), но Вам надо использовать ассемблерный код в качестве метки:
например, такая процедура:
Код:
  asm
    mov ax, 05455h
    xor ax,ax
  end;
  MessageBox(0, 'Hello world', 'ddd', mb_iconinformation + mb_ok);
компилируется в такой набор байт
Код:
-.0043F154: 66B85554                     mov         ax,05455 ;"TU"
-.0043F158: 6631C0                       xor         ax,ax
-.0043F15B: 6A40                         push        040
-.0043F15D: 6870F14300                   push        00043F170  -----v (1)
-.0043F162: 6874F14300                   push        00043F174  -----v (2)
-.0043F167: 6A00                         push        000
-.0043F169: E85274FCFF                   call        MessageBoxA ;user32.dll
и если искать 66 B8 55 54 66 31 C0 то однозначно найдёте свою "метку"...

разумеется, ассемблерную вставку я написал "наобум" - можете придумать свой фирменные наборчик байт ;-)
Serge_Bliznykov вне форума Ответить с цитированием
Старый 19.03.2009, 08:41   #5
Роман Радер
Форумчанин
 
Аватар для Роман Радер
 
Регистрация: 16.12.2006
Сообщений: 859
По умолчанию

не проще сделать так как сказал uberchel, а в другой программе просто:
Код:
var p:pointer;
...
h:=LoadLibrary('yourprogram.exe');
p:=GetProcAddress(h,'MsgBox');
для нахождения просто указателя.
а если надо еще и вызвать то
Код:
var p:procedure;
...
@p:=GetProcAddress(h,'MsgBox');
p();
Роман Радер вне форума Ответить с цитированием
Старый 19.03.2009, 12:36   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Нет, Рома, не проще. Или вернее это только полдела. Это даст указатель на функу в ДЛЛке винды, а автору нужно перехватить ее вызов в самой программе.
Тут сплайсинг нужен. Об этом много писано и лучшая статья безусловно у MS-REMa.

Впрочем Серж, тож верно сказал, только я бы искал инструкцию E85274FCFF
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 19.03.2009, 14:16   #7
Роман Радер
Форумчанин
 
Аватар для Роман Радер
 
Регистрация: 16.12.2006
Сообщений: 859
По умолчанию

ну возможно..

Цитата:
Сообщение от Stilet Посмотреть сообщение
E85274FCFF
я бы так не делал. мало-ли где в программе еще вызывается MessageBoxA
Роман Радер вне форума Ответить с цитированием
Старый 19.03.2009, 14:42   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
ало-ли где в программе еще вызывается MessageBoxA
Вот это еще одна из задач, которую придется решить автору если он применит именноо эту методику
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 19.03.2009, 15:38   #9
SoundMan
Пользователь
 
Регистрация: 25.05.2008
Сообщений: 27
По умолчанию

Всем спасибо за ответы, дальше буду думать сам)
SoundMan вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск в файле Cdevelop Общие вопросы C/C++ 5 16.03.2009 19:49
Поиск в файле Zandrey Microsoft Office Excel 8 05.09.2008 12:23
поиск в файле Elm0 Паскаль, Turbo Pascal, PascalABC.NET 14 07.06.2008 22:41
Поиск в файле lin Помощь студентам 3 25.05.2007 08:40
Поиск в файле asale Microsoft Office Excel 1 15.05.2007 23:33