Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Возможен-ли полный дамп функций из DLL?

15K
07 марта 2008 года
hel
78 / / 10.11.2007
Возможно-ли получить из DLL полный дамп определённой экспортной функции, которые впоследствии можно использовать для создания более компактной DLL?

Например выдрать из php5ts.dll только 5 нужных функций и ничего лишнего, для создания удобной компактной DLL для портабельности скриптов? Всё-таки php5ts весит почти 5 мб.

Мне нужно знать, насколько это сложно и что мне для этого понадобится. Или... может существуют уже готовые дамперы функций?
261
08 марта 2008 года
ahilles
1.5K / / 03.11.2005
Цитата: hel
Возможно-ли получить из DLL полный дамп определённой экспортной функции, которые впоследствии можно использовать для создания более компактной DLL?


да всё возможно! (если захотеть..... :) )
1. загрузить DLL в свой процесс
2. Найти адрес нужной функции через GetProcAddress
3. Определить её размер (вот в этом то и основная проблема),
4. Записать в файл эту область памяти

предлагаю определять длину функции через поиск команды ret, или retn. но не факт, что будет работать, ведь может быть такой код функции

 
Код:
cmp ...
  jz .next
  ret
.next
  mov ....
  ret


Ещё одна проблема: функции могут использовать глобальные данные из искомой DLL, вот с ними как быть?
3
08 марта 2008 года
Green
4.8K / / 20.01.2000
В общем случае это сделать нельзя (очень сложно), т.к. придется делать полный анализ кода: дизассемблировать, строить граф всех вызовов и переходов, использование глобальных данных, импортируемых функций, SEH, TLS и т.д.
15K
08 марта 2008 года
hel
78 / / 10.11.2007
ahilles:
Я тоже именно так и думал. Каждую процедуру и её ответвления нужно будет загрузить в отдельный файл, а уж потом можно какой-нибудь анализатор использовать, ту же иду например.
Данные и другие куски кода можно искать с помощью адресов после опкодов push, call, mov, lea (jmp и её вариации я вроде не видел, что за пределы одной функций делается) и подобному, у них есть статичные опкоды (разные для считывания напрямую или указателю), по которым и можно сверять.
ret последние в функциях php5ts находятся перед скопом nop'ов (не менее 5). Только как проверить? Если я пытаюсь оборвать скрипт на "if(chr1==0x90) break;", то читается вообще не переставая. Не опознаёт он нопы и всё-тут...

Правильно ли я считываю байт из памяти? Или есть полегче что-то?
 
Код:
for(int c=procaddr;;c++){ // <- procaddr=(int)GetProcAddress(lib, "php_explode");
    __asm{
        pushad
        mov esi, c
        lodsb
        mov chr1, al // <- char chr1;
        popad
    }
    debug << chr1; // <- ofstream debug("debug.txt", ios::binary);
}
261
09 марта 2008 года
ahilles
1.5K / / 03.11.2005
Цитата: hel

ret последние в функциях php5ts находятся перед скопом nop'ов (не менее 5). Только как проверить?


в общем такой алгоритм: если находим последовательность

 
Код:
C3h 90h 90h 90h 90h 90h

либо вот такую последовательность
 
Код:
С2h xxh xxh 90h 90h 90h 90h 90h

(С2h xxh xxh это опкод retn)
то мы точно в конце функции. Также может быть случай что вместо 90h будут нули.
3
10 марта 2008 года
Green
4.8K / / 20.01.2000
Что-то непонятно, ты хочешь раздербанить одну единственную dll (php5ts.dll) или написать автоматический инструмент?
Если первое - дизассемблер тебе в руки и делаешь это вручную. Может быть получится.
Если второе - то ещё раз повторю: сделать это в общем случае ОЧЕНЬ СЛОЖНО даже руками, а уж тем более автоматически.

Ребята, вы пользовались дизассемблерами? Занимались реверс-инженерингом? По-моему нет. Попробуйте сделать задачу, которую вы хотите реализовать автоматически, ручками на реальном примере и посмотрите на сколько это будет нетривиально.

Цитата: hel

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


