ASProtect 1.x -> 2.x inline patching Автор......: JohnWho Перевод....: NightCat/TEAM-53 Инструменты: SoftICE, Hex Workshop, Hiew, LordPE Вступление В этом туториале я покажу, как проинлайнить ASProtect 1.2 -> 2.x не копаясь по локоть в крипто алгоритмах. Мы с вами пропатчим простенькую программу в которой нашей целью будет NAG при загрузке. Программа запакована с помощью ASProtect 2.1. Начинаем Первым делом нам нужно найти то место, которое необходимо будет пропатчить, чтобы NAG исчез, но... давайте это опустим (ведь легко, 40108D 74 -> EB). Теперь нам нужно найти место в коде, где вызывается VirtualAlloc, это подскажет нам, где размещается код самого ASProtect'а. ASProtect использует 4-5 расшифровочных цикла/блока, чтобы расшифровать код в котором исполняются первые 2 VirtualAlloc вызова, ну а нам с вами нужно дойти до 2го вызова. Запускаем цель и убеждаемся, что мы прервались на EP (401000). Отсюда трейсимся во все вызовы, используя F7, до тех пор, пока не попадём вот сюда: Конец 1-го расшифровочного блока: 0040B170 0F85 1A000000 JNZ PatchMe.0040B190 <----- этот джамп будет выполняться пока 2й расшифровочный блок не будет декриптован. 0040B176 BF CAFFB26D MOV EDI, 6DB2FFCA 0040B17B E9 21000000 JMP PatchMe.0040B1A1 <----- когда мы достигаем этого джампа, 2й расшифровочный блок декриптован в память и готов для пропатчивания. Мы используем этот джамп в качестве нашего первого редиректора. Замечу, что это будет единственный редиректор в .exe, остальные буду в памяти. 0040B180 58 POP EAX 0040B181 B1 96 MOV CL, 96 0040B183 17 POP SS 0040B184 04 ED ADD AL, 0ED 0040B186 22B3 70E96E0F AND DH, BYTE PTR DS:[EBX+F6EE970] 0040B18C 9C PUSHFD 0040B18D A5 MOVS DWORD PTR ES:[EDI], DWORD PTR DS:[ESI] 0040B18E 7A 2B JPE SHORT PatchMe.0040B1BB 0040B190 66:8BFE MOV DI, SI 0040B193 E9 75FFFFFF JMP PatchMe.0040B10D Теперь установим брейкпоинт на адрес 40B17B и нажмём F5, когда мы прервёмся, продолжаем трейситься, используя F7, пока не достигнем такого кода. Конец 2-го расшифровочного блока: 0040B278 0F85 11000000 JNZ PatchMe.0040B28F <----- этот джамп будет выполняться пока 3й расшифровочный блок не будет декриптован. 0040B27E 66:BF 624F MOV DI, 4F62 0040B282 E9 19000000 JMP PatchMe.0040B2A0 <----- когда мы достигаем этого джампа, 3й расшифровочный блок декриптован в память и и готов для пропатчивания. Мы используем этот джамп в качестве нашего второго редиректора. 0040B287 B0 29 MOV AL, 29 0040B289 AE SCAS BYTE PTR ES:[EDI] 0040B28A 4F DEC EDI 0040B28B DCE5 FSUBR ST(5), ST 0040B28D BA 6B668BF9 MOV EDX, F98B666B 0040B292 E9 4BFFFFFF JMP PatchMe.0040B1E2 Теперь ставим брейкпоинт на адрес 40B282 и жмём F5, после прерывания трейсимся с F7 до такого кода. Конец 3-го расшифровочного блока: 0040B32F 0F85 25000000 JNZ PatchMe.0040B35A <----- этот джамп будет выполняться пока 4й расшифровочный блок не будет декриптован. 0040B335 E8 05000000 CALL PatchMe.0040B33F 0040B33A B9 FE5FAC75 MOV ECX, 75AC5FFE 0040B33F 80D6 57 ADC DH, 57 0040B342 5E POP ESI 0040B343 E9 2B000000 JMP PatchMe.0040B373 <----- когда мы достигаем этого джампа, 4й расшифровочный блок декриптован в память и и готов для пропатчивания. Мы используем этот джамп в качестве нашего третьего редиректора. 0040B348 62F3 BOUND ESI, EBX 0040B34A B0 29 MOV AL, 29 0040B34C AE SCAS BYTE PTR ES:[EDI] 0040B34D 4F DEC EDI 0040B34E DCE5 FSUBR ST(5), ST 0040B350 BA 6BC86186 MOV EDX, 8661C86B 0040B355 47 INC EDI 0040B356 74 9D JE SHORT PatchMe.0040B2F5 0040B358 12E3 ADC AH, BL 0040B35A 66:8BD1 MOV DX, CX 0040B35D E9 81FFFFFF JMP PatchMe.0040B2E3 Теперь ставим брейкпоинт на адрес 40B343 и жмём F5, когда прервались продолжаем трейситься с F7 пока не дойдём до такого кода. Конец 4-го расшифровочного кода: 0040B40E 0F85 13000000 JNZ PatchMe.0040B427 <----- этот джамп будет выполняться пока часть кода с первыми 2 вызовами VirtualAlloc не будет декриптована. 0040B414 66:8BDE MOV BX, SI 0040B417 E9 1F000000 JMP PatchMe.0040B43B <----- когда мы достигаем этого джампа, часть кода с первыми 2-мя вызовами VirtualAlloc декриптована и готова для пропатчивания. Мы используем этот джамп в качестве нашего четвёртого редиректора. 0040B41C A7 CMPS DWORD PTR DS: 0040B41D 54 PUSH ESP 0040B41E FD STD 0040B41F F2: PREFIX REPNE: 0040B420 43 INC EBX 0040B421 C0F9 3E SAR CL, 3E 0040B424 9F LAHF 0040B425 EC IN AL, DX 0040B426 B5 66 MOV CH, 66 0040B428 8BF1 MOV ESI, ECX 0040B42A E9 8DFFFFFF JMP PatchMe.0040B3BC Пока неплохо. Мы теперь знаем, где нужно пропатчить, чтобы пройти сквозь расшифровочные блоки контролируя ситуацию. Следующие адреса мы будем использовать в качестве редиректоров на наш код: 1. 0040B17B E921000000 JMP 0040B1A1 (в самом .exe) 2. 0040B282 E919000000 JMP 0040B2A0 (закриптован, пропатчим в памяти) 3. 0040B343 E92B000000 JMP 0040B373 (закриптован, пропатчим в памяти) 4. 0040B417 E91F000000 JMP 0040B43B (закриптован, пропатчим в памяти) Теперь ставим брейкпоинт на адрес 40B417 и жмём F5, когда прервались продолжаем трейситься с F8 пока не дойдём до такого кода. 0040B4EF 6A 00 PUSH 0 0040B4F1 FF95 F0030000 CALL NEAR DWORD PTR SS:[EBP+3F0] <----- Первый вызов VirtualAlloc 0040B4F7 8985 CC010000 MOV DWORD PTR SS:[EBP+1CC], EAX 0040B4FD 8B9D 00040000 MOV EBX, DWORD PTR SS:[EBP+400] 0040B503 039D 0D040000 ADD EBX, DWORD PTR SS:[EBP+40D] 0040B509 50 PUSH EAX 0040B50A 53 PUSH EBX 0040B50B E8 04010000 CALL PatchMe.0040B614 0040B510 6A 40 PUSH 40 0040B512 68 00100000 PUSH 1000 0040B517 FFB5 08040000 PUSH DWORD PTR SS:[EBP+408] 0040B51D 6A 00 PUSH 0 0040B51F FF95 F0030000 CALL NEAR DWORD PTR SS:[EBP+3F0] <----- Второй. Когда выполняется этот вызов, ЕАХ будет содержать адресную область, куда будет декриптован код ASProtect'a. Нам нужно узнать этот диапазон адресов, дабы пропатчить virtual allocated код АСПра. 0040B525 8985 31040000 MOV DWORD PTR SS:[EBP+431], EAX 0040B52B 8985 D0010000 MOV DWORD PTR SS:[EBP+1D0], EAX ........ ПРОПУСКАЕМ КОД... ........ 0040B5EA 53 PUSH EBX 0040B5EB 6A 00 PUSH 0 0040B5ED 6A 00 PUSH 0 0040B5EF 6A 01 PUSH 1 0040B5F1 57 PUSH EDI 0040B5F2 8B5E 08 MOV EBX, DWORD PTR DS:[ESI+8] 0040B5F5 03DF ADD EBX, EDI 0040B5F7 53 PUSH EBX 0040B5F8 68 00800000 PUSH 8000 <------ Тут EDI содержит адресную область. Мы используем это место в качестве нашего 5-го редиректора. 0040B5FD 6A 00 PUSH 0 0040B5FF 56 PUSH ESI 0040B600 FF95 F4030000 CALL NEAR DWORD PTR SS:[EBP+3F4] 0040B606 68 00000000 PUSH 0 0040B60B C3 RETN <------ Этот RETN перенесёт нас к первой части virtual allocated памяти ASProtect'a. Так что с этого момента мы должны использовать наш диапазон для всех последующих пропатчиваний ASProtect'a! Итак, пока у нас есть такие адреса, которые мы будем использовать в качестве редиректоров на наш код: 1. 0040B17B E921000000 JMP 0040B1A1 (в самом .exe) 2. 0040B282 E919000000 JMP 0040B2A0 (закриптован, пропатчим в памяти) 3. 0040B343 E92B000000 JMP 0040B373 (закриптован, пропатчим в памяти) 4. 0040B417 E91F000000 JMP 0040B43B (закриптован, пропатчим в памяти) 5. 0040B5F8 6800800000 PUSH 00008000 (закриптован, пропатчим в памяти) (EDI содержит наш диапазон адресов) Теперь ставим брейкпоинт на адрес 40B5F8 и (как я задолбался это писать - прим. NCat) жмём F5, когда прервались, продолжаем трейситься с F8 пока не достигнем данного участка кода. Замечу, что с этого момента адреса на вашей машине скорее всего будут другими. 007C00B6 6A 04 PUSH 4 007C00B8 68 00100000 PUSH 1000 007C00BD 68 46050000 PUSH 546 007C00C2 6A 00 PUSH 0 007C00C4 FF95 79294400 CALL NEAR DWORD PTR SS:[EBP+442979] <----- Третий вызов VirtualAlloc 007C00CA 8985 75294400 MOV DWORD PTR SS:[EBP+442975], EAX 007C00D0 8D9D 452A4400 LEA EBX, DWORD PTR SS:[EBP+442A45] 007C00D6 50 PUSH EAX 007C00D7 53 PUSH EBX 007C00D8 E8 74050000 CALL 007C0651 007C00DD 8BC8 MOV ECX, EAX 007C00DF 8DBD 452A4400 LEA EDI, DWORD PTR SS:[EBP+442A45] 007C00E5 8BB5 75294400 MOV ESI, DWORD PTR SS:[EBP+442975] 007C00EB F3:A4 REP MOVS BYTE PTR ES:[EDI], BYTE PTR DS:[ESI] 007C00ED 8B85 75294400 MOV EAX, DWORD PTR SS:[EBP+442975] 007C00F3 68 00800000 PUSH 8000 <------ Это наш 6-й редиректор. 007C00F8 6A 00 PUSH 0 007C00FA 50 PUSH EAX 007C00FB FF95 7D294400 CALL NEAR DWORD PTR SS:[EBP+44297D] 007C0101 8D85 512C4400 LEA EAX, DWORD PTR SS:[EBP+442C51] 007C0107 50 PUSH EAX 007C0108 C3 RETN Итак, пока у нас есть такие адреса, которые мы будем использовать в качестве редиректоров на наш код: 1. 0040B17B E921000000 JMP 0040B1A1 (в самом .exe) 2. 0040B282 E919000000 JMP 0040B2A0 (закриптован, пропатчим в памяти) 3. 0040B343 E92B000000 JMP 0040B373 (закриптован, пропатчим в памяти) 4. 0040B417 E91F000000 JMP 0040B43B (закриптован, пропатчим в памяти) 5. 0040B5F8 6800800000 PUSH 00008000 (закриптован, пропатчим в памяти) (EDI содержит наш диапазон адресов) 6. 007C00F3 68008000006A PUSH 00008000 (закриптован, пропатчим в памяти) Продолжаем трейситься с F8 пока не увидим вот это: 007C030D 8B9D 552A4400 MOV EBX, DWORD PTR SS:[EBP+442A55] 007C0313 0BDB OR EBX, EBX 007C0315 74 0A JE SHORT 007C0321 007C0317 8B03 MOV EAX, DWORD PTR DS:[EBX] 007C0319 8785 592A4400 XCHG DWORD PTR SS:[EBP+442A59], EAX 007C031F 8903 MOV DWORD PTR DS:[EBX], EAX 007C0321 8DB5 712A4400 LEA ESI, DWORD PTR SS:[EBP+442A71] 007C0327 833E 00 CMP DWORD PTR DS:[ESI], 0 007C032A 0F84 D3000000 JE 007C0403 007C0330 8DB5 712A4400 LEA ESI, DWORD PTR SS:[EBP+442A71] 007C0336 8B46 04 MOV EAX, DWORD PTR DS:[ESI+4] 007C0339 6A 04 PUSH 4 007C033B 68 00100000 PUSH 1000 007C0340 50 PUSH EAX 007C0341 6A 00 PUSH 0 ........ ПРОПУСКАЕМ КОД ........ 007C05BB 8985 112F4400 MOV DWORD PTR SS:[EBP+442F11], EAX 007C05C1 61 POPAD <------ Это наш 7-й редиректор. 007C05C2 75 08 JNZ SHORT 007C05CC 007C05C4 B8 01000000 MOV EAX, 1 007C05C9 C2 0C00 RETN 0C 007C05CC 68 00000000 PUSH 0 007C05D1 C3 RETN Пока у нас есть такие адреса, которые мы будем использовать в качестве редиректоров на наш код: 1. 0040B17B E921000000 JMP 0040B1A1 (в самом .exe) 2. 0040B282 E919000000 JMP 0040B2A0 (закриптован, пропатчим в памяти) 3. 0040B343 E92B000000 JMP 0040B373 (закриптован, пропатчим в памяти) 4. 0040B417 E91F000000 JMP 0040B43B (закриптован, пропатчим в памяти) 5. 0040B5F8 6800800000 PUSH 00008000 (закриптован, пропатчим в памяти) (EDI содержит наш диапазон адресов) 6. 007C00F3 68008000006A PUSH 00008000 (закриптован, пропатчим в памяти) 7. 007C05C1 617508B80100 xxx xxxxxxxx (закриптован, пропатчим в памяти) Теперь уберите все брейкпоинты, которые поставили раньше и поставьте новый на MapViewOfFileEx, нажмите F5 и затем F12 2 раза. Вы должны увидеть что-то такое: 007AD400 6A 00 PUSH 0 007AD402 6A 00 PUSH 0 007AD404 6A 00 PUSH 0 007AD406 6A 04 PUSH 4 <------ Мы должны пропатчить эту инструкцию, так чтобы записывалось 1 (а не 4 - прим. NCat). таким образом .exe станет доступен для изменения в памяти. 007AD408 A1 58A57B00 MOV EAX, DWORD PTR DS:[7BA558] 007AD40D 50 PUSH EAX 007AD40E A1 D4277B00 MOV EAX, DWORD PTR DS:[7B27D4] 007AD413 8B40 08 MOV EAX, DWORD PTR DS:[EAX+8] 007AD416 FFD0 CALL NEAR EAX <------ Вызов MapViewOfFile. 007AD418 8BD8 MOV EBX, EAX <------ Тут EAX указывает на mapped .exe в памяти. Мы должны пропатчить mapped .exe, чтобы обойти проверку CRC. Это будет наш 8-й редиректор. 007AD41A 57 PUSH EDI 007AD41B E8 4B010000 CALL 007AD56B 0040B5FD 6A 00 PUSH 0 Пока у нас есть такие адреса, которые мы будем использовать в качестве редиректоров на наш код: 1. 0040B17B E921000000 JMP 0040B1A1 (в самом .exe) 2. 0040B282 E919000000 JMP 0040B2A0 (закриптован, пропатчим в памяти) 3. 0040B343 E92B000000 JMP 0040B373 (закриптован, пропатчим в памяти) 4. 0040B417 E91F000000 JMP 0040B43B (закриптован, пропатчим в памяти) 5. 0040B5F8 6800800000 PUSH 00008000 (закриптован, пропатчим в памяти) (EDI содержит наш диапазон адресов) 6. 007C00F3 68008000006A PUSH 00008000 (закриптован, пропатчим в памяти) 7. 007C05C1 617508B80100 xxx xxxxxxxx (закриптован, пропатчим в памяти) 8. 007AD418 8BD857E84B01 xxx xxxxxxxx (закриптован, пропатчим в памяти) (EAX указывает на mapped .exe в памяти) Теперь мы разобрались с CRC проверкой и нам нужно лишь пропатчить наш .exe, чтобы избавиться от NAG'a, на данном этапе код, который мы хотим пропатчить, еще не расшифрован в памяти, так что нам нужен еще один редиректор после того, как код будет расшифрован. Удаляем все брейкпоинты и ставим новый "bpm 40108D r", это адрес, который мы хотим пропатчить, чтобы наг исчез. Нажмите F5 5 раз, когда вы прервётесь третий раз вы можете видеть, что байты по адресу 40108D уже расшифрованы. Когда прервёмся 5-й раз, то увидим: 0078F3A0 81C7 A1EBD96E ADD EDI, 6ED9EBA1 <------- Вы должны быть тут. 0078F3A6 8BEE MOV EBP, ESI 0078F3A8 33EB XOR EBP, EBX 0078F3AA 33E8 XOR EBP, EAX 0078F3AC 03FD ADD EDI, EBP 0078F3AE 03CF ADD ECX, EDI 0078F3B0 8BF9 MOV EDI, ECX 0078F3B2 C1E7 03 SHL EDI, 3 0078F3B5 C1E9 1D SHR ECX, 1D 0078F3B8 0BF9 OR EDI, ECX 0078F3BA 8BCF MOV ECX, EDI Нажмите F12 или один раз "over/into" инструкции RET по адресу и вы должны увидеть такой код: 0078F59D 83C7 40 ADD EDI, 40 <------ Вы тут. 0078F5A0 83EB 40 SUB EBX, 40 0078F5A3 83FB 40 CMP EBX, 40 0078F5A6 7D EC JGE SHORT 0078F594 0078F5A8 8B0424 MOV EAX, DWORD PTR SS:[ESP] 0078F5AB 03C5 ADD EAX, EBP 0078F5AD 8D56 08 LEA EDX, DWORD PTR DS:[ESI+8] 0078F5B0 8BCB MOV ECX, EBX 0078F5B2 E8 A130FFFF CALL 00782658 0078F5B7 5A POP EDX 0078F5B8 5D POP EBP 0078F5B9 5F POP EDI 0078F5BA 5E POP ESI 0078F5BB 5B POP EBX 0078F5BC C3 RETN Снова удаляем брейкпоинты и ставим новый на 78F5BC, жмём F5 и прерываемся. Жмём F12 2 раза и видим такое: 007AE13C 53 PUSH EBX <----- Вы тут. 007AE13D 56 PUSH ESI 007AE13E 57 PUSH EDI 007AE13F 55 PUSH EBP 007AE140 83C4 D8 ADD ESP, -28 007AE143 A1 9C277B00 MOV EAX, DWORD PTR DS:[7B279C] 007AE148 C600 D2 MOV BYTE PTR DS:[EAX], 0D2 007AE14B B2 01 MOV DL, 1 007AE14D A1 F4B07900 MOV EAX, DWORD PTR DS:[79B0F4] 007AE152 E8 F9CFFEFF CALL 0079B150 007AE157 8BF0 MOV ESI, EAX 007AE159 E8 7EE7FFFF CALL 007AC8DC 007AE15E 8BD8 MOV EBX, EAX 007AE160 A1 E0277B00 MOV EAX, DWORD PTR DS:[7B27E0] 007AE165 8B00 MOV EAX, DWORD PTR DS:[EAX] 007AE167 8946 04 MOV DWORD PTR DS:[ESI+4], EAX 007AE16A A1 04277B00 MOV EAX, DWORD PTR DS:[7B2704] 007AE16F 8B00 MOV EAX, DWORD PTR DS:[EAX] 007AE171 33D2 XOR EDX, EDX 007AE173 8950 04 MOV DWORD PTR DS:[EAX+4], EDX 007AE176 A1 F0277B00 MOV EAX, DWORD PTR DS:[7B27F0] 007AE17B 8B00 MOV EAX, DWORD PTR DS:[EAX] 007AE17D 8B00 MOV EAX, DWORD PTR DS:[EAX] 007AE17F 8B15 04277B00 MOV EDX, DWORD PTR DS:[7B2704] <---- Когда достигается этот джамп, CRC проверка памяти завершена и мы можем пропатчить цель. Так что это наш 9-й редиректор. 007AE185 8B12 MOV EDX, DWORD PTR DS:[EDX] 007AE187 8942 50 MOV DWORD PTR DS:[EDX+50], EAX 007AE18A A1 04277B00 MOV EAX, DWORD PTR DS:[7B2704] Теперь у нас есть все адреса: 1. 0040B17B E921000000 JMP 0040B1A1 (в самом .exe) 2. 0040B282 E919000000 JMP 0040B2A0 (закриптовано, пропатчим в памяти) 3. 0040B343 E92B000000 JMP 0040B373 (закриптовано, пропатчим в памяти) 4. 0040B417 E91F000000 JMP 0040B43B (закриптовано, пропатчим в памяти) 5. 0040B5F8 6800800000 PUSH 00008000 (закриптовано, пропатчим в памяти) (EDI содержит наш диапазон адресов) 6. 007C00F3 68008000006A PUSH 00008000 (закриптовано, пропатчим в памяти) 7. 007C05C1 617508B80100 xxx xxxxxxxx (закриптовано, пропатчим в памяти) 8. 007AD418 8BD857E84B01 xxx xxxxxxxx (закриптовано, пропатчим в памяти) (EAX указывает на mapped .exe в памяти) 9. 007AE17F 8B1504277B00 MOV xxxxxxxx (закриптовано, пропатчим в памяти) (тут мы патчим нашу цель в памяти) Давайте подготовим .exe для нашего "патчерского" кода. Открываем .exe в LordPE, кликаем на "Sections", затем правый клик по последней секции и выбираем "edit section header". Меняем RawSize 00000000 -> 00001000. Сохраняем изменения и закрываем LordPE, затем открываем .exe в Hex Workshop и скролим в самый конец файла. Вставляем 1000(тысячу) "90" байт(hex). Закрываем Hex Workshop, сохранив изменения. Запускаем цель и прерываемся на MapViewOfFileEx, когда вы находитесь на строке 7AD418, которая следует сразу после вызова MapViewOfFile, поищите байты 90 90 90 90 90 90 90 90 90 90. Вы должны найти их по адресу 42B005, это те самые байты, которые мы добавили в Hex Workshop, но некоторые из них были перезаписаны ASProtect'ом, так что нам приходится использовать поиск, чтобы понять, где, собсно, наше пространство начинается. Итак, наше пространство начинается с адреса 42B005. Откройте .exe в Hex Workshop, проскрольте вниз до конца файла и выберите всю 1000 "90" байт и замените их на 00. Это, конечно, не обязательно, но всё становится намного проще. Давайте перенаправим конец первого расшифровочного блока (первый редиректор - прим. NCat) в наш код. Открываем .exe в Hiew и ищем эти байты - E921000000, это байты нашего первого редиректора (тот самый, который единственный в файле). Вы должны увидеть следующее: .0040B176: BFCAFFB26D mov edi,06DB2FFCA .0040B17B: E921000000 jmp .00040B1A1 --- (4) <------ Направляем в наше пространство под патч. .0040B180: 58 pop eax .0040B176: BFCAFFB26D mov edi,06DB2FFCA .0040B17B: E985FE0100 jmp .00042B005 --- (4) <------ Теперь он идёт куда нужно. .0040B180: 58 pop eax Теперь время написать код патча в нашем подготовленном пространстве..... [выпивая кофе и очищая клавиатуру от всякого мусора] ...вот наш законченный код > Часть 1: 0042B005 C70582B24000E98DFD01 MOV DWORD PTR DS:[40B282],1FD8DE9 <-- Патчим наш второй редиректор, направляя его во вторую часть патча. 0042B00F E98D01FEFF JMP Patched_.0040B1A1 <-- Теперь прыгаем туда, куда вёл джамп, заменённый нами на наш первый редиректор. (Перечитайте - прим. NCat) Часть 2: 0042B014 C70543B34000E9DBFC01 MOV DWORD PTR DS:[40B343],1FCDBE9 <-- Патчим наш третий редиректор, направляя его в третью часть патча. 0042B01E E97D02FEFF JMP Patched_.0040B2A0 <-- Теперь прыгаем туда, куда вёл джамп, заменённый нами на наш 2-й редиректор. Часть 3: 0042B023 C70517B44000E916FC01 MOV DWORD PTR DS:[40B417],1FC16E9 <-- Патчим наш четвёртый редиректор, направляя его в четвёртую часть патча. 0042B02D E94103FEFF JMP Patched_.0040B373 <-- Теперь прыгаем туда, куда вёл джамп, заменённый нами на наш 3-й редиректор. Часть 4: 0042B032 C705F8B54000E944FA01 MOV DWORD PTR DS:[40B5F8],1FA44E9 <-- Патчим наш пятый редиректор, направляя его в пятую часть патча. 0042B03C E9FA03FEFF JMP Patched_.0040B43B <-- Теперь прыгаем туда, куда вёл джамп, заменённый нами на наш 4-й редиректор. Часть 5: 0042B041 893DFCBF4200 MOV DWORD PTR DS:[42BFFC],EDI <-- Записываем диапазон адресов aspr'a в конец нашего пространства под патч. 0042B047 C705F8B5400068008000 MOV DWORD PTR DS:[40B5F8],800068 <-- Пропатчиваем назад к адресу 5-го редиректора. 0042B051 C787F30004006867B042 MOV DWORD PTR DS:[EDI+400F3],42B06768 <-- Патчим 6-й редиректор, чтобы он вёл в 6-ю часть нашего кода используя диапазон адресов в EDI. 0042B05B C687F8000400C3 MOV BYTE PTR DS:[EDI+400F8],0C3 0042B062 E99105FEFF JMP Patched_.0040B5F8 <-- Прыгаем назад к адресу 5-го редиректора. Часть 6: 0042B067 60 PUSHAD <----- Сохраняем регистры(EAX). 0042B068 A1FCBF4200 MOV EAX, DWORD PTR DS:[42BFFC] <-- Кладём диапазон в EAX. 0042B06D C780F300040068008000 MOV DWORD PTR DS:[EAX+400F3],800068 <-- Пропатчиваем назад к адресу 6-го редиректора, используя диапазон в EAX. 0042B077 C680F80004006A MOV BYTE PTR DS:[EAX+400F8],6A 0042B07E C780C105040068A2B042 MOV DWORD PTR DS:[EAX+405C1],42B0A268 <-- Направляем 7й редиректор в 7-ю часть нашего патча, используя диапазон в EAX. 0042B088 66C780C505040000C3 MOV WORD PTR DS:[EAX+405C5],0C300 0042B091 05F3000400 ADD EAX, 400F3 <-- Adding address return base to EAX. 0042B096 A39DB04200 MOV DWORD PTR DS:[42B09D],EAX <-- Адрес return'a из инструкции EAX в PUSH 0042B09B 61 POPAD <---------- Восстанавливаем регистры(EAX). 0042B09C 6800000000 PUSH 0 <------- Push return address. 0042B0A1 C3 RETN <----------- Return to return address. Часть 7: 0042B0A2 60 PUSHAD <------- Сохраняем регистры(EAX). 0042B0A3 A1FCBF4200 MOV EAX, DWORD PTR DS:[42BFFC] <-- Кладём диапазон в EAX. 0042B0A8 C780C1050400617508B8 MOV DWORD PTR DS:[EAX+405C1],B8087561 <-- Пропатчиваем назад к адресу 7-го редиректора, используя диапазон в EAX. 0042B0B2 66C780C50504000100 MOV WORD PTR DS:[EAX+405C5],1 0042B0BB C68007D4020001 MOV BYTE PTR DS:[EAX+2D407],1 <-- PUSH 6A04 -> 6A01, чтобы файл был доступен для записи. 0042B0C2 C78018D4020068E6B042 MOV DWORD PTR DS:[EAX+2D418],42B0E668 <-- Направляем 8й редиректор в 8-ю часть нашего патча, используя диапазон в EAX. 0042B0CC 66C7801CD4020000C3 MOV WORD PTR DS:[EAX+2D41C],0C300 0042B0D5 05C1050400 ADD EAX, 405C1 <-- Adding address return base to EAX. 0042B0DA A3E1B04200 MOV DWORD PTR DS:[42B0E1],EAX <-- Адрес return'a из инструкции EAX в PUSH 0042B0DF 61 POPAD <------- Восстанавливаем регистры(EAX). 0042B0E0 6800000000 PUSH 0 <---- Push return address. 0042B0E5 C3 RETN <-------- Return to return address. Часть 8: 0042B0E6 C680F902000000 MOV BYTE PTR DS:[EAX+2F9],0 <-- Патчим "1000" байт в памяти mapped .exe (в header'e) 0042B0ED C7807B5F0000E9210000 MOV DWORD PTR DS:[EAX+5F7B],21E9 <-- Обратный патч 1-го редиректора в памяти mapped .exe. CRC убита 0042B0F7 60 PUSHAD <------ Сохраняем регистры(EAX). 0042B0F8 A1FCBF4200 MOV EAX, DWORD PTR DS:[42BFFC] <-- Кладём диапазон в EAX. 0042B0FD C78018D402008BD857E8 MOV DWORD PTR DS:[EAX+2D418],E857D88B <-- Пропатчиваем назад к адресу 8-го редиректора, используя диапазон в EAX. 0042B107 66C7801CD402004B01 MOV WORD PTR DS:[EAX+2D41C],14B 0042B110 C68007D4020004 MOV BYTE PTR DS:[EAX+2D407],4 <-- PUSH 6A01 -> 6A01, чтобы ASProtect нас не попалил. 0042B117 C7807FE10200683BB142 MOV DWORD PTR DS:[EAX+2E17F],42B13B68 <-- Направляем 9й редиректор в 9-ю часть нашего патча, используя диапазон в EAX. 0042B121 66C78083E1020000C3 MOV WORD PTR DS:[EAX+2E183],0C300 0042B12A 0518D40200 ADD EAX, 2D418 <-- Adding address return base to EAX. 0042B12F A336B14200 MOV DWORD PTR DS:[42B136],EAX <-- Адрес return'a из инструкции EAX в PUSH 0042B134 61 POPAD <---- Восстанавливаем регистры(EAX). 0042B135 6800000000 PUSH 0 <- Push return address. 0042B13A C3 RETN <----- Return to return address. Часть 9: 0042B13B 60 PUSHAD <---------- Сохраняем регистры(EAX). 0042B13C A1FCBF4200 MOV EAX, DWORD PTR DS:[42BFFC] <-- Кладём диапазон в EAX. 0042B141 C7807FE102008B150427 MOV DWORD PTR DS:[EAX+2E17F],2704158B <-- Пропатчиваем назад к адресу 9-го редиректора, используя диапазон в EAX. 0042B14B 66C78083E102007B00 MOV WORD PTR DS:[EAX+2E183],7B 0042B154 C6058D104000EB MOV BYTE PTR DS:[40108D],0EB <-- Убиваем NAG 0042B15B 057FE10200 ADD EAX, 2E17F <--- Adding address return base to EAX. 0042B160 A367B14200 MOV DWORD PTR DS:[42B167],EAX <--- Адрес return'a из инструкции EAX в PUSH 0042B165 61 POPAD <----- Восстанавливаем регистры(EAX). 0042B166 6800000000 PUSH 0 <-- Push return address. 0042B16B C3 RETN <------ Return to return address. Ну, вот и всё.