Библиотека knigago >> Компьютеры: Разработка ПО >> Крэкинг и реверсинжиниринг >> Фундаментальные основы хакерства. Искусство дизассемблирования


СЛУЧАЙНЫЙ КОММЕНТАРИЙ

# 2055, книга: Майорат
автор: Эрнст Теодор Амадей Гофман

Эрнст Гофман, немецкий писатель и художник, известен своими завораживающими, пугающими и гротескными рассказами. "Майорат" не является исключением и представляет собой захватывающее путешествие в мир ужасов и сверхъестественного. История разворачивается вокруг молодого человека по имени Виктор, который приезжает в отдаленный майорат, чтобы заявить о своем праве на наследство. Он быстро обнаруживает, что имение населено призраками и другими ужасными существами. Гофман мастерски...

СЛУЧАЙНАЯ КНИГА

Турнир. Роман Пастырь
- Турнир

Жанр: Фэнтези: прочее

Год издания: 2022

Серия: Ловец знаний

Крис Касперски - Фундаментальные основы хакерства. Искусство дизассемблирования

Фундаментальные основы хакерства. Искусство дизассемблирования
Книга - Фундаментальные основы хакерства. Искусство дизассемблирования.  Крис Касперски  - прочитать полностью в библиотеке КнигаГо
Название:
Фундаментальные основы хакерства. Искусство дизассемблирования
Крис Касперски

Жанр:

Руководства и инструкции, Современные российские издания, Литература ХXI века (эпоха Глобализации экономики), Крэкинг и реверсинжиниринг, Assembler

Изадано в серии:

Кодокопатель

Издательство:

Солон-Р

Год издания:

ISBN:

5-93455-175-2

Отзывы:

Комментировать

Рейтинг:

Поделись книгой с друзьями!

Помощь сайту: донат на оплату сервера

Краткое содержание книги "Фундаментальные основы хакерства. Искусство дизассемблирования"

Книга, которую вы сейчас держите в руках, открывает двери в удивительный мир защитных механизмов — здесь рассказывается о том, как создаются и вскрываются защиты. Она адресована всем, кто любит захватывающие дух головоломки, всем, кто проводит свободное и несвободное время за копанием в недрах программ и операционной системы. Наконец, эта книга предназначена для тех, кто по роду своей деятельности занимается (постоянно и/или эпизодически) написанием защит и хочет узнать, как грамотно и уверенно противостоять вездесущим хакерам.

Настоящий том посвящен базовым основам хакерства — технике работы с отладчиком и дизассемблером. Здесь подробно описаны приемы идентификации и реконструкции ключевых структур исходного языка — функций (в т. ч. виртуальных), локальных и глобальных переменных, ветвлений, циклов, объектов и их иерархий, математических операторов и т. д.


Читаем онлайн "Фундаментальные основы хакерства. Искусство дизассемблирования". [Страница - 45]

êîíòðîëüíîãî áóôåðà, èìååò ñìûñë ïîìåñòèòü â ïåðâûå ÷åòûðå áàéòà êëþ÷à «çàãëóøêó», îáðàùåíèå ê êîòîðîé ëèáî íå ïðîèñõîäèò âîâñå, ëèáî ñ íåé ìàíèïóëèðóåò èìèòàòîð çàùèòû, íàïðàâëÿÿ õàêåðà ïî ëîæíîìó ïóòè.
 òàêîé ñèòóàöèè âçëîìùèêó íè÷åãî íå îñòàíåòñÿ, êðîìå òîãî, êàê, çàòàðèâøèñü ïèâîì, ïëîòíî çàñåñòü çà êðîïîòëèâîå èçó÷åíèå âñåãî êîäà ïðîãðàììû, ïðÿìî èëè êîñâåííî ìàíèïóëèðóþùåãî ñ êëþ÷åâîé èíôîðìàöèåé (à ýòî
ìíîãèå ìåãàáàéòû äèçàññåìáëåðíîãî ëèñòèíãà!). Åñëè êðèòè÷åñêàÿ ÷àñòü êîäà
çàøèôðîâàíà, ïðè÷åì íè â êàêîé ìîìåíò ðàáîòû ïðîãðàììû íå ðàñøèôðîâûâàåòñÿ ïîëíîñòüþ (ïðè âûõîäå â êàæäóþ ôóíêöèþ îíà ðàñøèôðîâûâàåòñÿ, à ïðè
âûõîäå çàøèôðîâûâàåòñÿ âíîâü), õàêåð íå ñìîæåò ïîëó÷èòü ãîòîâûé ê äèçàññåìáëèðîâàíèþ äàìï è áóäåò âûíóæäåí ïðèáåãíóòü ê òðàññèðîâêå. À âîò òóò
åãî áóäåò æäàòü âòîðîé ñþðïðèç!

