Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Синтаксис
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 19.11.2016, 15:46
-=#PupaJr#=- -=#PupaJr#=- вне форума
Новичок
 
Регистрация: 17.08.2010
Сообщения: 74
Репутация: 518
По умолчанию Вызов функции из DLL по адресу

Доброго всем дня.
Банальный и старый вопрос про чужие DLL написанные "кем-то на С++".
При отладке (взломе больше тренеровка мозга конечно..) DLL нашлись кодирующие процедуры, теперь для написания кейгена хочу использовать тот же DLL, поскольку в нем большой ХЕШ от BlowFish. Все вытаскивать нет смысла - надо просто вызвать процедуру и всё... - параметры идут в стек - адрес строки и ещё пара параметров.
Знаю адрес процедуры в физической памяти от родного процесса - узнал при пошаговом трейсе в Syser. Никакой PE-explorer эти процедуры не видит.
Их адреса вычисляются в "родной" программе написанной на VВ -PCode через какую-то таблицу, но это и не важно.
Загрузив через LoadLibrary я могу получить старт адрес DLL у себя в проге, сравнить его с началом в "родной", высчитать смещение и - вызвать по адресу процедуру поместив данные в виде указателей на строки в стек.
Вот этот процесс и синтаксис меня и интересует )))
(пишу на Delphi6, про закон и пр.. говорить не надо, прога давно сломана и ей более 10 лет )
Ответить с цитированием
  #2  
Старый 20.11.2016, 12:18
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Как обычно, ничего не понятно но раз без примеров, тогда и обще-выборочный ответ - в понятии библиотек есть одна аксиома - функции и процедуры могут быть лишь локальными или экспортируемыми, универсалов нет, причём локали видны только внутри самой библиотеки и ни одна сборка не может их вызвать снаружи, потому как без объявления в "шапке" они не функции, это просто набор машкодных байтов
Цитата:
...параметры идут в стек...
Это как я понимаю, сишный прикол, поскольку в делфях параметры приципиально лежат в регистрах, со стеком идёт другая работа, поэтому, чтоб не спутать, соглашение о вызовах и предусматривает директиву stdcall для "скобяных поделок" и других языков, если они __stdcall
Цитата:
...Никакой PE-explorer эти процедуры не видит...
Dll может быть и сжатой какимнить компрессором

Цитата:
...но это и не важно...
Откуда такая уверенность, нужна таблица поскольку динамически, через loadLibrary вызывается так
Код:
...
// объявление функции и определение с типами параметров
type
  TSomefun = function(par1: integer): integer;
...
var
 i: integer;
 dllhandle: Thandle;
 abs: TSomefun;
begin

// загрузка
 dllhandle:= LoadLibrary('dll.dll');

// указатель на функцию
 @abs:= GetProcAddress(dllhandle, 'NameFun' {"родное" название});

// вызов
  i:= IntToStr(abs(5));

// выгрузка
  FreeLibrary(dllhandle);
end;
без имени и типа параметров/результата функцию видимо не вызвать никак, может и ошибаюсь
Ответить с цитированием
  #3  
Старый 20.11.2016, 13:47
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Цитата:
Dll может быть и сжатой какимнить компрессором
Скорее всего речь о том, что обсуждаемая функция - не экспортируемая, а просто кусочек кода приложения.
Цитата:
без имени и типа параметров/результата функцию видимо не вызвать никак, может и ошибаюсь
Вызвать вполне можно. Либо через ASM-вставку, либо объявить переменную типа "функция" и присвоить ей адрес не через GetProcAddress, а напрямую преобразовав адрес (число) к нужному типу.
Цитата:
параметры идут в стек
Надо еще смотреть, как происходит возврат из функции. Если функция в конце имеет команду ret N, т.е. при возврате удаляет из стека N байт (аргументы), то это соглашение вызова STDCALL. Если же в конце функции стоит просто ret, а после её вызова идет что-нибудь вроде add esp, N - то это соглашение вызова CDECL.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 20.11.2016 в 13:52.
Ответить с цитированием
  #4  
Старый 20.11.2016, 14:20
-=#PupaJr#=- -=#PupaJr#=- вне форума
Новичок
 
Регистрация: 17.08.2010
Сообщения: 74
Репутация: 518
По умолчанию

Alegun, спасибо, Вы всё правильно написали и правильно поняли,
Цитата:
это просто набор машкодных байтов
размещение которых знает "родная программа" (нууу я так думаю).
DLL не запакована, так как некоторые команды я нашёл HEX редактором и спокойно забил NOPами и получил нужный эффект.
Цитата:
через loadLibrary вызывается так
, Вы правы и GetProcAdress как раз даёт адрес процедуры - как указатель - вот тут у меня "пробел" в понимании этого процесса адресации и указателями... как мне туда подсунуть то что я вижу в отладчике(Syser) и как впихнуть в стек нужные данные. У С++ действительно всё через стек и чтобы делфийные DLL могли использовать другие приложения мы должны писать STDCALL.
Во вложении полу-патченая эта DLL. 580кб/2.8Мб
Примеры:
при перескоке из приложения в библиотеку я вижу первую строку:
1001FB88:PUSH 10
В строке статуса Syser показывает license.dll+1fb88
Вот как мне найти и правильно указать этот адрес DLL 1001FB88 в моей программе? Я понимаю что он может быть изменён поскольку моя прога меньше и стартовый адрес загрузки DLL изменится, + какие-нибуть смещения...
Вложения
Тип файла: rar license_L.rar (576.8 Кбайт, 0 просмотров)
Ответить с цитированием
  #5  