Зачем?

Цитата: hel

Данные и другие куски кода можно искать с помощью адресов после опкодов push, call, mov, lea (jmp и её вариации я вроде не видел, что за пределы одной функций делается) и подобному, у них есть статичные опкоды (разные для считывания напрямую или указателю), по которым и можно сверять.


Для начала, чтоб найти эти инструкции, тебе надо полностью дизассемблировать весь файл и проанализировать его. Допустим, что файл дизассемблировался, что тоже не всегда просто.
Как ты собираешься обрабатывать такие вещи:
call eax
call dword ptr [eax]
call dword ptr ds:[7C801254h]
jmp eax
jmp [eax]


JMP "за пределы одной функции"? Легко.
Далеко ходить не буду, открываю kernel32 в IDA, например функция CreateFileMappingW:

 
Код:
.text:7C8093CA                 cmp     [ebp+lpName], 0
.text:7C8093CE                 jz      loc_7C80B957    ; - jmp за "пределы функции"
.text:7C8093D4                 mov     eax, _gpTermsrvFormatObjectName    ; - обращение к ранее инициализированному указателю
.text:7C8093D9                 test    eax, eax
.text:7C8093DB                 jnz     loc_7C83CDDC    ; - jmp за "пределы функции"

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

Цитата: ahilles
в общем такой алгоритм: если находим последовательность
 
Код:
C3h 90h 90h 90h 90h 90h

либо вот такую последовательность
 
Код:
С2h xxh xxh 90h 90h 90h 90h 90h

(С2h xxh xxh это опкод retn)
то мы точно в конце функции. Также может быть случай что вместо 90h будут нули.


Кто тебе сказал, что у функции может быть только один ret?
Кто тебе сказал, что функция расположена линейно?
Рекомендую попользоваться IDA и посмотреть, как она анализирует код:

Код:
.text:7C80952A ; Exported entry 890. WaitForMultipleObjectsEx
.text:7C80952A
.text:7C80952A ; --------------- S U B R O U T I N E ---------------------------------------
.text:7C80952A
.text:7C80952A ; Attributes: bp-based frame
.text:7C80952A
.text:7C80952A ; DWORD __stdcall WaitForMultipleObjectsEx(DWORD nCount,const HANDLE *lpHandles,BOOL bWaitAll,DWORD dwMilliseconds,BOOL bAlertable)
.text:7C80952A                 public _WaitForMultipleObjectsEx@20
.text:7C80952A _WaitForMultipleObjectsEx@20 proc near  ; CODE XREF: WaitForMultipleObjects(x,x,x,x)+13p
.text:7C80952A
.text:7C80952A var_74          = dword ptr -74h
<skip>
.text:7C80952A ; FUNCTION CHUNK AT .text:7C8094B6 SIZE 0000005F BYTES
.text:7C80952A ; FUNCTION CHUNK AT .text:7C8095E4 SIZE 00000010 BYTES
.text:7C80952A ; FUNCTION CHUNK AT .text:7C83085B SIZE 0000004D BYTES
.text:7C80952A ; FUNCTION CHUNK AT .text:7C843BFF SIZE 00000065 BYTES
.text:7C80952A

<skip>

.text:7C8095D0                 jmp     short loc_7C80958B
.text:7C8095D0 _WaitForMultipleObjectsEx@20 endp
.text:7C8095D0
.text:7C8095D0 ; ---------------------------------------------------------------------------
.text:7C8095D2                 align 8
.text:7C8095D8 dword_7C8095D8  dd 0FFFFFFFFh, 0        ; DATA XREF: WaitForMultipleObjectsEx(x,x,x,x,x)+2o
.text:7C8095E0                 dd offset sub_7C80951A
.text:7C8095E4 ; ---------------------------------------------------------------------------
.text:7C8095E4 ; START OF FUNCTION CHUNK FOR _WaitForMultipleObjectsEx@20
.text:7C8095E4
.text:7C8095E4 loc_7C8095E4:                           ; CODE XREF: WaitForMultipleObjectsEx(x,x,x,x,x)-3Aj
.text:7C8095E4                 cmp     eax, 101h
.text:7C8095E9                 jnz     loc_7C8094F6
.text:7C8095EF                 jmp     loc_7C8094C5
.text:7C8095EF ; END OF FUNCTION CHUNK FOR _WaitForMultipleObjectsEx@20
.text:7C8095EF ; ---------------------------------------------------------------------------
.text:7C8095F4                 dd 90909090h

