Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

изменить dll (добавить запись)

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Прочее] >> изменить dll (добавить запись)
Имя
Сообщение << Старые топики   Новые топики >>
изменить dll (добавить запись) - 2012-01-21 12:57:33.390000   
Dimarik__

Сообщений: 10
Оценки: 0
Присоединился: 2011-07-10 21:48:27.866666
Прочитал я ноябрьский выпуск хурнала "Хакер", в котором в разделе Кодинг рассказывалось о том как можно осуществить модификацию dll. Однако, автор статьи к концу начал в своем коде приводить какие-то нигде не документированные функции, например, fillIID, в msdn ничего не было по поводу этой функции и в коде, прилагаемом к журналу на диске я нашел, откуда вообще все это было взято. А сама технология как я понял довольно-таки старая и писали об этом еще в 2004 году. И на диске прилагался как раз тот старый код того автора.
(кому интересно вот сама статья из хакераhttp://zalil.ru/32543884)
Но по ней нормально получилось сделать только до момента: получение виртуального адреса (преобразованного виртуального адреса!) таблицы импорта. Это я получил на строке 262. Вопросов по этому нет.
Но далее. Необходимо осуществить запись о новой импортируемой функции из новой dll.
Я осуществил проверку, достаточно ли места в секции чтобы вставить еще 2 массива IMAGE_IMPORT_DESCRIPTOR.
Если места недостаточно то программа идет к метке об ошибке и вызвывает ExitProc.
Но тут встал вопрос. Как грамотно надо добавить данные в таблицу импорта. Я нашел статью в Интернете:
http://bugtraq.ru/library/programming/harddll.html
Посмотрел код, там оказалось очень много непонятного на данном моменте, например:

//2.1 Сохраняем строку с именем нашей DLL в старой таблице импорта //(для экономии места) memcpy(ImportTable, OUR_DLL_NAME, strlen(OUR_DLL_NAME)); LPDWORD zeroPtr; (DWORD)zeroPtr = (DWORD)ImportTable + strlen(OUR_DLL_NAME); //2.2 Сохраняем структуру IMAGE_IMPORT_BY_NAME в старой таблице импорта. / /(так же для экономии места) IMAGE_IMPORT_BY_NAME myName; myName.Hint = 0x00; myName.Name[0] = 0x00; &nbsp;WORD Hint = 0; &nbsp;char myFuncName[] = OUR_FUNC_NAME; &nbsp;hackRec patch; &nbsp;patch.ZeroDword = NULL; &nbsp;patch.IAT = ImportRVA + strlen(OUR_DLL_NAME) + sizeof(hackRec); patch.IATEnd = NULL; DWORD IIBN_Table; memcpy(zeroPtr, &amp;patch, sizeof(patch)); (DWORD)zeroPtr += sizeof(patch); memcpy(zeroPtr, &amp;Hint, sizeof(WORD)); (DWORD)zeroPtr += sizeof(WORD); memcpy(zeroPtr, myFuncName, strlen(myFuncName)+1 ); (DWORD)zeroPtr += strlen(myFuncName)+1; memcpy(zeroPtr, &amp;myName, sizeof(IMAGE_IMPORT_BY_NAME) ); особенно с этой структурой hackRec patch
а начиная с
memcpy(zeroPtr, &amp;patch, sizeof(patch)); (DWORD)zeroPtr += sizeof(patch); вообще непонятка. Как я понял, в zeroPtr находится адрес нулевых элементов в таблице импорта. Это как бы адрес последнего элемента. И если мы хотим добавить еще одну запись, то на место этого нулевого элемента надо поместить элемент с информацией и дальше опять после него ячейку запомнить структурой с нулями.
Но зачем для этого кучу левых структур создавать?
Да и к тому же, там совершенно разные поля:
typedef struct { &nbsp;DWORD ZeroDword; &nbsp;DWORD IAT; DWORD IATEnd; &nbsp;} hackRec; Немножко не похоже на состав структуры IMAGE_IMPORT_DESCRIPTOR. Как-то непонятно.
Можете на пальцах пояснить, как дальше осуществить запись в таблицу импорта по шагам?
Я уже эти мануалы по PE-формату проштудировал не один раз, так что можно ссылку на описание не кидать)))
Пописал маленькие программки из туториалов по ассемблеру на эту тему и из цикла статей "от зеленого к красному тоже".
P.S. Вот код который я настрочил, правда он недоработанный и с этой 262 строки конкретная недоделка идет.
http://zalil.ru/32543970
И еще хотел спросить. В статье, которую я в архиве выслал написано, что нужно добавить будет не только структуру IMAGE_IMPORT_DESCRIPTOR, но еще "нужно создать и заполнить массивы по адресам OriginalFirstThunk и FirstThunk". И что самое простое решение - перенести в конец какой-нибудь секции".
То есть, например, мы находимся в секции .text, нужно найти начало следующей секции и конец важных данных в .text, кстати КАК ЭТО ПРАВИЛЬНО СДЕЛАТЬ? Последней структурой в .text будет IMAGE_IMPORT_BY_NAME? и нужно посмотреть сколько после нее свободного пространства? Так? А если не хватит для добавления еще одной записи? Ведь такое же тоже может случиться? Тогда кусками в разные секции пихать что ли?
Поясните, пожалуйста, поподробней. Заранее спасибо за помощь. Подскажите кто чем может, пожалуйста.
Post #: 1
Страниц:  [1]
Все форумы >> [Прочее] >> изменить dll (добавить запись)







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.