PDA

Просмотр полной версии : [Программа] DLL + пример программы поиска сигнатуры в процессе


Tr0y
09.03.2014, 13:16
Собственно приведу пример реализации поиска по сигнатурной маске в процессе, который удовлетворяет ей. DLL можно использовать в других языка программирования и проектах, но сама DLL написана на Delphi.
[Ссылки могут видеть только зарегистрированные и активированные пользователи]

[Ссылки могут видеть только зарегистрированные и активированные пользователи]
Краткое пояснение, "что-зачем?":
Имя процесса - это название процесса цели, в которой будет осуществлен поиск (по сути это поле можно не указывать)
PiD процесса и рядом кн., берет название процесса и ищет его ProcessID, результат записывается в поле рядом
Стартовый адрес - это адрес в диапазоне от 0 до FFFFFFFF, с которого будет осуществляться поиск (если вы примерно знаете, то можно уменьшить область поиска, если не уверены то ставьте ноль)
Сигнатура - это поле, где записывается ваша маска т.н. сигнатуры, по которой будет осуществлен поиск. Маска представляет из себя массив байтовых элементов в виде HEX строки в ANSI кодировке. Неизвестные/меняющиеся байты в маске заменяются двойным знаком вопроса: "??" - любое значение. Значение каждого байта может быть от 00 до FF. Допускаются лишь значения 0..9, A..F и знак ?
Адрес сигн.: - тут записывается результат поиска, если таковой будет. Поиск останавливается при первопопавшемся совпадении по маске.


Function SigFindPattern(const inProcessID: Cardinal; const inBase:Cardinal; const inHexANSIString: AnsiString; var outAddressHEX: ANSIString): Boolean; stdcall;
{
************************************************** **************************************
SigScan 1.0
Дата релиза:
Разрядность цели процесса: х32
Описание: Данная DLL ищет в памяти процесса адресс, которые описывается по заданной
маске (сигнатуре).

SigFindPattern() - основная функция поиска сигнатуры

Параметры:
ifProcessID - PID процесса цели для проверки
inBase - базовый адресс начала сканирования, например $0F41A0FF (4 байта), т.е.
минимальное значение: $00000000, маскимальное $FFFFFFFF
inPattern - массив байт
outAddressHEX - Найденный адресс в HEX (ANSI строка)
************************************************** **************************************
}

**********************************
>>> Скачать решение <<< ([Ссылки могут видеть только зарегистрированные и активированные пользователи])
**********************************
Для гостей: filez.pro/files/vvMX81394360463.html

Удачи. /problem

Тигрь
28.05.2014, 18:05
Мало того что эту DLL нельзя использовать в других языках программирования, так ее и нельзя использовать в программах скомпилированных в версии делфи отличной от версии на которой написана эта DLL. И DLL и сама программа должны быть скомпилированы одной версией компилятора, иначе работоспособность не гарантируется и зависит только от воли случая.

Tr0y
28.05.2014, 20:56
В визуал студии не пробывал, но в XE5, скомпилированный новый EXE GUI, DLL подключается и прога от XE5 и дллкой от хе2 успешно экспортирует функции из нее (только что проверил работоспособность, скомпелировав проект EXE морды в ХЕ5 студии). Для С# я в сети видел похожий проект, т.е. если надо для сях, то можно найти альтернативные варианты.
[Ссылки могут видеть только зарегистрированные и активированные пользователи]
Тут в архиве по факту два отдельных проекта DLL и GUI оболочка(окошко), в которое подключается dll и экспортированы функции из нее, подключение длл происходит "статически".

Я на айоне пробывал, у меня находилось, функционал поиска по маске писал сам, а обращение к памяти взял из интернетов. В проге по дефолту вроде маска как раз из айона, она находит, эм уже и не помню.

PS Не юзайте дельфи ниже 2007, они уже морально и физически устарели.

Тигрь
28.05.2014, 22:18
В визуал студии не пробывал, но в XE5, скомпилированный новый EXE GUI, DLL подключается и прога от XE5 и дллкой от хе2 успешно экспортирует функции из нее (только что проверил работоспособность, скомпелировав проект EXE морды в ХЕ5 студии). Для С# я в сети видел похожий проект, т.е. если надо для сях, то можно найти альтернативные варианты.
[Ссылки могут видеть только зарегистрированные и активированные пользователи]
Тут в архиве по факту два отдельных проекта DLL и GUI оболочка(окошко), в которое подключается dll и экспортированы функции из нее, подключение длл происходит "статически".

