大家都知道现在壳的破解方法有很多种,随着壳的增多,出现很多的破壳的工具,然而,对现在的新手来说手动脱壳的很少,我教大家手动脱壳—教大家手动脱UPX的壳。 今天我做实验的是一个加了;UPX壳的记事本。好我们开始吧,废话說了这么多,大家着急了吧? 首先我给大家解释一下壳的概念,其实壳就相当于一个保护的东西,它可以防止我们进行防汇编和修其中的内容,因为给软件加了壳就好像给一些现实的动植物的壳差不多所以呢,在我们的软件里把在软件里面加的许多防止自己的软件被非法修改和破坏的一些程序就叫做壳了, 首先给大家介绍一个工具PeID v0.92 它的作用就是检测壳的类型,和检测软件是用什么语言编写的, 第一步:用PeID v0.92检测一下壳的类型是upx的。UPX 0.89.6 - 1.02 / 1.05 - 1.24 -> Markus & Laszlo 第二步:手动脱壳,拿出我的工具Ollydbg v1.10 来进行脱壳。Ollydbg v1.10是一个功能非常强大的工具,在脱壳和调试软件时经常用到它,首先我们用Ollydbg v1.10载入加了upx壳的记事本,OK 040EF20 >PUSHAD ; 这里是UPX壳的入口 一般UPX的入口都是PUSHAD 之所以把这个告诉大家 为了在大家遇到 多重壳的时候 做准备 0040EF21 MOV ESI,NOTEPAD.0040C015 0040EF26 LEA EDI,DWORD PTR DS:[ESI+FFFF4> 0040EF2C PUSH EDI 0040EF2D OR EBP,FFFFFFFF 0040EF30 JMP SHORT NOTEPAD.0040EF42 ; 跳40EF42 0040EF32 NOP 0040EF33 NOP 0040EF34 NOP 0040EF35 NOP 0040EF36 NOP 0040EF37 NOP 0040EF38 MOV AL,BYTE PTR DS:[ESI] 0040EF3A INC ESI 0040EF3B MOV BYTE PTR DS:[EDI],AL 0040EF3D INC EDI 0040EF3E ADD EBX,EBX 0040EF40 JNZ SHORT NOTEPAD.0040EF49 0040EF42 MOV EBX,DWORD PTR DS:[ESI] ; 跳到这里 0040EF44 SUB ESI,-4 0040EF47 ADC EBX,EBX 0040EF49 JB SHORT NOTEPAD.0040EF38 ; 往回跳 不能跳 0040EF4B MOV EAX,1 ; 点这F4 0040EF50 ADD EBX,EBX 0040EF52 JNZ SHORT NOTEPAD.0040EF5B ; 跳到40EF5B 0040EF54 MOV EBX,DWORD PTR DS:[ESI] 0040EF56 SUB ESI,-4 0040EF59 ADC EBX,EBX 0040EF5B ADC EAX,EAX ; 来到这里,继续走 0040EF5D ADD EBX,EBX 0040EF5F JNB SHORT NOTEPAD.0040EF50 0040EF61 JNZ SHORT NOTEPAD.0040EF6C ; 继续跳到40EF6C 0040EF63 MOV EBX,DWORD PTR DS:[ESI] 0040EF65 SUB ESI,-4 0040EF68 ADC EBX,EBX 0040EF6A JNB SHORT NOTEPAD.0040EF50 0040EF6C XOR ECX,ECX ; 跳到这了,继续 0040EF6E SUB EAX,3 0040EF71 JB SHORT NOTEPAD.0040EF80 ; 继续跳40EF80 0040EF73 SHL EAX,8 0040EF76 MOV AL,BYTE PTR DS:[ESI] 0040EF78 INC ESI 0040EF79 XOR EAX,FFFFFFFF 0040EF7C JE SHORT NOTEPAD.0040EFF2 0040EF7E MOV EBP,EAX 0040EF80 ADD EBX,EBX ; 到这了,继续 0040EF82 JNZ SHORT NOTEPAD.0040EF8B ; 继续跳40EF8B 0040EF84 MOV EBX,DWORD PTR DS:[ESI] 0040EF86 SUB ESI,-4 0040EF89 ADC EBX,EBX 0040EF8B ADC ECX,ECX ; 到这,继续 0040EF8D ADD EBX,EBX 0040EF8F JNZ SHORT NOTEPAD.0040EF98 ; 跳40EF98 0040EF91 MOV EBX,DWORD PTR DS:[ESI] 0040EF93 SUB ESI,-4 0040EF96 ADC EBX,EBX 0040EF98 ADC ECX,ECX ; 到这里 0040EF9A JNZ SHORT NOTEPAD.0040EFBC ; 跳40EFBC 0040EF9C INC ECX 0040EF9D ADD EBX,EBX 0040EF9F JNZ SHORT NOTEPAD.0040EFA8 0040EFA1 MOV EBX,DWORD PTR DS:[ESI] 0040EFA3 SUB ESI,-4 0040EFA6 ADC EBX,EBX 0040EFA8 ADC ECX,ECX 0040EFAA ADD EBX,EBX 0040EFAC JNB SHORT NOTEPAD.0040EF9D 0040EFAE JNZ SHORT NOTEPAD.0040EFB9 0040EFB0 MOV EBX,DWORD PTR DS:[ESI] 0040EFB2 SUB ESI,-4 0040EFB5 ADC EBX,EBX 0040EFB7 JNB SHORT NOTEPAD.0040EF9D 0040EFB9 ADD ECX,2 0040EFBC CMP EBP,-0D00 ; 到这里 0040EFC2 ADC ECX,1 0040EFC5 LEA EDX,DWORD PTR DS:[EDI+EBP] 0040EFC8 CMP EBP,-4 0040EFCB JBE SHORT NOTEPAD.0040EFDC 0040EFCD MOV AL,BYTE PTR DS:[EDX] 0040EFCF INC EDX 0040EFD0 MOV BYTE PTR DS:[EDI],AL 0040EFD2 INC EDI 0040EFD3 DEC ECX 0040EFD4 JNZ SHORT NOTEPAD.0040EFCD ; 这个是往回跳 不能跳 0040EFD6 JMP NOTEPAD.0040EF3E ; 这个也往会跳,也不能跳 0040EFDB NOP 0040EFDC MOV EAX,DWORD PTR DS:[EDX] ; 点这里F4 0040EFDE ADD EDX,4 0040EFE1 MOV DWORD PTR DS:[EDI],EAX 0040EFE3 ADD EDI,4 0040EFE6 SUB ECX,4 0040EFE9 JA SHORT NOTEPAD.0040EFDC 0040EFEB ADD EDI,ECX 0040EFED JMP NOTEPAD.0040EF3E ; 往会跳 不跳 0040EFF2 POP ESI ; 点这里F4 0040EFF3 MOV EDI,ESI 0040EFF5 MOV ECX,0DD 0040EFFA MOV AL,BYTE PTR DS:[EDI] 0040EFFC INC EDI 0040EFFD SUB AL,0E8 0040EFFF CMP AL,1 0040F001 JA SHORT NOTEPAD.0040EFFA ; 往会跳 不跳 0040F003 CMP BYTE PTR DS:[EDI],0 0040F006 JNZ SHORT NOTEPAD.0040EFFA ; 这里也往回跳 0040F008 MOV EAX,DWORD PTR DS:[EDI] ; 直接点这里F4 0040F00A MOV BL,BYTE PTR DS:[EDI+4] 0040F00D SHR AX,8 0040F011 ROL EAX,10 0040F014 XCHG AH,AL 0040F016 SUB EAX,EDI 0040F018 SUB BL,0E8 0040F01B ADD EAX,ESI 0040F01D MOV DWORD PTR DS:[EDI],EAX 0040F01F ADD EDI,5 0040F022 MOV EAX,EBX 0040F024 LOOPD SHORT NOTEPAD.0040EFFF ; 这是一个循环,跳出它 0040F026 LEA EDI,DWORD PTR DS:[ESI+C000] ; 点这里F4 0040F02C MOV EAX,DWORD PTR DS:[EDI] 0040F02E OR EAX,EAX 0040F030 JE SHORT NOTEPAD.0040F06E 0040F032 MOV EBX,DWORD PTR DS:[EDI+4] 0040F035 LEA EAX,DWORD PTR DS:[EAX+ESI+1> 0040F03C ADD EBX,ESI 0040F03E PUSH EAX 0040F03F ADD EDI,8 0040F042 CALL DWORD PTR DS:[ESI+12448] 0040F048 XCHG EAX,EBP 0040F049 MOV AL,BYTE PTR DS:[EDI] 0040F04B INC EDI 0040F04C OR AL,AL 0040F04E JE SHORT NOTEPAD.0040F02C 0040F050 MOV ECX,EDI 0040F052 PUSH EDI 0040F053 DEC EAX 0040F054 REPNE SCAS BYTE PTR ES:[EDI] 0040F056 PUSH EBP 0040F057 CALL DWORD PTR DS:[ESI+1244C] 0040F05D OR EAX,EAX 0040F05F JE SHORT NOTEPAD.0040F068 0040F061 MOV DWORD PTR DS:[EBX],EAX 0040F063 ADD EBX,4 0040F066 JMP SHORT NOTEPAD.0040F049 ; 不能跳 0040F068 CALL DWORD PTR DS:[ESI+12450] 0040F06E POPAD ; 关键点 对应 PUSHAD 入口就在附近 F4点这里 0040F06F JMP NOTEPAD.004010CC ; 跳到入口点 地址大跨度跳跃 40FXXX跳到了401XXX => 004010CC PUSH EBP ; 入口点OEP
程序加壳段地址一直在0040FXXX突然跳转到00401XXX段 跨段跳跃时,一般都是在内存中脱壳完毕, 准备运行程序,手动脱壳就是要在入口将程序Dump出来。 转到入口时一般都有Popad语句和开始的PUSHAD对应。
入口点OEP:4010CC好我们在这里呢 前往4010草草然后点击鼠标右键点脱壳在当前的进程就脱壳成功了。 第三步:我们用ImportREC这个工具对脱壳的记事本修复一下。保证程序能正常运行。 第四步:我们用LordPE v1.4对原文件进行减肥。 第五步:再次检查是否有壳。
|