手动对软件脱壳教程下载
大家好我是kcarhcU ^)a6T-ku4k.m)Q很高兴能再次给大家讲课
4i(kB Sr;MbQ
今天要讲的是
{7Iy*kOpA`
零起点教你手动脱壳
先介绍一下今天的主角
加了upx壳的win98的记事本dG z1ah1yO%P
uCVu9u%EA,Gwi
手动脱壳
nD$U)z*~m,D
第一步:寻找OEP(Original Entry Point)
Original Entry Point
最初的 入口 点
我们把OEP翻译过来就是入口点
寻找OEP分自动和手动`%R2f-n3},|m UL;}
我们先讲手动
这次我们用到的软件是OLLYDBG
上期介绍了 这次就不说G0?]g9x
总之功能是一个强大的调试器{fA ok
yI!z d)d'B
b;H+Me%\
打开OLLYDBGvc7[ AE*`!a-zwm
/H!I5WIH-B2hE
0040EF20 >PUSHAD ; 这里是UPX壳的入口 一般UPX的入口都是PUSHAD 之所以把这个告诉大家 为了在大家遇到 多重壳的时候 做准备
0040EF21 MOV ESI,NOTEPAD.0040C015'A.puB4| @.|
0040EF26 LEA EDI,DWORD PTR DS:[ESI+FFFF4>
0040EF2C PUSH EDIUx6X1Q3E*[
0040EF2D OR EBP,FFFFFFFF
0040EF30 JMP SHORT NOTEPAD.0040EF42 ; 跳40EF42taZGJh
0040EF32 NOP
0040EF33 NOPkW3]_G(UU(`9^|
0040EF34 NOP9Y-Uz6{#C k/R
0040EF35 NOP
0040EF36 NOP8f0]$lJg"J7Wz-h%h`
0040EF37 NOP
0040EF38 MOV AL,BYTE PTR DS:[ESI]
0040EF3A INC ESI OFH^!Yg)o*L E
0040EF3B MOV BYTE PTR DS:[EDI],AL0dP,W` q x o4Q{4m
0040EF3D INC EDIfJ6w9EkX
0040EF3E ADD EBX,EBX
0040EF40 JNZ SHORT NOTEPAD.0040EF49
0040EF42 MOV EBX,DWORD PTR DS:[ESI] ; 跳到这里
0040EF44 SUB ESI,-40A7j;Er*g-b `
0040EF47 ADC EBX,EBXP"qhvd }8O
0040EF49 JB SHORT NOTEPAD.0040EF38 ; 往回跳 不能跳
0040EF4B MOV EAX,1 ; 点这F4Zsr,u-Jz
0040EF50 ADD EBX,EBX?by [K
0040EF52 JNZ SHORT NOTEPAD.0040EF5B ; 跳到40EF5B
0040EF54 MOV EBX,DWORD PTR DS:[ESI]!m'A%N1h yF8j(F6D
0040EF56 SUB ESI,-4)M0yO#q:}7U
0040EF59 ADC EBX,EBX#Y4KU {8hSP
0040EF5B ADC EAX,EAX ; 来到这里,继续走kLP4I-c ~P@
0040EF5D ADD EBX,EBX7E t,}$P:u:bN
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,EBXLi$KCN5w o:I7J't6tJ
0040EF6A JNB SHORT NOTEPAD.0040EF50
0040EF6C XOR ECX,ECX ; 跳到这了,继续T4X&S#\b(Sl6d
0040EF6E SUB EAX,3
0040EF71 JB SHORT NOTEPAD.0040EF80 ; 继续跳40EF80
0040EF73 SHL EAX,8)eb P2n#yiAT
0040EF76 MOV AL,BYTE PTR DS:[ESI]"lZRl+l|sN
0040EF78 INC ESIC&?m[NL
0040EF79 XOR EAX,FFFFFFFF*PV~7o$b[
0040EF7C JE SHORT NOTEPAD.0040EFF2
0040EF7E MOV EBP,EAX
0040EF80 ADD EBX,EBX ; 到这了,继续AW^3b @
0040EF82 JNZ SHORT NOTEPAD.0040EF8B ; 继续跳40EF8Bo-Y(U[ oO3`Ppe
0040EF84 MOV EBX,DWORD PTR DS:[ESI]fEN:y9pfF:V/E
0040EF86 SUB ESI,-4
0040EF89 ADC EBX,EBXEA,x R:LS%Xa
0040EF8B ADC ECX,ECX ; 到这,继续
0040EF8D ADD EBX,EBX:}4cN{Ff
0040EF8F JNZ SHORT NOTEPAD.0040EF98 ; 跳40EF98
0040EF91 MOV EBX,DWORD PTR DS:[ESI]
0040EF93 SUB ESI,-4
0040EF96 ADC EBX,EBX.H{sd S:L(P
0040EF98 ADC ECX,ECX ; 到这里 Tq6Y)J)\7}
0040EF9A JNZ SHORT NOTEPAD.0040EFBC ; 跳40EFBC
0040EF9C INC ECX
0040EF9D ADD EBX,EBX
0040EF9F JNZ SHORT NOTEPAD.0040EFA8F2mWx2W/u'B CN
0040EFA1 MOV EBX,DWORD PTR DS:[ESI]bz+lrg~@$U
0040EFA3 SUB ESI,-4
0040EFA6 ADC EBX,EBX;Erf!NI,_
0040EFA8 ADC ECX,ECX
0040EFAA ADD EBX,EBX ]7J"u lK%O ~
0040EFAC JNB SHORT NOTEPAD.0040EF9D5K;hC8O%X h'P
0040EFAE JNZ SHORT NOTEPAD.0040EFB9p@R5F LlKu
0040EFB0 MOV EBX,DWORD PTR DS:[ESI]
0040EFB2 SUB ESI,-4
0040EFB5 ADC EBX,EBX
0040EFB7 JNB SHORT NOTEPAD.0040EF9D#e"P} xB6A
0040EFB9 ADD ECX,2 D }(fBxM)R
0040EFBC CMP EBP,-0D00 ; 到这里
0040EFC2 ADC ECX,1,Zq }'lp%l t$a
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;a,g dfY"S~
0040EFD2 INC EDI
0040EFD3 DEC ECX
0040EFD4 JNZ SHORT NOTEPAD.0040EFCD ; 这个是往回跳 不能跳b9HF'f4LFN/u0p%w
0040EFD6 JMP NOTEPAD.0040EF3E ; 这个也往会跳,也不能跳
0040EFDB NOPT5|Nf iRV0D@
0040EFDC MOV EAX,DWORD PTR DS:[EDX] ; 点这里F4
0040EFDE ADD EDX,4
0040EFE1 MOV DWORD PTR DS:[EDI],EAX
0040EFE3 ADD EDI,4R)X&G4A Y
0040EFE6 SUB ECX,4
0040EFE9 JA SHORT NOTEPAD.0040EFDC
0040EFEB ADD EDI,ECX
0040EFED JMP NOTEPAD.0040EF3E ; 往会跳 不跳
0040EFF2 POP ESI ; 点这里F4E"N'_3b8?L{R7K
0040EFF3 MOV EDI,ESI
0040EFF5 MOV ECX,0DD
0040EFFA MOV AL,BYTE PTR DS:[EDI]
0040EFFC INC EDI
0040EFFD SUB AL,0E8d!zlYc]_IYa
0040EFFF CMP AL,1
0040F001 JA SHORT NOTEPAD.0040EFFA ; 往会跳 不跳
0040F003 CMP BYTE PTR DS:[EDI],0
0040F006 JNZ SHORT NOTEPAD.0040EFFA ; 这里也往回跳JLrX4f#{)M2V*@
0040F008 MOV EAX,DWORD PTR DS:[EDI] ; 直接点这里F4N*nO2s^6{3l:OO
0040F00A MOV BL,BYTE PTR DS:[EDI+4]l5g)cV/h&{A
0040F00D SHR AX,8
0040F011 ROL EAX,10
0040F014 XCHG AH,AL
0040F016 SUB EAX,EDI
0040F018 SUB BL,0E8j6|7LlauE~6e
0040F01B ADD EAX,ESI
0040F01D MOV DWORD PTR DS:[EDI],EAX
0040F01F ADD EDI,5
0040F022 MOV EAX,EBXxi!L2[Ki
0040F024 LOOPD SHORT NOTEPAD.0040EFFF ; 这是一个循环,跳出它U"R.H ?0r2ZxF
0040F026 LEA EDI,DWORD PTR DS:[ESI+C000] ; 点这里F4
0040F02C MOV EAX,DWORD PTR DS:[EDI]
0040F02E OR EAX,EAX
0040F030 JE SHORT NOTEPAD.0040F06E7q!^4t z,R(eVu:s
0040F032 MOV EBX,DWORD PTR DS:[EDI+4]Ua+H2sc ]s
0040F035 LEA EAX,DWORD PTR DS:[EAX+ESI+1>;Q(z&?'[_
0040F03C ADD EBX,ESIZk%^_ H {v
0040F03E PUSH EAX
0040F03F ADD EDI,8
0040F042 CALL DWORD PTR DS:[ESI+12448]O{2`3vPU:@
0040F048 XCHG EAX,EBP
0040F049 MOV AL,BYTE PTR DS:[EDI]
0040F04B INC EDI+FN;Q$rd/i+d
0040F04C OR AL,ALK]/{3X r.F
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.0040F068I#Gg2c6^4G
0040F061 MOV DWORD PTR DS:[EBX],EAX
0040F063 ADD EBX,4x7x+{^`P
0040F066 JMP SHORT NOTEPAD.0040F049 ; 不能跳
0040F068 CALL DWORD PTR DS:[ESI+12450]:O,kZ_Yt#Gr ^0@8I N
0040F06E POPAD ; 关键点 对应 PUSHAD 入口就在附近 F4点这里
0040F06F JMP NOTEPAD.004010CC ; 跳到入口点 地址大跨度跳跃 40FXXX跳到了401XXX!?,G{ W{7|g'Qd;X
=>{X&\'zd AE'_4}
004010CC PUSH EBP ; 入口点OEP0{FdR0NV
"}.v7N t']4?qJ]~Z
程序加壳段地址一直在0040FXXX突然跳转到00401XXX段eL0L&H@B\$S-}
跨段跳跃时,一般都是在内存中脱壳完毕,v._]1_#K {xf
准备运行程序,手动脱壳就是要在入口将程序Dump出来。;bp8en7Q/l6f
转到入口时一般都有Popad语句和开始的PUSHAD对应。
入口点OEP:4010CC或10CC8s(T2y PsV]6?L
这里说到4010CC给大家说明一下地址#F8]erqr'Dk
计算机中的地址有这些
Tn(|4B]&O
VA:Virtual Address=虚拟地址 比如4010CC这些都是 虚拟地址
虚拟的 地址4b_#i4Z1@
RVA:Relative Virtual Address=相对虚拟地址 相对虚拟地址 就是比如入口点 我们可以说成10CC
相对的 虚拟的 地址:zxg3O3LdMp
wh$b+\Do$o
IB:ImageBass=基址 这个程序的基址就是 400000
{1o-Hy$jjk-w*W6^4oM
RVA=VA-IB=虚拟地址-基址=相对虚拟地址
Offset:偏移量 在一些16位进制的编辑器中左边显示的地址
8eH%zEw~
好了 入口点 我们通过手动找到了 下面来 自动的找a#kZS5g e9_
Iz/t%b3^
自动就是用专门的入口点检测软件
Pe-Scan v3.31
我们直接 就可以看到 OEP:10CC *r'O`)J'T/At
他这里用的就是 RVA相对虚拟地址,?{9J8|:gL,ByPeL
工具就是比我们的速度快sV0w-nUs!L
不过我教给大家一个快速找UPX入口点的方法(s~pNWYC]]Z
ollydbg载入->搜索POPAD(去掉整个块段,也就是只向下搜索)%R7s Y]AN"H2J
看到POPAD下面的Jmp了吗 点那里F4 然后就到入口点了
Z7L x~AH n} m
好了 第一步OVER
步骤二:Xh0J(z1^ n ~TO
转储(dump)程序;FJ3o$Wh0K
n4YBM!}0Lmc
返回OLLYDBG
DUMP文件8P!Br-LW|[3~+zd]:F
试运行DUMP出来的文件 可以运行r5Tj(aq4x
这样我们就免去 步骤三:修复引入函数表(Import Table)e9Vicr*I3vt'`
而且也是稍微难点的东西 因为大家都是第一次 学脱壳 就不讲这个了d\n9{4p
希望大家可别打我
{z5g$[(O
接着说下 快速脱掉UPX壳 就是在快速找到入口点的方法后接着 DUMP就可以了
虽然不讲步骤三了 但是还是介绍一下
步骤三:修复引入函数表(Import Table)i^*H5``"gF
这里要用到的工具是专业级的修复软件Import REConstructor v1.6 FINALym ^?Vy ?Ta(P m
)qE0V!~,|z
一般就是修正入口点 因为如果入口点错误 整个程序的的引入函数表就都会错 这样就不能正确调用控件之类的而导致程序不能正确进行j%LWBf
接着 我们进行步骤四
步骤四:优化程序
3GlpmV
所谓优化程序就是在我们脱壳的时候 会将内存中一些没有的东西DUMP出来1rpzX!y&|/u3pI
我们需要对脱壳出来的程序优化
就是让他更精巧点 但这个精巧不是压缩它 类似 打扫房间吧 整理有用的 扔掉没用的
这里我们用到的软件是#`{B,K jsM [
LordPE
使用很简单 5^H5JH ? emY
8S[ [DUz
重建PE->选择我们刚刚脱过的程序 OKsO6Zd.HV kN3uH
这样之后 很多人都认为就OK了
其实还应该有一步
那就是 7n#UR_@S8^u8l
步骤五:检查+t!|T kLup
检查的目的是防止脱壳 不彻底 5`)?$m5S!gt(i-w
一般是在脱多重壳的时候 会出现现象脱壳不彻底Z J3fs"a0WK
检查一般我可用PEID 这个软件再检查一下就可以了] @_Q4iz
Microsoft Visual C++ 6.0 SPx Method 1
看到了notepad的编译程序
好了结束了/J.X\{9H!WNt
教程下载地址:/Z6Ag}8PB(v
[color=Red][size=6]点击此处下载[/size][/color] 就单单只有一个脱壳的例子啊
页:
[1]