Я на айоне пробывал, у меня находилось, функционал поиска по маске писал сам, а обращение к памяти взял из интернетов. В проге по дефолту вроде маска как раз из айона, она находит, эм уже и не помню.

PS Не юзайте дельфи ниже 2007, они уже морально и физически устарели.
Что значит для сишарпа видел похожий пример? Ты утверждаешь что эту длл можно юзать из других языков. То есть взять скомпиленную длл и юзать. А я говорю что нельзя и причины на то ясны и очевидны.
Тогда меня интересует каким образом из си или другого языка передать эти параметры const inHexANSIString: AnsiString; var outAddressHEX: ANSIString?
Да хоть статически хоть динамически.
Вот как раз таки если часть на 2007 а другая на xe2 возможно уже не будет работать.

Или ты в общем говорил что в других языках можно юзать дллки, то есть как возможность вообще их юзанья?

И еще интересно для чего в первых параметрах указано const?
const inProcessID: Cardinal; const inBase:Cardinal;

Tr0y
29.05.2014, 10:19
Что значит для сишарпа видел похожий пример? Ты утверждаешь что эту длл можно юзать из других языков. То есть взять скомпиленную длл и юзать. А я говорю что нельзя и причины на то ясны и очевидны.
Тогда меня интересует каким образом из си или другого языка передать эти параметры const inHexANSIString: AnsiString; var outAddressHEX: ANSIString?
Да хоть статически хоть динамически.
Вот как раз таки если часть на 2007 а другая на xe2 возможно уже не будет работать.

Или ты в общем говорил что в других языках можно юзать дллки, то есть как возможность вообще их юзанья?

И еще интересно для чего в первых параметрах указано const?
const inProcessID: Cardinal; const inBase:Cardinal;
1. Я специально типизировал входящие параметры в ANSI строки, чтобы корректно передвать строковые переменные, которые различны в дельфи и студии, в подробности не хочу вдаваться, но короче: string delphi != string VS, надо явно типизировать типы строк, чтобы все пучком было.
2. Выше скриншот, проект компилируется в другой студии, хотя изначально сделан в XE2. Нужна версия выше 2007, т.к. с ее версии все API вызовы по умолчанию стали использоваться в unicode, а не ansi.
3. В длл содержится функция, которая принимая параметры, осуществляет непосредственно поиск по сигнатуре. (если вам угодно, то можно обойтись и без dll, просто скопировав функцию в свой проект на дельфях с сопутствующими для нее зависимостями)
4. Входящий параметр Const обозначает, что в дальнейшем внутри функции не будет изменятся эта переменная (вообще, создается локальная копия переменной вход. параметра, являющейся константой внутри данной функции). Вообще, это не суть важно в данном примере, const можно убрать и использовать не как константу, а как переменную, если у вас планы по тому, чтобы менять ее содержимое внутри функ-ии. поиска.

Другие решения:
ByteSigScan1.0.0.5.rar ([Ссылки могут видеть только зарегистрированные и активированные пользователи]) примеры на С# и С++ (документация довольно скудная, но пример рабочий, я ее переделывал для Delphi и даже в архивных версиях эта DLLка таскается рядом :) , потом я ее удалил из проекта и заменил алгоритмом, который представлен в данной теме. тут я его просто вывел в длл, чтобы ее можно было юзать в других решениях, главное ее подключить правильно и передать корректные параметры.). В ней есть минус, что она принимает параметр смещения типа напр. "game_name.dll" + шаг смещения откуда начинать поиск, это раз. и второе, она ищет ТОЛЬКО в памяти, которая ассоциируется с смещением этой самой DLL (напр. "game_name.dll"), т.е. поиск сигнатуры будет только для таких адресов как "game.dll+????????", а вот сигнатуру внутри "engine.dll+????????" она уже не найдет.
Scan_Adress_for_Zhyk_DEMO.rar ([Ссылки могут видеть только зарегистрированные и активированные пользователи]) на С++ (отрыл где-то тут на форуме), я ее не использовал, просто для примера
2aMQGUEEdFQ

