Hier poste ich ASM und Reversing Zeugs welches ich nicht in einem Thread packen kann, da es sich nicht lohnen würde.
ASProtect OEP - [MASM]
Da ich eigentlich vor hatte einen ASProtect-Unpacker zu schreiben und mir dann die Lust dran vergangen ist, pack ich hier mal meinen momentanen Source rein.
Was Fehlt:
Bei Fragen oder so bitte einfach melden 
Vielleicht werde ich das Programm noch vollenden ( oder jemand anderes? ) da ich eigentlich einen Ersatz für stripper brauche da dieser auf meinem PC nicht funktioniert und DecomAS versagt sowieso bei jeder unpackme die ich darein gejagt habe.
Was Fehlt:
- IAT-Fixer (Obfuscated Calls)
- Stolen Bytes
Code:
ifndef _UNPROTECT__ASPROTECT _UNPROTECT__ASPROTECT equ<1> include extension.asm .const ASPR_EXE equ 0 ASPR_DLL equ 1 ASPR_SCANSIZE equ 255 aspr_pattern_scan proto :DWORD, :DWORD, :DWORD, :DWORD, :DWORD .data? ASPR_PI PROCESS_INFORMATION <?> ASPR_CodeSection dd ? ASPR_CodeSize dd ? ASPR_FileHandle dd ? .data ;= Pattern =; ASPR_PATTERN db 31h, 00h, 64h, 8Fh, 05h, 00h, 00h, 00h, 00h ; xor dword ptr ds:[eax], eax,\ pop dword ptr fs:[0] ASPR_PATTERN_RET db 0FFh, 030h, 0FFh, 075h, 0F0h, 0FFh, 075h, 0ECh, 0C3h ; push dword ptr ds:[eax],\ push dword ptr ss:[ebp-10],\ push dword ptr ss:[ebp-14],\ retn ASPR_PATTERN_ZERO db 00h, 00h, 00h, 00h ;= Patches =; ASPR_PATCH_INT3 db 0CCh, 90h, 90h ; int 3,\ nop,\ nop ASPR_PATCH_BACK db 0FFh, 75h, 0ECh ; push dword ptr ds:[ebp-14] ASPR_DBG_PATCH db 0C6h, 40h, 02h, 00h ; mov byte ptr ds:[eax+2], 00 .code aspr_dumpfile proc DumpName:DWORD, EntryPoint:DWORD LOCAL MapHandle:DWORD, MapView:DWORD, DmpFileHandle:DWORD, DmpMapHandle:DWORD, DmpMapView:DWORD, ImageBase:DWORD, ImageSize:DWORD, OEP_Addr:DWORD, SecStart:DWORD, SecSize:DWORD, Buffer:DWORD, OldProtect:DWORD, rw:DWORD pushad mov rw, 0 invoke CreateFileMapping, ASPR_FileHandle, 0, PAGE_READONLY, 0, 0, 0 .if eax == 0 invoke GetLastError log _strfm('Failed to map file [0x%d]', eax) popad xor eax, eax ret .endif mov MapHandle, eax invoke MapViewOfFile, MapHandle, FILE_MAP_READ, 0, 0, 0 .if eax == 0 invoke GetLastError log _strfm('Failed to create map view [0x%X]', eax) popad xor eax, eax ret .endif mov MapView, eax mov esi, eax assume esi:ptr IMAGE_DOS_HEADER add esi, [esi].e_lfanew assume esi:ptr IMAGE_NT_HEADERS m2m ImageBase, [esi].OptionalHeader.ImageBase m2m ImageSize, [esi].OptionalHeader.SizeOfImage invoke VirtualAlloc, 0, ImageSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE mov Buffer, eax invoke VirtualProtectEx, ASPR_PI.hProcess, ImageBase, ImageSize, PAGE_EXECUTE_READWRITE, addr OldProtect invoke ReadProcessMemory, ASPR_PI.hProcess, ImageBase, Buffer, ImageSize, addr rw invoke VirtualProtectEx, ASPR_PI.hProcess, ImageBase, ImageSize, OldProtect, 0 invoke UnmapViewOfFile, MapView invoke CloseHandle, MapHandle ;Create Dump File mov DmpFileHandle, _call(CreateFile, DumpName, GENERIC_WRITE + GENERIC_READ, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0) invoke WriteFile, DmpFileHandle, Buffer, ImageSize, addr rw, 0 log _str('Saved dump!') ;Basic Dump done. ;Fix Dump mov DmpMapHandle, _call(CreateFileMapping, DmpFileHandle, 0, PAGE_READWRITE, 0, 0, 0) mov DmpMapView, _call(MapViewOfFile, DmpMapHandle, FILE_MAP_ALL_ACCESS, 0, 0, 0) mov esi, DmpMapView assume esi:ptr IMAGE_DOS_HEADER add esi, [esi].e_lfanew assume esi:ptr IMAGE_NT_HEADERS mov edx, esi add edx, sizeof IMAGE_NT_HEADERS assume edx:ptr IMAGE_SECTION_HEADER ;Fix EP mov ebx, EntryPoint sub ebx, ImageBase m2m [esi].OptionalHeader.AddressOfEntryPoint, ebx m2m [esi].OptionalHeader.SizeOfImage, ImageSize mov [esi].OptionalHeader.SizeOfHeaders, 1000h movzx ecx, [esi].FileHeader.NumberOfSections log _str('Fixing sections...') .while ecx > 0 pushad m2m SecStart, [edx].VirtualAddress m2m SecSize, [edx].Misc.VirtualSize ;Align size modulo SecSize, [esi].OptionalHeader.SectionAlignment .if eax != 0 sub SecSize, eax addm SecSize, [esi].OptionalHeader.SectionAlignment .endif mov edi, MapView add edi, SecStart mov ebx, ImageBase add ebx, SecStart pinvoke ReadProcessMemory, ASPR_PI.hProcess, ebx, edi, SecSize, addr rw m2m [edx].VirtualAddress, SecStart m2m [edx].PointerToRawData, SecStart m2m [edx].Misc.VirtualSize, SecSize m2m [edx].SizeOfRawData, SecSize m2m [edx].Characteristics, IMAGE_SCN_MEM_WRITE lea eax, [edx].Name1 log _strfm('Section "%s" fixed.', eax) popad add edx, sizeof IMAGE_SECTION_HEADER dec ecx .endw log _strfm('%X',[esi].OptionalHeader.AddressOfEntryPoint) assume esi:ptr NOTHING assume edi:ptr NOTHING assume edx:ptr NOTHING invoke UnmapViewOfFile, DmpMapView invoke CloseHandle, DmpMapHandle invoke CloseHandle, DmpFileHandle invoke VirtualFree, Buffer, 0, MEM_DECOMMIT ;invoke aspr_rebuild_imports, DumpName log _str('Fixed !') popad ret aspr_dumpfile endp aspr_get_codesection proc LOCAL MapHandle:DWORD, MapView:DWORD pushad invoke CreateFileMapping, ASPR_FileHandle, 0, PAGE_READONLY, 0, 0, 0 .if eax == 0 invoke GetLastError log _strfm('Failed to map file [0x%d]', eax) popad xor eax, eax ret .endif mov MapHandle, eax invoke MapViewOfFile, MapHandle, FILE_MAP_READ, 0, 0, 0 .if eax == 0 invoke GetLastError log _strfm('Failed to create map view [0x%X]', eax) popad xor eax, eax ret .endif mov MapView, eax assume eax:ptr IMAGE_DOS_HEADER add eax, [eax].e_lfanew assume eax:ptr IMAGE_NT_HEADERS mov esi, eax add esi, sizeof IMAGE_NT_HEADERS assume esi:ptr IMAGE_SECTION_HEADER mov ebx, [esi].VirtualAddress add ebx, [eax].OptionalHeader.ImageBase mov ASPR_CodeSection, ebx m2m ASPR_CodeSize, [esi].Misc.VirtualSize assume esi:ptr NOTHING assume eax:ptr NOTHING invoke UnmapViewOfFile, MapView invoke CloseHandle, MapHandle popad mov eax, 1 ret aspr_get_codesection endp aspr_pattern_scan proc ProcHandle:DWORD, Address:DWORD, ScanSize:DWORD, Pattern:DWORD, PatternSize:DWORD LOCAL found:DWORD, i:DWORD, j:DWORD, Buffer:DWORD, rw:DWORD pushad mov rw, 0 mov i, 0 mov j, 0 invoke VirtualAlloc, 0, PatternSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE mov Buffer, eax invoke ReadProcessMemory, ProcHandle, Address, Buffer, ASPR_SCANSIZE, addr rw .if eax == 0 invoke GetLastError log _strfm('Failed to read from process [0x%X]', eax) invoke VirtualFree, Buffer, 0, MEM_DECOMMIT popad mov eax, -1 ret .endif mov edi, dword ptr ds:[Buffer] mov esi, dword ptr ds:[Pattern] mov ebx, ScanSize .while i < ebx pushad mov found, 1 mov j, 0 mov ecx, PatternSize .while j < ecx pushad mov ecx, i add ecx, j mov al, byte ptr ds:[edi+ecx] mov ecx, j mov ah, byte ptr ds:[esi+ecx] .if al != ah mov found, 0 popad .break .endif popad inc j .endw .if found == 1 popad .break .endif popad inc i .endw .if found == 1 mov ebx, Address add i, ebx .else mov i, -1 .endif invoke VirtualFree, Buffer, 0, MEM_DECOMMIT popad mov eax, i ret aspr_pattern_scan endp ;Currently only supports .exe aspr_load proc FileName:DWORD, LoadType:DWORD LOCAL DbgStatus:DWORD, tib:DWORD, pib:DWORD, dbg_i:DWORD, IsHidden:DWORD, DbgAddr:DWORD, DbgRAddr:DWORD, BP_Addr:DWORD, OldProtect:DWORD, OEP:DWORD, rw:DWORD LOCAL BP_Set:BYTE, BP_Reached:BYTE, PG_Hit:BYTE LOCAL segsel:LDT_ENTRY LOCAL sui:STARTUPINFO LOCAL dbg:DEBUG_EVENT LOCAL ctx:CONTEXT mov rw, 0 .if LoadType == ASPR_EXE invoke RtlZeroMemory, addr sui, sizeof(STARTUPINFO) invoke RtlZeroMemory, addr ASPR_PI, sizeof(PROCESS_INFORMATION) invoke RtlZeroMemory, addr ctx, sizeof(CONTEXT) mov IsHidden, 0 mov BP_Addr, 0 mov PG_Hit, 0 mov OldProtect, 0 mov OEP, 0 mov sui.cb, sizeof(STARTUPINFO) invoke GetStartupInfo, addr sui invoke CreateProcess, FileName, 0, 0, 0, 0, DEBUG_ONLY_THIS_PROCESS + DEBUG_PROCESS + CREATE_NO_WINDOW, 0, 0, addr sui, addr ASPR_PI .if eax == 0 invoke GetLastError log _strfm('Failed to create process [0x%X]', eax) xor eax, eax ret .endif log _strfm('Process Created: %d', ASPR_PI.dwProcessId) .while 1 ; Debug Loop invoke WaitForDebugEvent, addr dbg, 0FFFFFFFFh .if dbg.dwDebugEventCode == CREATE_PROCESS_DEBUG_EVENT m2m DbgStatus, DBG_EXCEPTION_NOT_HANDLED m2m ASPR_FileHandle, dbg.u.CreateProcessInfo.hFile .elseif dbg.dwDebugEventCode == EXCEPTION_DEBUG_EVENT .if dbg.u.Exception.pExceptionRecord.ExceptionCode == EXCEPTION_ACCESS_VIOLATION ;Step 1) Catch Access violations until the last one, we will find this with pattern scanning ( We could count the Access Violation and subtract 1 but this is faster in my opinion ) m2m DbgStatus, DBG_EXCEPTION_NOT_HANDLED invoke SuspendThread, ASPR_PI.hThread mov ctx.ContextFlags, CONTEXT_FULL invoke GetThreadContext, ASPR_PI.hThread, addr ctx ;Step 2) Scan for the patterns ; Scan for the first pattern: ; - ; xor dword ptr ds:[eax], eax ; pop dword ptr fs:[0] ; pop eax ; - invoke aspr_pattern_scan, ASPR_PI.hProcess, ctx.regEip, ASPR_SCANSIZE, addr ASPR_PATTERN, 9 .if eax != -1 mov ebx, ctx.regEip add ebx, 9 ; Scan for the other pattern: ; - ; push dword ptr ds:[eax] ; push dword ptr ss:[ebp-10] ; push dword ptr ss:[ebp-14] ; retn ; - invoke aspr_pattern_scan, ASPR_PI.hProcess, ebx, ASPR_SCANSIZE, addr ASPR_PATTERN_RET, 9 .if eax != -1 add eax, 5 mov BP_Addr, eax ;Step 3) Set a SoftwareBreakpoint ( Int3 ) invoke WriteProcessMemory, ASPR_PI.hProcess, BP_Addr, addr ASPR_PATCH_INT3, 3, addr rw .if eax == 0 invoke GetLastError log _strfm('Failed to write to process [0x%X]', eax) xor eax, eax ret .endif mov BP_Set, 1 .endif .endif invoke ResumeThread, ASPR_PI.hThread .elseif dbg.u.Exception.pExceptionRecord.ExceptionCode == EXCEPTION_BREAKPOINT m2m DbgStatus, DBG_CONTINUE .if IsHidden == 0 ;Just an easy patching of IsDebuggerPresent ; - ; movzx eax, byte ptr ds:[eax+2] ; to ; mov byte ptr ds:[eax+2], 00 ; - mov DbgAddr, 0 mov DbgRAddr, 0 mov ebx, _call(GetModuleHandle, _str('kernel32.dll')) mov ebx, _call(GetProcAddress, ebx, _str('IsDebuggerPresent')) add ebx, 2 invoke ReadProcessMemory, ASPR_PI.hProcess, ebx, addr DbgAddr, 4, addr rw .if eax == 0 invoke GetLastError log _strfm('Failed to read from process [0x%d]', eax) xor eax, eax ret .endif invoke ReadProcessMemory, ASPR_PI.hProcess, DbgAddr, addr DbgRAddr, 4, addr rw .if eax == 0 invoke GetLastError log _strfm('Failed to read from process [0x%d]', eax) xor eax, eax ret .endif add DbgRAddr, 6 invoke WriteProcessMemory, ASPR_PI.hProcess, DbgRAddr, addr ASPR_DBG_PATCH, 4, addr rw .if eax == 0 invoke GetLastError log _strfm('Failed to write to process [0x%d]', eax) xor eax, eax ret .endif mov IsHidden, 1 log _str('I am a ninja now!') .endif .if BP_Set == 1 m2m DbgStatus, DBG_EXCEPTION_NOT_HANDLED invoke SuspendThread, ASPR_PI.hThread ;Restore the bytes invoke WriteProcessMemory, ASPR_PI.hProcess, BP_Addr, addr ASPR_PATCH_BACK, 3, addr rw .if eax == 0 invoke GetLastError log _strfm('Failed to write to process [0x%X]', eax) xor eax, eax ret .endif ;Step 4) Protect the CodeSection ;=> Get the code section <=; invoke aspr_get_codesection .if eax == 1 invoke VirtualProtectEx, ASPR_PI.hProcess, ASPR_CodeSection, ASPR_CodeSize, PAGE_READWRITE + PAGE_GUARD, addr OldProtect mov PG_Hit, 1 mov BP_Set, 0 .endif invoke ResumeThread, ASPR_PI.hThread .endif .elseif dbg.u.Exception.pExceptionRecord.ExceptionCode == STATUS_GUARD_PAGE_VIOLATION m2m DbgStatus, DBG_CONTINUE .if PG_Hit == 1 m2m DbgStatus, DBG_EXCEPTION_NOT_HANDLED ;Step 5) Read the OEP from the ESP register invoke SuspendThread, ASPR_PI.hThread invoke VirtualProtectEx, ASPR_PI.hProcess, ASPR_CodeSection, ASPR_CodeSize, OldProtect, 0 invoke GetThreadContext, ASPR_PI.hThread, addr ctx invoke ReadProcessMemory, ASPR_PI.hProcess, ctx.regEsp, addr OEP, 4, addr rw invoke aspr_dumpfile, _str('__DUMPPATH__'), OEP mov PG_Hit, 0 invoke ResumeThread, ASPR_PI.hThread .endif .endif .endif invoke ContinueDebugEvent, ASPR_PI.dwProcessId, ASPR_PI.dwThreadId, DbgStatus .endw .endif ret aspr_load endp endif

Vielleicht werde ich das Programm noch vollenden ( oder jemand anderes? ) da ich eigentlich einen Ersatz für stripper brauche da dieser auf meinem PC nicht funktioniert und DecomAS versagt sowieso bei jeder unpackme die ich darein gejagt habe.
Total Comments 0