FUNCTION CHUNK - сообщает нам, что функция разбита на 4 куска кода.
Как видите никаким ret-ом блок кода не заканчивается.
NOP - тоже опциональны. Они служат для выравнивания, если же блок кода (CHUNK) закончится как раз на границе выравнивания, то NOP-ов не будет.

И это все ещё цветочки, т.к. есть еще TLS. Как собираетесь бороться с ним?
505
10 марта 2008 года
vAC
343 / / 28.02.2006
Green правильно поставил вопрос о том что вы собираетесь сделать: "раздербанить одну единственную dll (php5ts.dll) или написать автоматический инструмент?".

Конкретно с php не работал, но я так полагаю что исходники для него имеются и перекомпилировать с нужными функциями труда не составит.

А если вы собираетесь сделать подобного рода инструмент, то бросьте эту затею.
370
10 марта 2008 года
koval
443 / / 29.08.2005
Вставлю свою реплику - это не возможно. Пару лет назад убил кучу времени и здоровья на подобное деяние и ничего не получил.

P.S. хотя подобный инструмент мне бы понравился.
15K
11 марта 2008 года
hel
78 / / 10.11.2007
Цитата: Green
Что-то непонятно, ты хочешь раздербанить одну единственную dll (php5ts.dll) или написать автоматический инструмент?


Хотел именно php5ts разбивать причем автоматически, для попытки сделать php-компилер. (ведь BamCompiler в себе носит полную DLL, причем 4-й версии, и его автор возможно с радостью примет дампер, если нет, то хочется попробовать самому тогда написать компилер)

Цитата: Green
Ребята, вы пользовались дизассемблерами? Занимались реверс-инженерингом? По-моему нет.


В том то и дело, опыта пока у меня маловато, но ведь я бы и не постил вопрос тогда, не так-ли?

Цитата: Green
Как ты собираешься обрабатывать такие вещи:
call eax
call dword ptr [eax]
call dword ptr ds:[7C801254h]
jmp eax
jmp [eax]

статические данные?

В данном случа это указатель, который инициализируется совсем в другой функции.

В другом случае это может быть не указатель, а структура, как будете вычислять её размер?

И это все ещё цветочки, т.к. есть еще TLS. Как собираетесь бороться с ним?


Всё, убедили. Гиблое это дело, как я понял.

255
11 марта 2008 года
Dart Bobr
1.4K / / 09.04.2004
В принципе для оешения задачи можна использовать эмулятор кода + полный перебор входных параметров.. Конечно дл яобычных типов данных это может прокатить.. Но вот, если в функцию передается что-то вроде void*(да и вообще если присутствует передача параметров через указатели) - задача сильно затрудняется(а она и в таком виде уже достаточно сложная), так как в этом случае нужно еще и анализатор эмулируемого кода писать..
370
19 марта 2008 года
koval
443 / / 29.08.2005
Попался мне на глаза вот такой http://www.xakep.ru/post/42769/default.asp обзор, так что судите сами.

Скачать можно http://www10.egoshare.com/files/f373e4dfdaef2cc8b0b8dc884ce42187/52.rar?good=yes

Пароль к архиву: ruboard

P.S. так что все возможно стоит только этого захотеть.
3
19 марта 2008 года
Green
4.8K / / 20.01.2000
Цитата: koval
Попался мне на глаза вот такой http://www.xakep.ru/post/42769/default.asp обзор, так что судите сами.

Скачать можно http://www10.egoshare.com/files/f373e4dfdaef2cc8b0b8dc884ce42187/52.rar?good=yes

Пароль к архиву: ruboard

P.S. так что все возможно стоит только этого захотеть.



