Вызов функции по её хешу от имени
| |
Neo | Дата: Пятница, 29.03.2013, 02:30 | Сообщение # 1 |
Модератор
Зарегистрирован: 04.05.2010
Группа: Модераторы
Сообщений: 317
Статус: Offline
| Всем привет! Кто знает как вызывать API функцию не по её имени,а по её кешу от имени???
Сообщение отредактировал Neo - Пятница, 29.03.2013, 02:30 |
|
| |
dolphin | Дата: Пятница, 29.03.2013, 15:00 | Сообщение # 2 |
Администратор
Сообщений: 906
Статус: Offline
| Это по CRC32?
Система: Windows 10 x64, Kali Linux Среды программирования: Delphi 7, Delphi 10.x
Я не профессионал, я всего лишь любитель Я не вредитель, я всего лишь теоретик
|
|
| |
Волк-1024 | Дата: Пятница, 29.03.2013, 15:43 | Сообщение # 3 |
Авторитетный
Зарегистрирован: 24.07.2011
Группа: Модераторы
Сообщений: 469
Статус: Offline
| Цитата (Neo) Всем привет! Кто знает как вызывать API функцию не по её имени,а по её кешу от имени???
Написать аналог GetProcAddress. Где вместо имени или ординала будет приниматься хеш имени функции.
Например, вот так:
Доступно только для пользователей
P.S. Немного допилить и будет работать.
Pascal, C\C++, Assembler, Python
Сообщение отредактировал Волк-1024 - Пятница, 29.03.2013, 15:52 |
|
| |
Neo | Дата: Пятница, 29.03.2013, 17:31 | Сообщение # 4 |
Модератор
Зарегистрирован: 04.05.2010
Группа: Модераторы
Сообщений: 317
Статус: Offline
| Круто! Только пару вопросов: 1) BaseAddress я,как понимаю,получают так: ImageNtHeader.OptionalHeader.BaseOfCode+ImageNtHeader.OptionalHeader.SectionAlignment; 2) GEncrypt = не понятная структура и где она инициализируется.
Сообщение отредактировал Neo - Пятница, 29.03.2013, 18:01 |
|
| |
Волк-1024 | Дата: Пятница, 29.03.2013, 17:55 | Сообщение # 5 |
Авторитетный
Зарегистрирован: 24.07.2011
Группа: Модераторы
Сообщений: 469
Статус: Offline
| Вот здесь есть расчет CRC32(выдрал модуль из проекта):
------------------------------------------------------------------- P.S. Смотри внимательно на USE_PREINIT_CRC32TABLE.
Pascal, C\C++, Assembler, Python
Сообщение отредактировал Волк-1024 - Пятница, 29.03.2013, 18:02 |
|
| |
Neo | Дата: Пятница, 29.03.2013, 18:18 | Сообщение # 6 |
Модератор
Зарегистрирован: 04.05.2010
Группа: Модераторы
Сообщений: 317
Статус: Offline
| Вроде бы нашёл расчёт CRC32.тут.А вот только нет ещё нескольктх нужных модулей)
|
|
| |
Волк-1024 | Дата: Пятница, 29.03.2013, 18:30 | Сообщение # 7 |
Авторитетный
Зарегистрирован: 24.07.2011
Группа: Модераторы
Сообщений: 469
Статус: Offline
| Цитата (Neo) А вот только нет ещё нескольктх нужных модулей)
Так там же в uses ничего нет...
Pascal, C\C++, Assembler, Python
|
|
| |
Neo | Дата: Пятница, 29.03.2013, 19:02 | Сообщение # 8 |
Модератор
Зарегистрирован: 04.05.2010
Группа: Модераторы
Сообщений: 317
Статус: Offline
| А в GEncrypt -то?
|
|
| |
Волк-1024 | Дата: Пятница, 29.03.2013, 19:13 | Сообщение # 9 |
Авторитетный
Зарегистрирован: 24.07.2011
Группа: Модераторы
Сообщений: 469
Статус: Offline
| Цитата (Neo) BaseAddress я,как понимаю,получают так: ImageNtHeader.OptionalHeader.BaseOfCode+ImageNtHeader.OptionalHeader.SectionAlignment;
Эммм... не совсем: Доступно только для пользователей
Цитата (Neo) 2) GEncrypt = не понятная структура и где она инициализируется.
Это юнит. С функциями для получения CRC32.
Цитата (Neo) А в GEncrypt -то?
Из юнита. Надо вырезать лишь таблицу(PreInitCRC32Table) и пару функций(InitCRC32Table, UpdateCRC32, CRC32) с константами(INIT_CRC32_VALUE, CRC32_POLYNOM). И код будет абсолютно рабочим.
Pascal, C\C++, Assembler, Python
Сообщение отредактировал Волк-1024 - Пятница, 29.03.2013, 19:41 |
|
| |
dolphin | Дата: Пятница, 29.03.2013, 21:35 | Сообщение # 10 |
Администратор
Сообщений: 906
Статус: Offline
| Ещё вариант
Доступно только для пользователей
Система: Windows 10 x64, Kali Linux Среды программирования: Delphi 7, Delphi 10.x
Я не профессионал, я всего лишь любитель Я не вредитель, я всего лишь теоретик
Сообщение отредактировал dolphin - Пятница, 29.03.2013, 21:36 |
|
| |
Neo | Дата: Суббота, 30.03.2013, 10:12 | Сообщение # 11 |
Модератор
Зарегистрирован: 04.05.2010
Группа: Модераторы
Сообщений: 317
Статус: Offline
| Доступно только для пользователей
Сообщение отредактировал Neo - Суббота, 30.03.2013, 10:13 |
|
| |
Волк-1024 | Дата: Суббота, 30.03.2013, 16:26 | Сообщение # 12 |
Авторитетный
Зарегистрирован: 24.07.2011
Группа: Модераторы
Сообщений: 469
Статус: Offline
| Цитата Смотри внимательно на USE_PREINIT_CRC32TABLE.
Я же говорил смотри на это Ты упустил: Код {$DEFINE USE_PREINIT_CRC32TABLE}
Без этого таблицу CRC32 придется расчитывать с помощью InitCRC32Table - это очень ресурсоёмкий процесс.
----------------------------------------------------------------------- UPD:
Код BaseAddress:=AlignModuleBaseAddress(hModule); { Выравниваем загрузочный адрес. } BaseAddress:=hModule;
Не вижу логики.
Pascal, C\C++, Assembler, Python
Сообщение отредактировал Волк-1024 - Суббота, 30.03.2013, 16:29 |
|
| |
Neo | Дата: Суббота, 30.03.2013, 16:57 | Сообщение # 13 |
Модератор
Зарегистрирован: 04.05.2010
Группа: Модераторы
Сообщений: 317
Статус: Offline
| Цитата (Волк-1024) Не вижу логики. Я тоже))))Забыл убрать просто)Хотя работает
|
|
| |
Волк-1024 | Дата: Суббота, 30.03.2013, 17:37 | Сообщение # 14 |
Авторитетный
Зарегистрирован: 24.07.2011
Группа: Модераторы
Сообщений: 469
Статус: Offline
| Цитата (Neo) Забыл убрать просто
Еще забыл обьявить функции для расчета CRC32 в заголовке модуля.
Вот, немного подправил и подштриховал модуль. Теперь можно и динамически CRC32 высчитывать:
Доступно только для пользователей
Pascal, C\C++, Assembler, Python
Сообщение отредактировал Волк-1024 - Суббота, 30.03.2013, 18:30 |
|
| |
Neo | Дата: Суббота, 30.03.2013, 18:05 | Сообщение # 15 |
Модератор
Зарегистрирован: 04.05.2010
Группа: Модераторы
Сообщений: 317
Статус: Offline
| Цитата (Волк-1024) Еще забыл обьявить функции для расчета CRC32 в заголовоке модуля. Не,я специально не стал добавлять,так как лучше отдельно расчитать хеш,ото кода много будет компилироваться.Хотя,если только что для универсальности. А вообще,надо короче всё это дело в класс переписать,для удобства
Сообщение отредактировал Neo - Воскресенье, 31.03.2013, 07:15 |
|
| |
Волк-1024 | Дата: Суббота, 30.03.2013, 18:14 | Сообщение # 16 |
Авторитетный
Зарегистрирован: 24.07.2011
Группа: Модераторы
Сообщений: 469
Статус: Offline
| Цитата (Neo) кода много будет компилироваться.
Неа. GetProcAddressByCRC32 использует все функции из модуля, так что без разницы
Может всё-так хеш? Второй раз уже заменяешь слово...
Цитата (Neo) А вообще,надо короче всё это дело в класс переписать,для удобства
ООП - весчь не благородная...
Pascal, C\C++, Assembler, Python
Сообщение отредактировал Волк-1024 - Суббота, 30.03.2013, 18:27 |
|
| |
Neo | Дата: Воскресенье, 31.03.2013, 07:14 | Сообщение # 17 |
Модератор
Зарегистрирован: 04.05.2010
Группа: Модераторы
Сообщений: 317
Статус: Offline
| Цитата (Волк-1024) Неа. GetProcAddressByCRC32 использует все функции из модуля, так что без разницы ты не понял,если в модуле много кода,то при его подключении весь модуль будет встраиваться в исполняемый файл,даже,если некоторые подпрограммы не вызываются.А ооп - вещь очень даже благородная,хоть и трудно понимаемая.
Сообщение отредактировал Neo - Воскресенье, 31.03.2013, 11:02 |
|
| |
xXxSh@dowxXx | Дата: Понедельник, 01.04.2013, 11:39 | Сообщение # 18 |
Авторитетный
Зарегистрирован: 22.01.2012
Группа: Модераторы
Сообщений: 702
Статус: Offline
| Neo, подскажи в чем это можно использовать, или другими словами почему именно от кеша ?
Сообщение отредактировал xXxSh@dowxXx - Понедельник, 01.04.2013, 11:40 |
|
| |
Neo | Дата: Понедельник, 01.04.2013, 12:07 | Сообщение # 19 |
Модератор
Зарегистрирован: 04.05.2010
Группа: Модераторы
Сообщений: 317
Статус: Offline
| xXxSh@dowxXx, Смотри,у нас есть два способа вызова функции из dll 1) Когда имена функций,уоторый нужно вызвать из dll вшиты в exe файл,в так называемую таблиццу импорта 2) Когда используется динамическая подгрузка dll,дабы вызвать нужную функцию.Используется LoadLibrary,потом GetProcAdress. В обоих случаях,если открыть exe файл,который вызывает одним из таких образов функцию,то можно легко узнать что делает программа.То есть для первого случая,можно будет в любой программе,исследующей Pe заголовок,например,PE-Explorer получить все импортируемые функции,что не скрытно,а значит плохо.Во втором случае,в отладчике будет видно почти то же самое.ф-ии GetProcAddress и LoadLibrary сразу всё спалят. А вот если вызвать функцию не по имени,а по хешу от её имени,то фиг кто раскусит что у тебя там в программе мутится.Например можно вызвать URLDownLoad (по-мойму так),и закачать чего-нибудь и тд. P.S прочитай статейку на хакере,будет интересно. P.P.S А ещё,например, в буткитах только так и идёт вызов функций,так как больше нет никакого выхода
Сообщение отредактировал Neo - Понедельник, 01.04.2013, 12:09 |
|
| |
xXxSh@dowxXx | Дата: Вторник, 02.04.2013, 19:58 | Сообщение # 20 |
Авторитетный
Зарегистрирован: 22.01.2012
Группа: Модераторы
Сообщений: 702
Статус: Offline
| Очень познавательно, большое спасибо, буду знать
|
|
| |
dolphin | Дата: Четверг, 04.04.2013, 03:13 | Сообщение # 21 |
Администратор
Сообщений: 906
Статус: Offline
| Цитата (Neo) 2) Когда используется динамическая подгрузка dll, дабы вызвать нужную функцию.Используется LoadLibrary,потом GetProcAdress. Кстати, в том году писал программу в которой в обще не видно даже этих вызовов. Смысл такой(ну или примерный), при запуске программа уже загрузила в себя kernel.dll, берём хендл уже загруженной kernel.dll расшифровываем из себя loadlibraryA, на чистом ассемблере, без GetProcAddress из kernel.dll вызываем loadlibraryA грузим user32.dll вызываем MassageBox ну а дальше понеслась...
Жаль исходника не осталось, потерял где то
Система: Windows 10 x64, Kali Linux Среды программирования: Delphi 7, Delphi 10.x
Я не профессионал, я всего лишь любитель Я не вредитель, я всего лишь теоретик
|
|
| |
Hargen | Дата: Понедельник, 20.05.2013, 17:47 | Сообщение # 22 |
Участник
Зарегистрирован: 08.05.2013
Группа: Пользователи
Сообщений: 66
Статус: Offline
| По всему коду символов ^ не хватает - это от ламеров защита чтоле?
Главное - не изобретать велосипед
|
|
| |
Волк-1024 | Дата: Понедельник, 20.05.2013, 18:27 | Сообщение # 23 |
Авторитетный
Зарегистрирован: 24.07.2011
Группа: Модераторы
Сообщений: 469
Статус: Offline
| Цитата (Hargen) По всему коду символов ^ не хватает В котором коде не хватает?
Цитата (Hargen) это от ламеров защита чтоле? Ламеры не поймут для чего можно такой код использовать.
Pascal, C\C++, Assembler, Python
|
|
| |
Hargen | Дата: Среда, 22.05.2013, 20:06 | Сообщение # 24 |
Участник
Зарегистрирован: 08.05.2013
Группа: Пользователи
Сообщений: 66
Статус: Offline
| Цитата (Волк-1024) В котором коде не хватает? в UnImportImport там встречаются объявления типа ExportDirectory.AddressOfNameOrdinals при учете того что ExportDirectory: PImageExportDirectory; еще пример ImageDosHeader:=PImageDosHeader(BaseAddress); if ImageDosHeader.e_magic<>IMAGE_DOS_SIGNATURE then еще NumberOfNames:=(ExportDirectory.NumberOfNames-1); при ExportDirectory: PImageExportDirectory;
Цитата (Волк-1024) Ламеры не поймут для чего можно такой код использовать. Согласен, надо было писать скрипткидди
Главное - не изобретать велосипед
|
|
| |
Волк-1024 | Дата: Среда, 22.05.2013, 22:19 | Сообщение # 25 |
Авторитетный
Зарегистрирован: 24.07.2011
Группа: Модераторы
Сообщений: 469
Статус: Offline
| Всё абсолютно компилируемо и рабочее.
Цитата (Hargen) Код NumberOfNames:=(ExportDirectory.NumberOfNames-1); при ExportDirectory: PImageExportDirectory; Тут всё верно, т.к Код ExportDirectory:=PImageExportDirectory(ExportAddress^.VirtualAddress+BaseAddress)
Pascal, C\C++, Assembler, Python
Сообщение отредактировал Волк-1024 - Среда, 22.05.2013, 22:25 |
|
| |
|