Тигрь
29.05.2014, 15:54
1. В си нет ни типа string, ни типа AnsiString и никогда эта длл не будет работать при вызове из си или другого языка. И никамим явным приведением типов ты не сделаешь из строки c++ строку делфи AnsiString, и что это еще за явное приведение типов из типа одного языка в тип другого языка, это что то новенькое. Вот именно тебе бы не мешало вдаться в подробности, что бы понимать что такое строки в разных ЯП и не писать больше такой бред.
2. А чем отличается тип AnsiString в XE5 от типа AnsiString в Delphi 2007 и от типа AnsiString в Delphi 7? И почему тогда в делфи 7 нельзя сделать так же как ты советуешь делать в с++ и других языках, выполнив неведомое явное типизирование строк?
3. Тут речь не об этом(я прекрасно вижу что в длл), а о том что ты заявляешь что эту длл можно использовать в других языках, а это не так.
4. вообще, создается локальная копия переменной вход. параметра, являющейся константой внутри данной функции)
Бред, никакая локальная копия не создается и уж тем более она не является константой в данной функции. И при желании ее спокойно можно изменить. Вот у тебя третьим параметром передается строка const inHexANSIString: AnsiString; под нее тоже будет создаваться локальная копия строки являющаяся константой внутри функции?

Зачем ты показываешь другие решения, которые ни какого отношения не имеют к твоей дллке? Я тебе пишу о том, что ты утверждаешь что ЭТУ длл можно использовать в других языках, что является не верным утверждением. Так как у тебя тип строк AnsiString, который есть только в делфи, и то в разных версиях он может иметь разную структуру.

Резюмируя, могу сказать, что тебе необходимо разобраться с различными типами данных в разных ЯП(особенно со строками) и их представлением в бинарном виде. А так же о том как писать dll которые планируется использовать в разных ЯП. И судя по всему ты не слышал что такое менеджер памяти, так что нужно восполнить брешь в знаниях и по этому вопросу.

Добавлено через 6 минут
Ну и в добавок почитать об использовании const, var и out в параметрах функций Delphi. Ведь в последнем параметре utAddressHEX вместо var нужно использовать out.

Tr0y
29.05.2014, 16:42
Можно переписать. Я не проверял в студии

В Delphi пишем, пример:

uses ActiveX;
...
function FuName(): TBSTR; stdcall;
Var sItem: WideString;
begin
sItem := 'Peter Larsson';
FuName := SysAllocStringLen(PWideChar(sItem), Length(sItem));
end;

В C#
[return: FuName(UnmanagedType.BStr)]
Поменять типы, в return сделать возврат строки, а не булевой величины и т.д. )

отсюда [Ссылки могут видеть только зарегистрированные и активированные пользователи]

Тигрь
29.05.2014, 18:02
Можно переписать. Я не проверял в студии

В Delphi пишем, пример:

uses ActiveX;
...
function FuName(): TBSTR; stdcall;
Var sItem: WideString;
begin
sItem := 'Peter Larsson';
FuName := SysAllocStringLen(PWideChar(sItem), Length(sItem));
end;

В C#
[return: FuName(UnmanagedType.BStr)]
Поменять типы, в return сделать возврат строки, а не булевой величины и т.д. )

отсюда [Ссылки могут видеть только зарегистрированные и активированные пользователи]

Сделать можно много всего, я говорю о том что сейчас эту длл нельзя использовать в других языках и сейчас у нее неправилая реализация, а ты меня не слышишь. А тащить за собой ActiveX для того что бы передать просто строку в функцию это извращение.
И вообще зачем адрес возвращать строкой, что бы потом для использования в морде опять строку переводить в int, и возвращал бы как out Address: DWORD, а уже в морде если надо их отобразить как строку то в строку и переводить.
Что касается передачи строковых параметров даю подсказку, посмотри на любую API винды в параметрах которой есть строка, и поймешь как передавать строки, это рекомендации мелкомягких. И в Delphi есть для этого соответствующий тип.

