Вторник, 16.04.2024, 15:44 Приветствую вас Гость | Группа "Гости" 
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 2
  • 1
  • 2
  • »
Модератор форума: Волк-1024  
delphicode » Delphi » Windows API в Delphi » Вызов функции по её хешу от имени (Вызов функции по её хешу от имени)
Вызов функции по её хешу от имени
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. Немного допилить и будет работать. smile


Pascal, C\C++, Assembler, Python

Сообщение отредактировал Волк-1024 - Пятница, 29.03.2013, 15:52
 
NeoДата: Пятница, 29.03.2013, 17:31 | Сообщение # 4
Модератор
Зарегистрирован: 04.05.2010
Группа: Модераторы
Сообщений: 317
Статус: Offline
Круто! smile
Только пару вопросов:
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.
Прикрепления: GEncrypt.pas (8.9 Kb)


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 ничего нет... smile


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
Доступно только для пользователей
Прикрепления: UnImportImport.pas (15.4 Kb)


Сообщение отредактировал Neo - Суббота, 30.03.2013, 10:13
 
Волк-1024Дата: Суббота, 30.03.2013, 16:26 | Сообщение # 12
Авторитетный
Зарегистрирован: 24.07.2011
Группа: Модераторы
Сообщений: 469
Статус: Offline
Цитата
Смотри внимательно на USE_PREINIT_CRC32TABLE.


Я же говорил смотри на это smile Ты упустил:
Код
{$DEFINE USE_PREINIT_CRC32TABLE}


Без этого таблицу CRC32 придется расчитывать с помощью InitCRC32Table - это очень ресурсоёмкий процесс.

-----------------------------------------------------------------------
UPD:

Код

BaseAddress:=AlignModuleBaseAddress(hModule); { Выравниваем загрузочный адрес. }
BaseAddress:=hModule;


blink Не вижу логики.


Pascal, C\C++, Assembler, Python

Сообщение отредактировал Волк-1024 - Суббота, 30.03.2013, 16:29
 
NeoДата: Суббота, 30.03.2013, 16:57 | Сообщение # 13
Модератор
Зарегистрирован: 04.05.2010
Группа: Модераторы
Сообщений: 317
Статус: Offline
Цитата (Волк-1024)
Не вижу логики.

Я тоже))))Забыл убрать просто)Хотя работает biggrin
 
Волк-1024Дата: Суббота, 30.03.2013, 17:37 | Сообщение # 14
Авторитетный
Зарегистрирован: 24.07.2011
Группа: Модераторы
Сообщений: 469
Статус: Offline
Цитата (Neo)
Забыл убрать просто


Еще забыл обьявить функции для расчета CRC32 в заголовке модуля. smile

Вот, немного подправил и подштриховал модуль. Теперь можно и динамически CRC32 высчитывать:

Доступно только для пользователей
Прикрепления: UnImportImport.rar (4.7 Kb)


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 в заголовоке модуля.

Не,я специально не стал добавлять,так как лучше отдельно расчитать хеш,ото кода много будет компилироваться.Хотя,если только что для универсальности.
А вообще,надо короче всё это дело в класс переписать,для удобства smile


Сообщение отредактировал Neo - Воскресенье, 31.03.2013, 07:15
 
Волк-1024Дата: Суббота, 30.03.2013, 18:14 | Сообщение # 16
Авторитетный
Зарегистрирован: 24.07.2011
Группа: Модераторы
Сообщений: 469
Статус: Offline
Цитата (Neo)
кода много будет компилироваться.


Неа. GetProcAddressByCRC32 использует все функции из модуля, так что без разницы smile

Цитата (Neo)
кеш

Может всё-так хеш? Второй раз уже заменяешь слово... smile

Цитата (Neo)
А вообще,надо короче всё это дело в класс переписать,для удобства


ООП - весчь не благородная... smile


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 А ещё,например, в буткитах только так и идёт вызов функций,так как больше нет никакого выхода smile


Сообщение отредактировал Neo - Понедельник, 01.04.2013, 12:09
 
xXxSh@dowxXxДата: Вторник, 02.04.2013, 19:58 | Сообщение # 20
Авторитетный
Зарегистрирован: 22.01.2012
Группа: Модераторы
Сообщений: 702
Статус: Offline
Очень познавательно, большое спасибо, буду знать wink
 
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
По всему коду символов ^ не хватает - это от ламеров защита чтоле? biggrin

Главное - не изобретать велосипед

 
Волк-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
 
delphicode » Delphi » Windows API в Delphi » Вызов функции по её хешу от имени (Вызов функции по её хешу от имени)
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

delphicode.ru © 2008 - 2024 Хостинг от uCoz