Кто-нибудь знает ссылки на статьи типа "пешем простой упаковщик на С++/asm"? Пытаюсь разобраться и написать для примера свой, но что-то не идет процесс, сложно пока вникнуть. На примере было бы куда проще
Пожали модуль(длл) лзетом, покриптовали и прицепили загрузчик http://cracklab.ru/f/index.php?action=vthread&forum=6&topic=16114 мой топик(я там зачемто сделал его доступным только после авторизации). Вот копия: Используем семпл из пакета Хатчессона лежащий в \MASM32\EXAMPLE8\MOB\CWS o Так как должна применяться релокация, а нормально к экзешникам она не применяется, то компилим с опцией /DLL. o Нотификация длл выполняется при захваченной кс LdrploaderLock. Всякое обращение к загрузчику из другого потока при захваченной этой кс приведёт к деадлоку. Поэтому не используем InitRoutine(), соответствеено компилим с опцией /NOENTRY. o Теперь нужен стартуп рантайм, вынесем его в экспорт с именем "Run", прежде поменяв в сурце имя "start" на "Run" и указав опцию линкеру /EXPORT:Run. После этого компилим и получаем cws.dll размером 0x19C00. Теперь жмём это посредством NTLZ(RtlCompressBuffer()) и получаем дамп размером 0x604F. Теперь шифруем, допустим простейшая битовая инверсия. Образ готов. Пишем небольшой стаб для загрузки, который расшифровывает образ, распаковывает, подгружает средствами тестируемого лодера и вызывает экспорт Run(): Код (Text): .data include Crypt.inc .code include Ldr.inc NTERR macro .if Eax Int 3 .endif endm $Dll CHAR "cws.dll",0 $Run CHAR "Run",0 assume fs:nothing Entry proc Local ImageBase:PVOID, Startup:PVOID Local MapAddress:PVOID, MapSize:ULONG Local FinalUncompressedSize:ULONG mov MapAddress,0 mov MapSize,19C00H invoke ZwAllocateVirtualMemory, NtCurrentProcess, addr MapAddress, 0, addr MapSize, MEM_COMMIT, PAGE_READWRITE NTERR ; Encrypt mov ecx,604FH/4 + 1 @@: not dword ptr [offset gMap + ecx*4 - 4] loop @b ; Unpack invoke RtlDecompressBuffer, COMPRESSION_FORMAT_LZNT1, MapAddress, 19C00H, addr gMap, 604FH, addr FinalUncompressedSize NTERR lea eax,ImageBase push eax push 0 push offset $Dll push MapAddress xor eax,eax ; #LDR_LOAD_DLL Call LDR NTERR invoke ZwFreeVirtualMemory, NtCurrentProcess, addr MapAddress, addr MapSize, MEM_RELEASE lea ecx,Startup xor eax,eax push ecx push eax push eax push offset $Run push ImageBase inc eax ; #LDR_QUERY_ENTRY Call LDR NTERR ; Fix base. mov eax,fs:[TEB.Peb] mov ecx,ImageBase push PEB.ImageBaseAddress[eax] mov PEB.ImageBaseAddress[eax],ecx Call Startup ; mov eax,fs:[TEB.Peb] ; pop PEB.ImageBaseAddress[eax] ret Entry endp http://indy-vx.narod.ru/Bin/cws.zip Помним что приложение использует GetModuleHandle(NULL), а в этом случае возвращается база экзешника, определённая в PEB[+8]. Фиксим это загрузкой туда нашей базы. Конпилим и получае экзешник размером 0x7200. Запускаем и видим битмапу с регионом наложенным на окно: http://img651.imageshack.us/img651/2243/cwsb.png Аттачимся ольгой. Сразу ругается про отсутствие модуля на диске.
Ух... такая каша в голове. Есть исходник простого криптера на си/asm/дельфи с комментариями? Много всякой инфы, сейчас сложно все систематизировать и применить на практике
Как раз инфы немного, а вот исходников - чёрт на катке не проедет, ИСХОДНИКИ > Работа с файлами http://www.wasm.ru/srclist.php?list=2