/* ASProtect 2.0x script Before: CALL 00C70000 After: CALL DWORD PTR DS:[addr in IAT] written by Tim e-mail: timqwerty@yandex.ru */ var _eax var _ecx var _edx var _ebx var _esp var _ebp var _esi var _edi var _eip var addr var addr2 var iat var iat_temp var CODE_begin var CODE_end var IAT_begin var IAT_end var Alloc_begin var Alloc_end var ASPr_func // скрипт нужно выполнять стоя на OEP // все переменные задавайте тоже стоя на OEP // если найденной API нет в IAT, то она будет добавлена // поэтому нужно очень точно задать конец IAT // // сейчас скрипт настроен для распаковки Awave Audio v9.2 mov CODE_begin, 00401000 // адрес первого байта секции кода mov CODE_end, 00473FFF // адрес последнего байта секции кода mov IAT_begin, 00474000 // адрес первого DWORD'а IAT (начало IAT) mov IAT_end, 004743EC // адрес последнего DWORD'а IAT // следующие два параметра можно не задавать - они нужны только для того, // чтобы искать прыжки, ведущие в выделенную область памяти (JMP 00CD0000) // смотрите Log, если вам нужно искать такие прыжки mov Alloc_begin, 00520000 // адрес первого байта выделенной памяти mov Alloc_end, 01191FFF // адрес последнего байта выделенной памяти mov ASPr_func, 00C70000 // адрес функции-переходника ASPr'а gpa "VirtualAlloc", "kernel32.dll" findop $RESULT, #C21000# bp $RESULT mov _eip, eip mov addr, CODE_begin mov addr2, CODE_begin mov iat, IAT_end call_loop: find addr, #E8# mov addr, $RESULT mov _eax, CODE_end sub _eax, 5 cmp addr, 0 je jmp_loop cmp addr, _eax ja jmp_loop mov _eax, addr inc _eax mov _ebx, [_eax] add _ebx, addr add _ebx, 5 cmp _ebx, ASPr_func jne call_loop_end mov eip, addr bphws addr, "x" esto esto mov _eax, esp add _eax, 40 mov _ebx, [_eax] esto esto bphwc addr mov iat_temp, IAT_begin find_iat: cmp [iat_temp], _ebx je iat_found add iat_temp, 4 cmp iat_temp, iat jbe find_iat jmp iat_not_found iat_found: mov _eax, addr mov [_eax], #FF15# add _eax, 2 mov [_eax], iat_temp add addr, 5 jmp call_loop_end iat_not_found: add iat, 4 mov [iat], 00000000 add iat, 4 mov [iat], _ebx mov _eax, addr mov [_eax], #FF15# add _eax, 2 mov [_eax], iat add addr, 5 jmp call_loop_end call_loop_end: inc addr jmp call_loop jmp_loop: find addr2, #19E9# mov addr2, $RESULT mov _eax, CODE_end sub _eax, 5 cmp addr2, 0 je finish cmp addr2, _eax ja finish inc addr2 mov _eax, addr2 inc _eax mov _ebx, [_eax] add _ebx, addr2 add _ebx, 5 cmp _ebx, Alloc_begin jb jmp_loop_end cmp _ebx, Alloc_end ja jmp_loop_end bp addr2 eval "{addr2} JMP {_ebx}" log $RESULT jmp_loop_end: inc addr2 jmp jmp_loop finish: mov eip, _eip mov _eax, iat add _eax, 4 sub _eax, IAT_begin eval "New IAT size: {_eax}" cmt eip, $RESULT bphws eip, "x" esto bphwc eip ret