koval, ты сам статью прочел? От начала до конца? :)
Какое отношение она имеет к теме топика?

Тема топика содержала вопрос об автоматическом инструменте по выдергиванию функции из DLL.
Приведенная статья же описывает инструмент упрощающий реверс-инженеринг.
Я не вижу связи.
С помощью реверс-инженеринга можно понять как работает та или иная функция из DLL и на основе этой инф. создать новую DLL. Но это процесс ручной и творческий, и HexRays здесь лишь для упрощения (если поможет).

Если говорить о самом HexRays, то распознавать библиотечные куски в коде ЗНАААЧИтельно проще, чем то, что надо для выкусывания функции из DLL. Проще на столько, на сколько проще поиск слов со всеми словоформами в тексте от понимания смысла этого текста.

Что касается статьи не касательно контекста темы топика:
1) очень "научно-популярно",
2) слишком рекламно,
3) не смотря на п.2, сделаны выводы:

Цитата:

HexRays – это, безусловно, большой шаг вперед и неплохое подспорье для начинающих, но… он не стоит тех денег, которые за него просят, к тому же (это касается начинающих), однажды потратив время на изучение ассемблера, мы обретаем возможность реверсировать что угодно и в чем угодно (на худой конец с помощью утилиты DUMPBIN.EXE, входящей в состав SDK)

251
19 марта 2008 года
SkyMаn
1.7K / / 31.07.2007
У меня где-то валяется на вижуал барсике программулина, которая дампит все ф-ции любой ДЛЛки (или ОСХ). Можно даже поискать ДЛЛку по названию ф-ции на диске. Как именно осуществляется поиск - не смотрел.
Но понту-то с того - названия есть, а вот кол-во и тип параметров, а также возвращаемый тип - неизвестен. Но, помнится, методом подбора для какой-то ф-ции таки угадал и заюзал ее.
3
19 марта 2008 года
Green
4.8K / / 20.01.2000
Цитата: SkyMаn
У меня где-то валяется на вижуал барсике программулина, которая дампит все ф-ции любой ДЛЛки (или ОСХ). Можно даже поискать ДЛЛку по названию ф-ции на диске. Как именно осуществляется поиск - не смотрел.
Но понту-то с того - названия есть, а вот кол-во и тип параметров, а также возвращаемый тип - неизвестен. Но, помнится, методом подбора для какой-то ф-ции таки угадал и заюзал ее.


Что в твоем понимании "дампит"?
Выдает список экспорта? Это можно сделать за 5 минут, но ни какого отношения к обсуждаемой теме не имеет.

370
19 марта 2008 года
koval
443 / / 29.08.2005
2 Green своим постом я лишь только хотел подчеркнуть, что все возможно. Все только сводится к потраченному времени и здоровью, стоит ли он этого или нет.[COLOR=Black]
[/COLOR]
251
20 марта 2008 года
SkyMаn
1.7K / / 31.07.2007
Цитата: Green
Что в твоем понимании "дампит"?
Выдает список экспорта? Это можно сделать за 5 минут, но ни какого отношения к обсуждаемой теме не имеет.


Да, это и имел ввиду. Поскольку, к сожалению, не знаю особенностей постоение РЕ-шника, то может и сморозил глупость. Но это таки имеет отношение к теме, так как цель автора - получить список ф-ций из ДЛЛки. Вопрос "как" - это уже относится к методам решения :)

3
20 марта 2008 года
Green
4.8K / / 20.01.2000
Цитата: SkyMаn
Да, это и имел ввиду. Поскольку, к сожалению, не знаю особенностей постоение РЕ-шника, то может и сморозил глупость. Но это таки имеет отношение к теме, так как цель автора - получить список ф-ций из ДЛЛки. Вопрос "как" - это уже относится к методам решения :)


На сколько я понял, цель автора - "выдрать из php5ts.dll только 5 нужных функций и ничего лишнего, для создания удобной компактной DLL".

Т.е. ему нужны не имена этих функций, а их тела.

251
20 марта 2008 года
SkyMаn
1.7K / / 31.07.2007
Что ж, тогда сорри за оффтопик.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог