我爱电脑技术论坛's Archiver

炉火纯青 发表于 2008-6-3 11:02

手动对软件脱壳教程下载

大家好我是kcarhcU ^)a6T-ku4k.m)Q

&Z%Qz/~ Q9y8e/{-D 很高兴能再次给大家讲课
#K0]cE N?-h3Q1F 4i(kB Sr;MbQ
今天要讲的是
Rw lH0t ]8BN p)t {7Iy*kOpA`
零起点教你手动脱壳
{tN$U \P(o.yp
;~-@CR R&Ku 先介绍一下今天的主角
~V#W)i V)u4k 加了upx壳的win98的记事本dG z1a h1yO%P
uCVu9u%EA,Gwi
手动脱壳
+t7DK*h Z'\E.R nD$U)z*~m,D
第一步:寻找OEP(Original Entry Point)
H7Y4Z}aq.RZ4X'^ Original Entry Point
7H q U(u~/d el5r 最初的   入口  点
}UK7_"e*Y 我们把OEP翻译过来就是入口点
D3`_'y Og
Of9rA o3p h 寻找OEP分自动和手动`%R2f-n3},|m UL;}
我们先讲手动
}_:N;HF
3uy @m2Z?%vCb.q 这次我们用到的软件是OLLYDBG
2x/N5pH.F,@ 上期介绍了 这次就不说 G0?]g9x
总之功能是一个强大的调试器{fA ok
yI!z d)d'B
b;H+M e%\
打开OLLYDBGvc7[ AE*`!a-zwm
/H!I5WIH-B2hE
0040EF20 >PUSHAD                          ; 这里是UPX壳的入口 一般UPX的入口都是PUSHAD 之所以把这个告诉大家 为了在大家遇到 多重壳的时候 做准备
5X9s!Qau"n6b8w u6}&N 0040EF21  MOV ESI,NOTEPAD.0040C015'A.puB4| @.|
0040EF26  LEA EDI,DWORD PTR DS:[ESI+FFFF4>
h)G+g$HB8@ 0040EF2C  PUSH EDIUx6X1Q3E*[
0040EF2D  OR EBP,FFFFFFFF
5K KeQTKZ 0040EF30  JMP SHORT NOTEPAD.0040EF42      ; 跳40EF42taZGJ h
0040EF32  NOP
5W/k;@@l 0040EF33  NOPk W3]_G(UU(`9^|
0040EF34  NOP9Y-Uz6{#C k/R
0040EF35  NOP
i9G:\4G2\y^ Y C{ 0040EF36  NOP8f0]$lJg"J7Wz-h%h`
0040EF37  NOP
e~ eI)Uh#v,r 0040EF38  MOV AL,BYTE PTR DS:[ESI]
1P,z(AxKQ 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
,d9r1edagc^2U 0040EF40  JNZ SHORT NOTEPAD.0040EF49
;E5bv3U`$XO}2Q 0040EF42  MOV EBX,DWORD PTR DS:[ESI]      ; 跳到这里
,f0]-x K(]C4E 0040EF44  SUB ESI,-40A7j;Er*g-b `
0040EF47  ADC EBX,EBXP"qhvd }8O
0040EF49  JB SHORT NOTEPAD.0040EF38       ; 往回跳 不能跳
;@_%~d3jy 0040EF4B  MOV EAX,1                       ; 点这F4Zsr,u-Jz
0040EF50  ADD EBX,EBX?by[K
0040EF52  JNZ SHORT NOTEPAD.0040EF5B      ; 跳到40EF5B
f K {N6G;JoF 0040EF54  MOV EBX,DWORD PTR DS:[ESI]!m'A%N1hyF8j(F6D
0040EF56  SUB ESI,-4)M0yO#q:}7U
0040EF59  ADC EBX,EBX#Y4KU {8hSP
0040EF5B  ADC EAX,EAX                     ; 来到这里,继续走kLP4I-c ~P@
0040EF5D  ADD EBX,EBX7Et,}$P:u:b N
0040EF5F  JNB SHORT NOTEPAD.0040EF50
Z,? g|-Vlu@@ 0040EF61  JNZ SHORT NOTEPAD.0040EF6C      ; 继续跳到40EF6C
{\C1l6z ^*v 0040EF63  MOV EBX,DWORD PTR DS:[ESI]
u)N3Q%q$d1JC#V 0040EF65  SUB ESI,-4
f~0{ X6^&gX CN 0040EF68  ADC EBX,EBXLi$KCN5w o:I7J't6t J
0040EF6A  JNB SHORT NOTEPAD.0040EF50
%{'U c)m9HE4w:{*Q 0040EF6C  XOR ECX,ECX                     ; 跳到这了,继续T4X&S#\b(Sl6d
0040EF6E  SUB EAX,3
H"L{3L+[:rKL*j2s5gJ 0040EF71  JB SHORT NOTEPAD.0040EF80       ; 继续跳40EF80
_R9J S)v^7Q+p5Y'y$Q 0040EF73  SHL EAX,8)ebP2n#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
3Y e'h\4I"J 0040EF7E  MOV EBP,EAX
%Wa o\-e\p0q 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
1D2Mj s!PM)AN!C 0040EF89  ADC EBX,EBXEA,x R:LS%Xa
0040EF8B  ADC ECX,ECX                     ; 到这,继续
#r#zEF*wh 0040EF8D  ADD EBX,EBX:}4cN{Ff
0040EF8F  JNZ SHORT NOTEPAD.0040EF98      ; 跳40EF98
iwE'l4[fW 0040EF91  MOV EBX,DWORD PTR DS:[ESI]
6UM-fJ2^k}!s7v 0040EF93  SUB ESI,-4
i1eQ,`@M*}zs 0040EF96  ADC EBX,EBX.H{sdS:L(P
0040EF98  ADC ECX,ECX                     ; 到这里 Tq6Y)J)\7}
0040EF9A  JNZ SHORT NOTEPAD.0040EFBC      ; 跳40EFBC
2Z SSrdMbD 0040EF9C  INC ECX
q#xt%\wc7P;p 0040EF9D  ADD EBX,EBX
m Dtf^c6[w 0040EF9F  JNZ SHORT NOTEPAD.0040EFA8F2mWx2W/u'B CN
0040EFA1  MOV EBX,DWORD PTR DS:[ESI]bz+lrg~@$U
0040EFA3  SUB ESI,-4
2J2jt2H Jk u 0040EFA6  ADC EBX,EBX;Erf!NI,_
0040EFA8  ADC ECX,ECX
;YSM\}/p5[k"H)n 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]
^!dv bi+`^ 0040EFB2  SUB ESI,-4
{)u*L\F+]Z 0040EFB5  ADC EBX,EBX
n;CM/_U,a8^ST 0040EFB7  JNB SHORT NOTEPAD.0040EF9D#e"P} xB6A
0040EFB9  ADD ECX,2 D }(fBxM)R
0040EFBC  CMP EBP,-0D00                   ; 到这里
YL[-M-A"^7~m 0040EFC2  ADC ECX,1,Zq }'lp%lt$a
0040EFC5  LEA EDX,DWORD PTR DS:[EDI+EBP]
(YgM]U 0040EFC8  CMP EBP,-4
"?D ixh1Y k 0040EFCB  JBE SHORT NOTEPAD.0040EFDC
*S6};mp@j RR 0040EFCD  MOV AL,BYTE PTR DS:[EDX]
_x/E Q O8m-U*F!Q0\ E 0040EFCF  INC EDX
S{jv2? 0040EFD0  MOV BYTE PTR DS:[EDI],AL;a,g dfY"S~
0040EFD2  INC EDI
a WJbd 0040EFD3  DEC ECX
K}gM"J1rO-H!cQ | 0040EFD4  JNZ SHORT NOTEPAD.0040EFCD      ; 这个是往回跳 不能跳b9HF'f4LFN/u0p%w
0040EFD6  JMP NOTEPAD.0040EF3E            ; 这个也往会跳,也不能跳
,x(fR{Q 0040EFDB  NOPT5|N f iRV0D@
0040EFDC  MOV EAX,DWORD PTR DS:[EDX]      ; 点这里F4
+B1uP U-s8m(z 0040EFDE  ADD EDX,4
cB(h#m&q 0040EFE1  MOV DWORD PTR DS:[EDI],EAX
lK`w%`;Jx-A y#s8E 0040EFE3  ADD EDI,4R)X&G4A Y
0040EFE6  SUB ECX,4
\)v4Uly*Cz 0040EFE9  JA SHORT NOTEPAD.0040EFDC
s6ynrPcg`V 0040EFEB  ADD EDI,ECX
3i{/gN@ 0040EFED  JMP NOTEPAD.0040EF3E            ; 往会跳 不跳
6auX_(@-r0P 0040EFF2  POP ESI                         ; 点这里F4E"N'_3b8?L{R7K
0040EFF3  MOV EDI,ESI
\6gwwx*M_xu!Yz&_ 0040EFF5  MOV ECX,0DD
"r7Tz5\I^.G-G\ 0040EFFA  MOV AL,BYTE PTR DS:[EDI]
F&@ZK {$k{"c;w 0040EFFC  INC EDI
n2A b/v7q1k uV 0040EFFD  SUB AL,0E8d!zlYc]_IYa
0040EFFF  CMP AL,1
R%sb e;};F 0040F001  JA SHORT NOTEPAD.0040EFFA       ; 往会跳 不跳
N,f/U#qU Wk 0040F003  CMP BYTE PTR DS:[EDI],0
YXaG{&jm 0040F006  JNZ SHORT NOTEPAD.0040EFFA      ; 这里也往回跳JLrX4f#{)M2V*@
0040F008  MOV EAX,DWORD PTR DS:[EDI]      ; 直接点这里F4N*nO2s^6{3l:O O
0040F00A  MOV BL,BYTE PTR DS:[EDI+4]l5g)cV/h&{A
0040F00D  SHR AX,8
i4|q*w!P 0040F011  ROL EAX,10
2J6f^U @R U 0040F014  XCHG AH,AL
CsyiMg@$J3a6` 0040F016  SUB EAX,EDI
~0U-g$Xs? 0040F018  SUB BL,0E8j6|7LlauE~6e
0040F01B  ADD EAX,ESI
Y s [3|$| 0040F01D  MOV DWORD PTR DS:[EDI],EAX
hC]`^{P,dY2I 0040F01F  ADD EDI,5
d$Ed,{e6C)o,J'c 0040F022  MOV EAX,EBXxi!L2[Ki
0040F024  LOOPD SHORT NOTEPAD.0040EFFF    ; 这是一个循环,跳出它U"R.H ?0r2ZxF
0040F026  LEA EDI,DWORD PTR DS:[ESI+C000] ; 点这里F4
jsg UH 0040F02C  MOV EAX,DWORD PTR DS:[EDI]
iS3{f'J 0040F02E  OR EAX,EAX
7B$C4^;J J+h 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
8IA&PZL|$cR*r 0040F03F  ADD EDI,8
:V*o&sU!d#Fv 0040F042  CALL DWORD PTR DS:[ESI+12448]O{2`3vPU:@
0040F048  XCHG EAX,EBP
,]C ?&uw0N 0040F049  MOV AL,BYTE PTR DS:[EDI]
d H7z-t-d:rYt 0040F04B  INC EDI+FN;Q$rd/i+d
0040F04C  OR AL,ALK]/{3X r.F
0040F04E  JE SHORT NOTEPAD.0040F02C
HJ2^9Q4@,L;n3F.E 0040F050  MOV ECX,EDI
;~%i)]4^2?d6[.g 0040F052  PUSH EDI
_9TngT ] 0040F053  DEC EAX
KY8cEwR WF2u 0040F054  REPNE SCAS BYTE PTR ES:[EDI]
U/c5@2r ].a8s:A3zK5G7t 0040F056  PUSH EBP
0T"B,qpxL 0040F057  CALL DWORD PTR DS:[ESI+1244C]
X F&Yeb 0040F05D  OR EAX,EAX
O%H+mF6Y9\ 0040F05F  JE SHORT NOTEPAD.0040F068I#Gg2c6^4G
0040F061  MOV DWORD PTR DS:[EBX],EAX
8zX x)r'v 0040F063  ADD EBX,4x7x+{^`P
0040F066  JMP SHORT NOTEPAD.0040F049      ; 不能跳
)k,qKl AscQ] 0040F068  CALL DWORD PTR DS:[ESI+12450]:O,kZ_Yt#Gr ^0@8IN
0040F06E  POPAD                           ; 关键点 对应 PUSHAD 入口就在附近 F4点这里
5W4J#{(k#PP5lDDyy 0040F06F  JMP NOTEPAD.004010CC            ; 跳到入口点 地址大跨度跳跃  40FXXX跳到了401XXX!?,G{W{7|g'Qd;X
=>{X&\'zdAE'_4}
004010CC  PUSH EBP                        ; 入口点OEP0{FdR0NV
"}.v7N t']4? q J]~ Z
程序加壳段地址一直在0040FXXX突然跳转到00401XXX段eL0L&H@B\$S-}
跨段跳跃时,一般都是在内存中脱壳完毕,v._]1_#K {xf
准备运行程序,手动脱壳就是要在入口将程序Dump出来。;bp8en7Q/l6f
转到入口时一般都有Popad语句和开始的PUSHAD对应。
Z g4nP#E!\
?m9Jj2j c&o 入口点OEP:4010CC或10CC8s(T2yPsV]6?L

n@h&bD d 这里说到4010CC给大家说明一下地址#F8]erqr'Dk
计算机中的地址有这些
F'v-A'w$m Tn(|4B ]&O
VA:Virtual Address=虚拟地址      比如4010CC这些都是 虚拟地址
OSHSdl R    虚拟的  地址4b _#i4Z1@

8hz"lHB;P/U%` o#D1Nn RVA:Relative Virtual Address=相对虚拟地址         相对虚拟地址 就是比如入口点 我们可以说成10CC
)sfF&hDr c]O     相对的   虚拟的  地址:zxg3O3LdMp
wh$b+\ D o$o
IB:ImageBass=基址 这个程序的基址就是 400000
TGUf)VT {1o-Hy$jjk-w*W6^4oM
RVA=VA-IB=虚拟地址-基址=相对虚拟地址
9{.vv6K kBY I
(em&u2EFC Offset:偏移量 在一些16位进制的编辑器中左边显示的地址
r%j.z.Z|3} iM dO-| 8eH%zE w~

{Nk'Jl$ZI@P*Bam 好了 入口点 我们通过手动找到了 下面来 自动的找 a#kZS5g e9_
Iz/t%b3^
自动就是用专门的入口点检测软件
$tZ-h9oW]%GK Pe-Scan v3.31
U8n$j A*pZ\%Hr~+Mw 我们直接 就可以看到 OEP:10CC *r'O`)J'T/At
他这里用的就是 RVA相对虚拟地址,?{9J8|:gL,ByPeL
工具就是比我们的速度快sV0w-nUs!L
不过我教给大家一个快速找UPX入口点的方法(s~pNWYC]]Z
ollydbg载入->搜索POPAD(去掉整个块段,也就是只向下搜索)%R7s Y]A N"H2J
看到POPAD下面的Jmp了吗 点那里F4 然后就到入口点了
#Wv/jvX"J:h,g#f/~ z
T@)D VD Z7Lx~A H n} m
好了 第一步OVER
cY/WcWb$@ c?Q#^k
`-~^ D"}5Xgpz%d 步骤二: Xh0J(z1^ n ~TO
转储(dump)程序;FJ3o$Wh0K
n4YBM!}0Lmc
返回OLLYDBG
Ktbx] o"s7S/S
RgzyA&jL;y DUMP文件8P!Br-LW|[3~+zd]:F

)It,_Xq Yl 试运行DUMP出来的文件 可以运行 r5Tj(aq4x
这样我们就免去 步骤三:修复引入函数表(Import Table)e9Vic r*I3vt'`
而且也是稍微难点的东西 因为大家都是第一次 学脱壳 就不讲这个了d\ n9{4p
希望大家可别打我
4~"lLM#Og.tR {z5g$[(O
接着说下 快速脱掉UPX壳 就是在快速找到入口点的方法后接着 DUMP就可以了
"K]hIe
+o"uDQ S8x 虽然不讲步骤三了 但是还是介绍一下
+{z+W/yQ z7`
ca.cg*B Q4~qg1Ae 步骤三:修复引入函数表(Import Table)i^*H5``"gF

'N8K4i(u@`,Jz 这里要用到的工具是专业级的修复软件Import REConstructor v1.6 FINALym ^?Vy?Ta(P m
)qE0V!~,|z
一般就是修正入口点 因为如果入口点错误 整个程序的的引入函数表就都会错 这样就不能正确调用控件之类的而导致程序不能正确进行j%LWBf

"Z(n%z/|n Xi6d 接着 我们进行步骤四
#f0_ `R(Ofc
!Bk;};l1E#TP-f)Nu 步骤四:优化程序
7J si;Yz I:z_3x 3GlpmV
所谓优化程序就是在我们脱壳的时候 会将内存中一些没有的东西DUMP出来1rpzX!y&|/u3pI
我们需要对脱壳出来的程序优化
_ {)j0i~jc? 就是让他更精巧点 但这个精巧不是压缩它 类似 打扫房间吧 整理有用的 扔掉没用的
&Z }:H$}r&x O 这里我们用到的软件是#`{B,KjsM[

4PS s%m0s6xm;X6P \ LordPE
?I5Fu(HR$\~^f*YE
V1i]1J`$Vts,B-J3u? 使用很简单 5^H5JH? emY
8S[ [DUz
重建PE->选择我们刚刚脱过的程序 OKsO6Zd.HV kN3uH

sK rTS#o u(lI 这样之后 很多人都认为就OK了
&z3x)u0K)brK@,@ 其实还应该有一步
l+Kh^l+Q%S6u0C7] 那就是 7n#UR _@S8^u8l

oUMyi z\ ~ 步骤五:检查+t!|T kLup
检查的目的是防止脱壳 不彻底 5`)?$m5S!gt(i-w
一般是在脱多重壳的时候 会出现现象脱壳不彻底Z J3fs"a0WK
检查一般我可用PEID 这个软件再检查一下就可以了] @_Q4iz

0K(nq d)|0GqI?#I:W Microsoft Visual C++ 6.0 SPx Method 1
T(Q7[t*ktT5S
SBKq/xKE 看到了notepad的编译程序
R'N2k3dW 好了结束了/J.X\{9H!WNt

JX3v {'Zy5xm
fV+Rq9N"hu8L9{D 教程下载地址:/Z6Ag}8PB(v
[color=Red][size=6]点击此处下载[/size][/color]

chekq7833696 发表于 2008-6-6 14:01

就单单只有一个脱壳的例子啊

页: [1]
   

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.