Что касается Const, он как раз и нужен для того что бы в функции не выделялась локальная копия переменной, а она передавалась по ссылке, но и компилятор не дурак у него своя оптимизация, для простых типов данные передаются не по ссылке, по этому для таких типов const вообще незачем использовать(хотя если нужно передавать всегда то используется модификатор [Ref]), а вот для строк и структурированных типов данных как раз обязательно использование Const, так как на копирование большого объема данных тратится много ресурсов. А ты говоришь совсем обратное, что используя Const в функции всегда создается локальная переменная.
Ну и остальное погуглишь почитаешь, я эти вопросы задавал не для того что бы ты мне на них ответил, а для того что бы ты ответил на них себе, я ответы знаю. Если ты пишешь читы ты должен понимать как разные типы данных выглядят в памяти в бинарном виде.

VeTaL_UA
04.06.2014, 01:09
Всем PChar короч :D

Tr0y
04.06.2014, 13:05
Перезаливать не буду :) Код рабочий, остальное - нюансы. нехочу оправдываться, но написал я его утром и в короткий срок, вылизыванием кода не занимался и упор сделал на простоту. Хотя да, ошибки есть, куда без них.

Тигрь
05.06.2014, 07:57
Перезаливать не буду :) Код рабочий, остальное - нюансы. нехочу оправдываться, но написал я его утром и в короткий срок, вылизыванием кода не занимался и упор сделал на простоту. Хотя да, ошибки есть, куда без них.

Если уберешь из первого поста это
DLL можно использовать в других языка программирования и проектах, но сама DLL написана на Delphi
то да код рабочий, а с этим утверждением код частично рабочий, при условии что длл будет использоваться только в делфи.

vonCynic
05.06.2014, 09:01
Дык, ТС - в чём проблема то? AnsiString на PAnsiChar - и уже можно будет и из Сишечки попробовать, и из чего хочешь. Я таким макаром связывал либу на XE3 с Lazarus + FPC 2.6.0. Поскольку в XE => XE5 юникод отличается от лазаревого по дефолту.

Тигрь
05.06.2014, 16:16
Дык, ТС - в чём проблема то? AnsiString на PAnsiChar - и уже можно будет и из Сишечки попробовать, и из чего хочешь. Я таким макаром связывал либу на XE3 с Lazarus + FPC 2.6.0. Поскольку в XE => XE5 юникод отличается от лазаревого по дефолту.

Он об этом не знал когда писал прогу.

VeTaL_UA
05.06.2014, 19:16
AnsiString на PAnsiChar - и уже можно будет и из Сишечки попробовать, и из чего хочешь.
Всем PChar короч
:)(

vonCynic
05.06.2014, 21:52
:)(


Так PChar даст нам такой указатель, что в Ansi C ты его реализовывать заманаешься. Тогда уж PWideChar, если уж совсем юникод нужен. Но утверждение справедливо лишь для юникодной версии Delphi:)

VeTaL_UA
05.06.2014, 23:01
Но утверждение справедливо лишь для юникодной версии Delphi
Вот-вот. Дллки я пишу, преимущественно, в седьмой версии среды. Имхо, так удобнее.

NebesaBag
06.06.2014, 00:07
Простите невежду за вопрос, но какие приемущества дают DLL ?)

Тигрь
06.06.2014, 04:10
Простите невежду за вопрос, но какие приемущества дают DLL ?)

Никаких, можешь зайти в папку /windows/system32 и удалить там все dll'ки

Добавлено через 17 минут
Так PChar даст нам такой указатель, что в Ansi C ты его реализовывать заманаешься. Тогда уж PWideChar, если уж совсем юникод нужен. Но утверждение справедливо лишь для юникодной версии Delphi:)

В юникодовой версии PChar это и есть PWideChar. Может быть ты хотел сказать PAnsiChar? Ну и указатель он и в африке указатель что для PWideChar, что для PAnsiChar.

NebesaBag
06.06.2014, 14:47
Никаких, можешь зайти в папку /windows/system32 и удалить там все dll'ки


Извините, но мой вопрос был задан не как пользователя, а как программиста.
Какие приемущества даёт написание собственных DLL для своих программ.
Надеюсь на спокойный ответ, по скольку я ещё познаю программирование и этот вопрос мне интересен.

VeTaL_UA
06.06.2014, 20:17
Какие приемущества даёт написание собственных DLL для своих программ.
Советую прочесть несколько учебных материалов в интернете. По сути, dll содержит тот же код, что и exe, только она не запускается сама, её надо программой подгрузить и вызвать из неё функции.