Ñïîñîáû çàòðóäíåíèÿ àíàëèçà ïðîãðàìì

409

Êàê ïðîòèâîñòîÿòü òðàññèðîâêå
Ïðèíöèïèàëüíàÿ âîçìîæíîñòü ñîçäàíèÿ ïîäëèííî «íåâèäèìûõ» îòëàä÷èêîâ
áîëüøåé ÷àñòüþ ïðîñòî âîçìîæíîñòüþ è îñòàåòñÿ — áîëüøèíñòâî èç íèõ ïîçâîëÿåò îáíàðóæèòü ñåáÿ äàæå íåïðèâèëåãèðîâàííîìó êîäó.
Íàèáîëüøèå íàðåêàíèÿ âûçûâàåò èñïîëüçîâàíèå îäíîáàéòîâîãî êîäà 0xCC
äëÿ ñîçäàíèÿ òî÷êè îñòàíîâà âìåñòî ïîðó÷åíèÿ òîé æå çàäà÷è ñïåöèàëüíî äëÿ
ýòîãî ïðåäíàçíà÷åííûì îòëàäî÷íûì ðåãèñòðàì. Òàê ïîñòóïàþò Soft-Ice, Turbo
Debugger, Code Viewer è îòëàä÷èê, èíòåãðèðîâàííûé â Microsoft Visual Studio.
Ïðè÷åì ïîñëåäíèé íåÿâíî èñïîëüçóåò òî÷êè îñòàíîâà ïðè ïîøàãîâîì ïðîãîíå
ïðîãðàììû, ïîìåùàÿ â íà÷àëî ñëåäóþùåé èíñòðóêöèè ýòîò ïðåñëîâóòûé áàéò
0xCC.
Òðèâèàëüíàÿ ïðîâåðêà ñîáñòâåííîé öåëîñòíîñòè ïîçâîëÿåò îáíàðóæèòü ôàêò
óñòàíîâêè òî÷åê îñòàíîâà, ñâèäåòåëüñòâóþùèé îá îòëàäêå. Íå ñòîèò èñïîëüçîâàòü
êîíñòðóêöèè íàïîäîáèå if (CalculateMyCRC()!=MyValidCRC) {printf("Hello,
Hacker!\n");return;}, èõ ñëèøêîì ëåãêî îáíàðóæèòü è íåéòðàëèçîâàòü, ïîäïðàâèâ óñëîâíûé ïåðåõîä òàê, ÷òîáû îí âñåãäà ïåðåäàâàë óïðàâëåíèå íóæíîé âåòêå
ïðîãðàììû. Ëó÷øå ðàñøèôðîâûâàòü ïîëó÷åííûì çíà÷åíèåì êîíòðîëüíîé ñóììû
êðèòè÷åñêèå äàííûå èëè íåêîòîðûé êîä.
Ïðîñòåéøàÿ çàùèòà ìîæåò âûãëÿäåòü, íàïðèìåð, òàê:
Ëèñòèíã 221

int main(int argc, char* argv[])
{
// çàøèôðîâàííàÿ ñòðîêà Hello, Free World!
char s0[]="\x0C\x21\x28\x28\x2B\x68\x64\x02\x36\
\x21\x21\x64\x13\x2B\x36\x28\x20\x65\x49\x4E";
__asm
{
BeginCode:
; //íà÷àëî êîíòðîëèðóåìîãî êîäà
pusha
; //ñîõðàíåíèå âñåõ ðåãèñòðîâ îáùåãî íàçíà÷åíèÿ
lea
ebx,s0
; // ebx=&s0[0]
GetNextChar:
; // do
XOR
eax,eax
; // eax = 0;
LEA
esi,BeginCode ; // esi = &BeginCode
LEA
ecx,EndCode
; // âû÷èñëåíèå äëèíû...
SUB
ecx,esi
; // ...êîíòðîëèðóåìîãî êîäà
HarvestCRC:
; // do
LODSB
; // çàãðóçêà î÷åðåäíîãî áàéòà â al
ADD
eax,eax
; // âû÷èñëåíèå êîíòðîëüíîé ñóììû
LOOP HarvestCRC
; // until(—cx>0)
xor
[ebx],ah
; // ðàñøèôðîâêà î÷åðåäíîãî ñèìâîëà s0
inc
ebx
; // óêàçàòåëü íà ñëåä. ñèìâîë
cmp
[ebx],0
; // until (ïîêà íå êîíåö ñòðîêè)
jnz
GetNextChar
; // ïðîäîëæèòü ðàñøèôðîâêó
popa
; // âîññòàíîâèòü âñå ðåãèñòðû
EndCode:
; // êîíåö êîíòðîëèðóåìîãî êîäà
NOP
; // Safe BreakPoint here
}

410

Ñïîñîáû çàòðóäíåíèÿ àíàëèçà ïðîãðàìì
printf(s0)
return 0;

; // âûâîä ñòðîêè íà ýêðàí

}

Ïðè íîðìàëüíîì çàïóñêå íà ýêðàíå äîëæíà ïîÿâèòüñÿ ñòðîêà «Hello, Free
World!», íî ïðè ïðîãîíå ïîä îòëàä÷èêîì ïðè íàëè÷èè õîòÿ áû îäíîé òî÷êè îñòàíîâà, óñòàíîâëåííîé â ïðåäåëàõ îò BeginCode äî EndCode, íà ýêðàíå ïîÿâèòñÿ
áåññìûñëåííûé ìóñîð íàïîäîáèå: «Jgnnm."Dpgg"Umpnf#0».
Çíà÷èòåëüíî óñèëèòü çàùèòó ìîæíî, ïîìåñòèâ ïðîöåäóðó ïîäñ÷åòà êîíòðîëüíîé ñóììû â îòäåëüíûé ïîòîê, çàíèìàþùèéñÿ (äëÿ ñîêðûòèÿ ñâîåé äåÿòåëüíîñòè)
åùå ÷åì-íèáóäü ïîëåçíûì, òàê ÷òîáû çàùèòíûé ìåõàíèçì ïî âîçìîæíîñòè íå áðîñàëñÿ â ãëàçà.
Ïîòîêè âîîáùå âåëèêàÿ âåùü, òðåáóþùàÿ ê ñåáå îñîáîãî ïîäõîäà. ×åëîâåêó
î÷åíü òðóäíî ñìèðèòüñÿ ñ òåì, ÷òî ïðîãðàììà ìîæåò èñïîëíÿòüñÿ âî ìíîæåñòâå
ìåñò îäíîâðåìåííî. Ðàñïðîñòðàíåííûå îòëàä÷èêè ãðåøàò òåì, ÷òî îòëàæèâàþò
êàæäûé ïîòîê ïî îòäåëüíîñòè, íî íèêîãäà äâà è áîëåå ñðàçó. Ïðèâåäåííûé íèæå
ïðèìåð ïîêàçûâàåò, êàê ýòî ìîæíî èñïîëüçîâàòü äëÿ çàùèòû.
Ëèñòèíã 222

// Ýòà ôóíêöèÿ áóäåò âûïîëíÿòüñÿ â îòäåëüíîì ïîòîêå
// åå íàçíà÷åíèå íåçàìåòíî èçìåíÿòü ðåãèñòð ñèìâîëîâ â ñòðîêå,
// ñîäåðæàùåé èìÿ ïîëüçîâàòåëÿ
void My(void *arg)
{
int p=1;
// Óêàçàòåëü íà øèôðóåìûé áàéò
// îáðàòèòå âíèìàíèå, øèôðîâêà âûïîëíÿåòñÿ
// íå ñ ïåðâîãî áàéòà, ýòî ïîçâîëÿåò îáîéòè
// êîíòðîëüíóþ òî÷êó, óñòàíîâëåííóþ íà íà÷àëî áóôåðà
// âûïîëíÿòü äî òåõ ïîð, ïîêà íå âñòðåòèòñÿ ïåðåíîñ ñòðîêè
while ( ((char *) arg)[p]!='\n')
{
// îæèäàòü, ïîêà î÷åðåäíîé ñèìâîë íå áóäåò èíèöèàëèçèðîâàí
while( ((char *) arg)[p] --">

Оставить комментарий:


Ваш e-mail является приватным и не будет опубликован в комментарии.