Старый 20.11.2016, 14:28
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от -=#PupaJr#=-
...У С++ действительно всё через стек и чтобы делфийные DLL могли использовать другие приложения мы должны писать STDCALL...
Это если функция в сишной библиотеке объявлена как __stdcall т.к. загрузка и прочтение в стек там перевёрнуто происходит,слева-на-право, ещё разные представления бывают, может и прямой быть типа safecall
Ответить с цитированием
  #6  
Старый 20.11.2016, 15:14
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от Bargest
...Вызвать вполне можно. Либо через ASM-вставку, либо объявить переменную типа "функция" и присвоить ей адрес не через GetProcAddress, а напрямую преобразовав адрес (число) к нужному типу...
Ну тогда это уже не делфи, а шаманство какое-то
Ответить с цитированием
  #7  
Старый 20.11.2016, 17:14
-=#PupaJr#=- -=#PupaJr#=- вне форума
Новичок
 
Регистрация: 17.08.2010
Сообщения: 74
Репутация: 518
По умолчанию

Да, возможно и "шаманство", но делфи можно использовать лишь как оболочку а писать на API .
Видимо похожая ситуация возникает...
Bargest возврат оттуда действительно ret 8.
Цитата:
Вызвать вполне можно. Либо через ASM-вставку, либо объявить переменную типа "функция" и присвоить ей адрес не через GetProcAddress, а напрямую преобразовав адрес (число) к нужному типу.
как это сделать?
И ещё - вызываемая функция как-то прописана через ключи типа
02F12583-B34E-11D6-B2C6-00C04F680C18
и в реестре есть какая-то ссылка на него - тоже есть и в самой DLL но нет никаких адресов - а просто такой номер и всё...
Ответить с цитированием
  #8  
Старый 21.11.2016, 17:48
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

А какие функции эта DLL экспортирует?
Может быть это Active-X библиотека?
Ответить с цитированием
  #9  
Старый 21.11.2016, 18:05
-=#PupaJr#=- -=#PupaJr#=- вне форума
Новичок
 
Регистрация: 17.08.2010
Сообщения: 74
Репутация: 518
По умолчанию

Вот РЕ что выдаёт - картинка во вложении
Может конечно не совсем синтаксис, а технология или ещё что...
Если смотреть потраха файла DLL то там видно остатки от Срр компилятора, в том числе имена файлов с расширением срр.
Я кажется врубился - используется COM интерфейс к обращению в фунуции. Во второй картинке видно - в РЕ в дереве ресурсов увидел TYPELIB и там пролистав текст увидел номер CLSID и надпись:
//Provides a COM interface to the Licensing of the system.

Видимо работает как с СОМ... теперь как ) или я не прав?
Изображения
Тип файла: jpg licdll.JPG (78.1 Кбайт, 5 просмотров)
Тип файла: jpg lic-dll-res.JPG (82.8 Кбайт, 4 просмотров)

Последний раз редактировалось -=#PupaJr#=-, 21.11.2016 в 18:25.
Ответить с цитированием
  #10  
Старый 22.11.2016, 09:35
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

Если перетащить эту DLL из проводника в редактор,то Дельфи покажет эту TYPELIB в виде pas файла. Этот файл нужно затем подключить к Вашему проекту,и далее будем смотреть, как с ним работать.
Ответить с цитированием
Этот пользователь сказал Спасибо icWasya за это полезное сообщение:
-=#PupaJr#=- (22.11.2016)
  #11  
Старый 22.11.2016, 16:21
-=#PupaJr#=- -=#PupaJr#=- вне форума
Новичок
 
Регистрация: 17.08.2010
Сообщения: 74
Репутация: 518
По умолчанию

icWasya СПАСИБО!! реально я об этом не знал!!! это точно развернулось невиданное окно по этой DLL!! и все функции там и CLSID высветились!!!!! Это реально сделано на COM технологии.
Теперь как с этим работать!!??? как по CLSID и имени/id функций и свойств к ним подключиться и использовать в программе???
Вот скрин.

Во вкладке Project есть пункт Import type library, подсунул эту библиотеку, чего-то компильнулось и во вкладке ActiveX появилось множество элементов, выбрав который на форму я в тексте программы получаю кучу его свойств и методов!!! Правдя попросил сохранить саму DLL - хотя я её не менял...
Дубу бытать теперь эти методы и пр... СПАСИБО!
Напишу что получилось .
Изображения
Тип файла: jpg aaa.JPG (57.5 Кбайт, 3 просмотров)

Последний раз редактировалось -=#PupaJr#=-, 22.11.2016 в 16:42.
Ответить с цитированием
  #12  
Старый 24.11.2016, 14:08
-=#PupaJr#=- -=#PupaJr#=- вне форума
Новичок
 
Регистрация: 17.08.2010
Сообщения: 74
Репутация: 518
По умолчанию

Всем спасибо.
Функции работают, все грузятся в те же адреса что и в родной программе, В отладчике так же можно всё проследить.
Топик переродился наверное в другую тему - из синтаксиса в технологию, поскольку COM и ActiveX... Если посчитают нужным то пусть перенесут админы. У меня вопросы исчерпаны по ней.
Ответить с цитированием
  #13  
Старый 29.11.2016, 14:09
-=#PupaJr#=- -=#PupaJr#=- вне форума
Новичок
 
Регистрация: 17.08.2010
Сообщения: 74
Репутация: 518
По умолчанию Отладка ActiveX DLL

После всех мытарств понял что надо бы подключить все имена функций в отладчик, загрузив простую DLL в отладчик я вижу вызываемые функции по именам, эта же ActiveX DLL не имеет таблицы экспорта - как быть? Сейчас в проект я себе гружу полученный TLB и могу вызвать все свойства и функции с процедурами из неё, но как их загрузить имена в отладчик??
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 16:11.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter