【破解作者】 hnhuqiong
【作者邮箱】 3KKK@
【作者主页】 3KKK
【使用工具】 FLYODBG
【破解平台】 Win9x/NT/2000/XP
【软件名称】 XXXXXXXXXXXXX
【软件简介】 我们看的不是软件,是它的壳
【加壳方式】 XXXX 0.7X
【破解声明】 我是一只小菜鸟,偶得一点心得,愿与大家分享:)
--------------------------------------------------------------------------------
【破解内容】
004670D1 > 60 pushad ; 从这里到0ed是典型的伪造头
004670D2 E8 00000000 call jl.004670D7 ; 假CALL,
004670D7 5D pop ebp ;
004670D8 81ED D7000000 sub ebp,0D7 ; 取段地址
004670DE 8DB5 EE000000 lea esi,dword ptr ss:[ebp+EE] ;
004670E4 55 push ebp ; 段地址入栈(467000)
004670E5 56 push esi ; 将段地址+EE地址入栈,为后面
放解码数据,我这里是4670EE
004670E6 81C5 89110000 add ebp,1189
004670EC 55 push ebp ; 返回地址入栈(468199),也就是
跳这个CALL 其实就是一个jmp
004670ED C3 retn
此壳大量的运用了假call,当然对于大侠级别的是小菜,但是通篇用这样的
call,如果不运用花指令予以打掉,简直是自虐。这个壳运用花指令对于
ANTI-DEBUG可以说是到了极限,没有一处是可以清净的进行分析。
00468189 25 6FA78540 and eax,4085A76F
0046818E 8D3C4B lea edi,dword ptr ds:[ebx+ecx*2>; 垃圾数据,也可以
说这个是垃圾代码迷惑人的
00468191 8D92 C57FEB02 lea edx,dword ptr ds:[edx+2EB7F>; 垃圾数据
00468197 8D8E BD5D714B lea ecx,dword ptr ds:[esi+4B715>; 垃圾数据
0046819D 4F dec edi ; 垃圾数据
0046819E 8D340A lea esi,dword ptr ds:[edx+ecx] ;
004681A1 BD F9227641 mov ebp,417622F9 ; 将常数417622f9给EBP
004681A6 8B1C24 mov ebx,dword ptr ss:[esp] ; 4670ee
004681A9 8D92 A3703444 lea edx,dword ptr ds:[edx+44347>; 垃圾数据
004681AF BF DF542B32 mov edi,322B54DF ; 将常数322b54df给DI
004681B4 8D8E D1559117 lea ecx,dword ptr ds:[esi+17915>; 垃圾数据
004681BA 812B 2EB0826E sub dword ptr ds:[ebx],6E82B02E ; 计算的结果是
(458B5DEB)送CS+EE
004681C0 8D85 05AC7078 lea eax,dword ptr ss:[ebp+7870A>垃圾数据
004681C6 8D8E 9B64774D lea ecx,dword ptr ds:[esi+4D776>垃圾数据
004681CC 25 70542946 and eax,46295470 ; 垃圾数据
004681D1 4B dec ebx ;
004681D2 83EB FB sub ebx,-5 ; ebx==4670f2
004681D5 8D340A lea esi,dword ptr ds:[edx+ecx] ;
004681D8 45 inc ebp ; jl.00468189
004681D9 25 EC6A7325 and eax,25736AEC ;
004681DE 25 B21AFC7A and eax,7AFC1AB2 垃圾数据
004681E3 812B BB08217B sub dword ptr ds:[ebx],7B2108BB ; 计算的结果是(74C00B00)=>
送CS +F2处
004681E9 81C5 C6D65E6F add ebp,6F5ED6C6 ;垃圾数据
004681EF 51 push ecx ;
004681F0 59 pop ecx ; 来回推ECX 入栈出栈,垃圾
004681F1 B8 DC199E70 mov eax,709E19DC ;垃圾数据
004681F6 51 push ecx
004681F7 59 pop ecx ; 来回推ECX 入栈出栈,垃圾
004681F8 8D3C4B lea edi,dword ptr ds:[ebx+ecx*2>
004681FB 45 inc ebp ;
004681FC 4B dec ebx
004681FD 83EB FB sub ebx,-5 ; ebx=4670f6
00468200 BF ECAE113B mov edi,3B11AEEC ;垃圾数据
00468205 8D340A lea esi,dword ptr ds:[edx+ecx] ;垃圾数据
00468208 8DA8 003C3F24 lea ebp,dword ptr ds:[eax+243F3>
0046820E 8133 05602914 xor dword ptr ds:[ebx],14296005 ; 计算的结果是(5DACD4FC)
;送CS +F2处
00468214 83EB FC sub ebx,-4 ; ebx=4670fa
00468217 B9 163CA035 mov ecx,35A03C16 ;垃圾代码
0046821C 3BC1 cmp eax,ecx ;垃圾代码
0046821E B9 4B53F626 mov ecx,26F6534B ;垃圾代码
00468223 B8 3A70A84D mov eax,4DA8703A ;垃圾代码
00468228 8B03 mov eax,dword ptr ds:[ebx] ;
0046822A F7D0 not eax ;
0046822C 8903 mov dword ptr ds:[ebx],eax ; 将45ff0c送到CS +FA
0046822E 8DA8 E97B625B lea ebp,dword ptr ds:[eax+5B627>;垃圾代码
00468234 45 inc ebp ; 垃圾代码
00468235 BA FA48F310 mov edx,10F348FA ;垃圾代码
0046823A 81CA 3657683A or edx,3A685736 ;垃圾代码
00468240 45 inc ebp ; 垃圾代码
00468241 8D85 82F18C3B lea eax,dword ptr ss:[ebp+3B8CF>;垃圾代码
00468247 81D1 4C6B002B adc ecx,2B006B4C ;垃圾代码
0046824D 4B dec ebx ;
0046824E 83EB FB sub ebx,-5 ; ebx==4670fe
00468251 81C5 940D9345 add ebp,45930D94 ;垃圾代码
00468257 8B03 mov eax,dword ptr ds:[ebx] ;
00468259 F7D0 not eax
0046825B 8903 mov dword ptr ds:[ebx],eax ; 计算的结果是
(2424488b)送CS+FE
0046825D 4F dec edi ; 垃圾代码
0046825E 8D85 0DE82853 lea eax,dword ptr ss:[ebp+5328E>;垃圾代码
00468264 B9 574BFF50 mov ecx,50FF4B57 ;垃圾代码
00468269 81C5 2A6F5147 add ebp,47516F2A ;垃圾代码
0046826F 4B dec ebx ;
00468270 83EB FB sub ebx,-5 ;
00468273 25 214D0151 and eax,51014D21 ; eax==467102
00468278 BA 89E6420C mov edx,0C42E689 ;垃圾代码
0046827D 3BC1 cmp eax,ecx ;垃圾代码
0046827F 8133 9A1DD82A xor dword ptr ds:[ebx],2AD81D9A ; 计算的结果是
(8D044589)送CS+102
00468285 8D85 33DF6172 lea eax,dword ptr ss:[ebp+7261D> 垃圾代码
0046828B 81F7 78C19C1D xor edi,1D9CC178 垃圾代码
00468291 8D85 FB3FEA56 lea eax,dword ptr ss:[ebp+56EA3> 垃圾代码
00468297 83EB FC sub ebx,-4 ; ebx=CS+106
0046829A E8 02000000 call jl.004682A1 ; 虚跳CALL,花指令
004682A1 5E pop esi ; 保护现场
004682A2 81CE 4792BB22 or esi,22BB9247
004682A8 81C5 1BAB0657 add ebp,5706AB1B ; 垃圾代码
004682AE 8133 47154C49 xor dword ptr ds:[ebx],494C1547 ; 计算的结果是(0455ff65)
,送CS+10A
004682B4 8DA8 959D1C65 lea ebp,dword ptr ds:[eax+651C9D95] ; 垃圾代码
004682BA 83EB FC sub ebx,-4 ; CS+10A
004682BD 8B03 mov eax,dword ptr ds:[ebx] ;
004682BF F7D0 not eax ;
004682C1 8903 mov dword ptr ds:[ebx],eax ; 计算的结果是(55ff5600)
;送CS+10A
004682C3 8D340A lea esi,dword ptr ds:[edx+ecx] ; 垃圾代码
004682C6 BA 926B7F56 mov edx,567F6B92 ; 垃圾代码
004682CB BF 7B62BA5E mov edi,5EBA627B ; 垃圾代码
004682D0 81C5 3C34D76D add ebp,6DD7343C ; 垃圾代码
004682D6 B9 DEAFC704 mov ecx,4C7AFDE ; 垃圾代码
004682DB 4B dec ebx
004682DC 83EB FB sub ebx,-5 ; CS+10E
004682DF 3BC1 cmp eax,ecx ; 垃圾代码
004682E1 25 A981CB14 and eax,14CB81A9 ; 垃圾代码
004682E6 812B 75F8C422 sub dword ptr ds:[ebx],22C4F875 ; 计算的结果是(1c758d73)
,送CS+10E
004682EC 8DA8 E3F5B334 lea ebp,dword ptr ds:[eax+34B3F5E3] ; 垃圾代码
004682F2 BA B802F97D mov edx,7DF902B8 ; 垃圾代码
004682F7 B9 D7711D1D mov ecx,1D1D71D7 ; 垃圾代码
004682FC 4B dec ebx
004682FD 83EB FB sub ebx,-5 ; CS+112
00468300 8DA8 1A4E0E7B lea ebp,dword ptr ds:[eax+7B0E4E1A] ; 垃圾代码
00468306 B8 71037F33 mov eax,337F0371 ; 垃圾代码
0046830B 3BC1 cmp eax,ecx ; 垃圾代码
0046830D 8D92 51A10971 lea edx,dword ptr ds:[edx+7109A151] ; 垃圾代码
00468313 51 push ecx ; 垃圾代码
00468314 59 pop ecx ; CS+EE,垃圾,清空前面假CALL入的堆栈
00468315 81F7 40079F60 xor edi,609F0740 ; 垃圾代码
0046831B 812B 9B1E105D sub dword ptr ds:[ebx],5D101E9B ; 计算的结果是(55ff5056),送CS+112
00468321 BF AF102C2A mov edi,2A2C10AF ; 垃圾代码
00468326 8D8E BDEC0965 lea ecx,dword ptr ds:[esi+6509ECBD] ; 垃圾代码
0046832C F7C2 A16EF328 test edx,28F36EA1 ; 垃圾代码
00468332 B8 4A11E162 mov eax,62E1114A ; 垃圾代码
00468337 25 E2686047 and eax,476068E2 ; 垃圾代码
0046833C 83EB FC sub ebx,-4 ; CS+116
0046833F B9 E49E9030 mov ecx,30909EE4 ; 垃圾代码
00468344 8103 DF92742D add dword ptr ds:[ebx],2D7492DF ; 计算的结果是(2c458974),送CS+116
0046834A 43 inc ebx
0046834B 43 inc ebx
0046834C 43 inc ebx
0046834D 43 inc ebx ; CS+11A
0046834E BF 58506F78 mov edi,786F5058 ; 垃圾代码
00468353 81F7 DD57125B xor edi,5B1257DD ; 垃圾代码
00468359 3BC1 cmp eax,ecx ; 垃圾代码
0046835B 81F7 B6D6FF2B xor edi,2BFFD6B6 ; 垃圾代码
00468361 81CE FF4FA918 or esi,18A94FFF ; 垃圾代码
00468367 8D85 D1616900 lea eax,dword ptr ss:[ebp+6961D1] ; 垃圾代码
0046836D 4F dec edi ; 垃圾代码
0046836E 8103 33A7550A add dword ptr ds:[ebx],0A55A733 ; 计算的结果是(0068046a),送CS+11a
00468374 81F7 2A21832A xor edi,2A83212A ; 垃圾代码
0046837A 8D85 308D2C48 lea eax,dword ptr ss:[ebp+482C8D30] ; 垃圾代码
00468380 3BC1 cmp eax,ecx ; 垃圾代码
00468382 B9 ECB5265A mov ecx,5A26B5EC ; 垃圾代码
00468387 81CA 67E14F73 or edx,734FE167 ; 垃圾代码
0046838D 4B dec ebx
0046838E 83EB FB sub ebx,-5 ; CS+11E
00468391 8D85 90B22541 lea eax,dword ptr ss:[ebp+4125B290] ; 垃圾代码
00468397 8DA8 EE62926D lea ebp,dword ptr ds:[eax+6D9262EE] ; 垃圾代码
0046839D 25 BA289002 and eax,29028BA ; 垃圾代码
004683A2 BE 2C267320 mov esi,2073262C ; 垃圾代码
004683A7 812B 75F43E3B sub dword ptr ds:[ebx],3B3EF475 ; 计算的结果是(FF000010),送CS+11E
004683AD 25 56AC092D and eax,2D09AC56 ; 垃圾代码
004683B2 8D340A lea esi,dword ptr ds:[edx+ecx] ; 垃圾代码
004683B5 3BC1 cmp eax,ecx ; 垃圾代码
004683B7 8D8E 31CE7824 lea ecx,dword ptr ds:[esi+2478CE31] ; 垃圾代码
004683BD B9 04EA210A mov ecx,0A21EA04 ; 垃圾代码
004683C2 B8 65563C31 mov eax,313C5665 ; 垃圾代码
004683C7 E8 02000000 call jl.004683CE ; 虚跳CALL,花指令
004683CE 5E pop esi ; 无意义
004683CF 4B dec ebx
004683D0 83EB FB sub ebx,-5 ; CS +122
004683D3 E8 02000000 call jl.004683DA ; 虚call花指令,无意义
.............
一路都是这样解码+无意义的垃圾代码
.............
0046947A FF0424 inc dword ptr ss:[esp] ; 解码结束,返回地址为4670ee
;开始从解码后的代码处执行代码
;以后看见这个壳入手就看第一个
CALL 中ESI 值,直接跳ESI这里往下分析
0046947D C3 retn
小结:这样一段是开始,一上来就可以看出来,这个壳利用动态生产代码+大量的垃圾
代码来迷惑跟踪的分析,入手就给很多普通的DEBUG 者一个下马威,这才是万里长征的
开始,刚刚打好行囊,我们准备上路了 :)
004670EE /EB 5D jmp short jl.0046714D
004670F0 |8B45 00 mov eax,dword ptr ss:[ebp]
004670F3 |0BC0 or eax,eax ;
004670F5 |74 04 je short jl.004670FB
004670F7 |55 push ebp
004670F8 |FF65 0C jmp near dword ptr ss:[ebp+C]
004670FB |FF45 00 inc dword ptr ss:[ebp]
004670FE |8B4424 24 mov eax,dword ptr ss:[esp+24] ;
00467102 |8945 04 mov dword ptr ss:[ebp+4],eax ;
00467105 |8DB5 84000000 lea esi,dword ptr ss:[ebp+84] ; kernel32.dll,把dll的名称保存地址放到esi中
0046710B |56 push esi
0046710C |FF55 78 call near dword ptr ss:[ebp+78] ; kernel32.GetModuleHandleA
0046710F |8D75 1C lea esi,dword ptr ss:[ebp+1C] ; 把VirtualAlloc名称所在的地址传到esi中
00467112 |56 push esi
00467113 |50 push eax ;
00467114 |FF55 74 call near dword ptr ss:[ebp+74] ; kernel32.GetProcAddress
00467117 |8945 2C mov dword ptr ss:[ebp+2C],eax ; VirtuAlloc地址保存
0046711A |6A 04 push 4
0046711C |68 00100000 push 1000
00467121 |FF75 10 push dword ptr ss:[ebp+10] ; 申请空间大小17951
00467124 |6A 00 push 0
00467126 |FF55 2C call near dword ptr ss:[ebp+2C] ; 申请空间,VirtualAlloc
00467129 > |50 push eax ; 申请地址入栈(370000)
0046712A |8945 0C mov dword ptr ss:[ebp+C],eax ; 申请地址
0046712D |8B5D 08 mov ebx,dword ptr ss:[ebp+8] ; 解码代码相对偏移2499
00467130 |03DD add ebx,ebp ; 把RVA转换成VA(469499)
00467132 |50 push eax ; 解码后放入申请后的地址(370000)
00467133 |53 push ebx ; 源码首地址入栈(469499)
00467134 |E8 18000000 call jl.00467151 ; 去解码,这里这个壳常常更换这个压缩引擎
00467139 |5A pop edx ;
0046713A |52 push edx ; 确认缓冲区(370000)地址段入栈
0046713B |55 push ebp ; 代码段地址467000入栈
0046713C |8D85 DE000000 lea eax,dword ptr ss:[ebp+DE] ; 4670de地址入eax
00467142 |C600 EB mov byte ptr ds:[eax],0EB ; 改代码
00467145 |C640 01 10 mov byte ptr ds:[eax+1],10 ; 回头把4670DE处修改为(jmp 4670f0),为后面取API 地址作准备
00467149 |8B45 30 mov eax,dword ptr ss:[ebp+30]
0046714C |8945 74 mov dword ptr ss:[ebp+74],eax ; 抹掉GetProcAddress的地址(输入表)
0046714F - FFE2 jmp near edx ; 去申请的空间(370000)执行解码后的壳代码
今天就写到这里,这个壳上来就给人二次解码,你想想,高手就是高手,代码里面你能看见的有多少东西?
而且现在才刚刚开始,温柔的一刀。
--------------------------------------------------------------------------------
【破解总结】
第一章 垃圾代码+二次解码,你怎么舍得我难过
--------------------------------------------------------------------------------
【版权声明】 本文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!
[课程]Android-CTF解题方法汇总!