首页
社区
课程
招聘
[原创]菜鸟脱壳nspack v1.4,和我一样的菜鸟共同分享并成长!
发表于: 2006-1-20 17:45 6059

[原创]菜鸟脱壳nspack v1.4,和我一样的菜鸟共同分享并成长!

2006-1-20 17:45
6059
--------------------------------------------------------------------------------
【破解作者】 CSLIU
【使用工具】 Ollydbg1.10, C32asm ,PEid 0.94
【破解平台】 Windows XP SP2
【软件名称】 NO NAMES
【软件简介】 绿色软件
【加壳方式】 nspack v1.4
【破解声明】 我是一只小菜鸟,偶得一点心得,愿与大家分享:)
--------------------------------------------------------------------------------
    由于本人确实非常菜,所以很多地方还没有明白,所以就只是把破解的过程描述了一下,也请大家多多指教。
    由于前两天刚刚问过大家,怎么作也不知道怎么作,还被有人骂着脱壳白痴,现在写这个我都还心有余悸,请大家多多包涵,我确实什么都不懂,但是我偏要脱壳,偏要破解。难道一定什么都懂,才能破解吗?至少我认为不是!
    回想现在当初开始搞破解都一两个月了(也就是从我在看雪注册的时候算起),当然开始就是改跳转,也不叫什么真正的破解了。^_^,写这个只是想和大家交流交流。当然现在我也什么都不懂,什么加密算法,调试工具使用技巧,加密壳等什么的我都只是知道有这么回事而已,其他的 都不懂了,但是到现在也破解了好几个软件(当然都是没有加壳的,而且都是爆破的,^_^),这个软件是我第一次对有壳软件的破解,也算一种突吧!
    我觉得在这个破解的道路上,最令我深刻的就是破解的第一个软件,没有加壳,用vc6.0编译的,只有时间限制,破解这个软件花了我好像五天左右的时间,因为刚开始什么都不懂,对软件本身进行修改的事情,感觉好神秘,而且特别有成就感,也许这就是我一直努力的动力吧!这个软件的破解其实也很具有偶然性,当初是我们这里有个试用软件,但是有个时间限制,我们大家又都不懂破解,根本就没有这个意识,“原来软件可以破解”。刚开始居然有人说把文件打开,改改时间就行了,后来可想而知,根本没有找到时间。
    当然我不会如此理解,至少我还是学校里出来的撒。知道这个要对程序进行修改,也就是破解或者爆破吧。怎么打开程序,怎么修改呢。我从google到baidu,搜索了无数多个网站,最后终于我眼前一亮,找到了看雪,找到了一个真正的关于加密与解密的网站――看雪。找到了很多工具,调试的,反汇编的,脱壳的等等。而且搞了好久才知道,调试工具不能修改软件,一退出就又还原了。只有反汇编的才可以修改软件。^_^,可以修改软件了,但是不能乱来撒,怎么去掉时间限制呢,我想了想,只要找到时间就行了撒,这个太简单了撒。可是用的hiew,怎么也找不到2005年,这个数字,想了一下,是十六进制的,应该换算成:07D5h,当时,我不知道调试,就只有慢慢找这个字符拉,还好软件不是很大,找了半个小时,找到了。然后就把时间改掉,这个就被我破解了。^_^,其实我觉得第一个破解是非常重要的,有破解和没有破解就是1和0的区别,这个时候我才有了一点感性的认识。
    后来的几个软件也是没有加壳的,当是其他的保护吧,比第一个都要难一些,但是有了第一个的经验之后,反而越来越简单了。遇到问题就到看雪论坛上找答案,还有就是找看雪论坛收藏看,还是都有理有据的,有一点不爽就是,不够形象,比如说都是文字说的,还是不清楚,而且对于我们这些菜鸟而言,完全是天书,对于高手而言,说得就更简约了。像我们这些鸟,工具都不怎么会用,到现在我连od都不怎么会用,怎么能理解老大们的精髓呢。
    而且我不大认为有些人说的学习过程,说首先要很熟练调试(要开始爆破,再能得到注册码,再写注册机),再学习脱壳。我认为需求才是学习的根本动力,这些软件都是我需要,我才来学习破解的。而且不一定非要什么都了解透,只要能正常使用就行了。需要什么我就学习什么,这是我的一贯原则。
    我有一个建议,希望看雪老大能考虑考虑,很多人都提议过,就是把各种经典的破解方法和手段录为视频,好让我们这些菜鸟进步的更快。最好视频还是那种渐进性的,便于学习。
    好像废话说得太多了,现在说一下我的脱壳经历吧。
    我有个绿色软件,有两个文件,一个exe(应用程序)文件和dll(动态链接库)文件,用peid检测,都是用nspack v1.4加的壳,有壳那就必须先脱壳撒,这个在看雪上把nspack的脱壳工具下下来试一试,maybe your target is not packet by nspack!我晕,这种事都有,明明是nspack就不能脱壳,没办法,只好把所有脱壳工具都下下来试一试了,什么通用脱壳,aspack脱壳的,asprotect脱壳的等等,只有一个结果,统统不能脱这个的壳。那就只好手动脱壳了,但是感觉好像很难吧,在看雪上搜索了一下,谈到dll加壳,好像都很难脱壳似的,而且很多谈到nspack脱壳,好像都只有谈到exe加的壳,并没有谈到dll加壳的问题,这个怎么办呢,先到调试版那里转了转,把软件调试基础知识看了一遍,讲了一些理论知识,感觉好像对我破解这个软件没有什么用处,什么PE格式,加壳什么的好像一点兴趣都没有,就继续找吧,又翻了翻看雪精华收藏,居然是nspack v2.0以上的,还是不行啊,实在找不到了,没有办法就只有在论坛上发贴了,虽然看了“发贴必看――好像叫提问的智慧吧!”,知道提问题要有水平,高手也许才会给一点建议,没有办法,谁叫自己这么菜呢,只好有病乱投医了,就随便发了个贴问问吧,没想到第一个人回帖就骂我脱壳白痴,我晕,看来贴不是菜鸟们能乱发的,不然就跟我一样了,是说不得论坛上发贴问问题的这么少,原来原因在这里所。还好看雪老大发现,安慰了我一下,让我看看基础知识!
    没有办法,贴是不能发了,不然其他的骂名又出来了,只好去看雪的那个群聊聊,求助了,好心人还是有的,让我去fly的网站(什么萧雨吧,我忘了,对不起啊,fly兄)看看,我去了,发了贴,还好这里没有人骂,^_^,fly也给了我回复,答案就是不要脱壳了,做其他简单点的。但是因为这个软件是我必需的,所以这个我必须进行做下去。
    看来没有戏了,这个实在做不下去了,能力有限啊,说到脱壳,要什么dump,要输入表重建,要清除自校验等,弄得我头大。我只好在看雪上溜达了,无疑中发现fly所说的脱壳工具quick unpack,我忽然柳暗花明,这个脱壳工具超好用,好像是老毛子的,这个能脱好多壳,我这个也可以了,现在我终于可以爆破这个软件了。但是我还是不甘心,因为花了这么多时间还是找个工具脱壳,感觉自己没有什么作用,那就进行找方法手动脱壳吧,在google上找了找,看到了一个nspack v1.4的脱壳视频,就下下来看了几遍,终于有了一点视觉上的感受,就用这个软件试了试,不知道能不能用,而且这个不是把dll也加壳了的嘛,没有办法,死马当活马医了。
    首先用od把exe文件打开,来到这里:
0066F229 >  9C              pushfd
0066F22A    60              pushad
0066F22B    E8 00000000     call    0066F230
0066F230    5D              pop     ebp
0066F231    B8 B1854000     mov     eax, 004085B1
0066F236    2D AA854000     sub     eax, 004085AA
0066F23B    2BE8            sub     ebp, eax
0066F23D    8DB5 03FCFFFF   lea     esi, [ebp-3FD]
0066F243    8B06            mov     eax, [esi]
0066F245    83F8 00         cmp     eax, 0
0066F248    74 11           je      short 0066F25B
0066F24A    8DB5 0FFCFFFF   lea     esi, [ebp-3F1]
0066F250    8B06            mov     eax, [esi]
0066F252    83F8 01         cmp     eax, 1
0066F255    0F84 F1010000   je      0066F44C
0066F25B    C706 01000000   mov     dword ptr [esi], 1
0066F261    8BD5            mov     edx, ebp
0066F263    8B85 DFFBFFFF   mov     eax, [ebp-421]
0066F269    2BD0            sub     edx, eax
0066F26B    8995 DFFBFFFF   mov     [ebp-421], edx
0066F271    0195 F7FBFFFF   add     [ebp-409], edx
0066F277    8DB5 13FCFFFF   lea     esi, [ebp-3ED]
0066F27D    0116            add     [esi], edx
0066F27F    8B36            mov     esi, [esi]
0066F281    8BFD            mov     edi, ebp
0066F283    60              pushad
  
    我不知道这里是那里,不知道也不要问,不然别人会骂你白痴,这就是我总结的结果。我理解就是程序开始的地方,或者什么其他的意思吧,不管了,这个是那里都没有关系。
    随便介绍几个命令,od(工具中的第一个调试的工具就是)中的F7,F8,F9。
F7就是程序依次执行,感觉和F8差不多,所不同的就是,遇到call命令,F7跟进去继续执行,而F8呢就不跟进去,不知道F8执行这个过程没有呢?忘那位仁兄指点指点哈,^_^,F9就是一直进行下去。
    到这里之后,按两个F7就可以了,F8也可以,这时里就可以看看od的右边,就是寄存器区那里,esp的值是0012FFA0,这时候,你就在命令栏里,输入hr=0012FFA0,就是esp的值(随便问问,那位兄台知道hr是什么意思哦?),按空格键,再按F9键,就可以了。
来到这里:
0066F44D    9D              popfd
0066F44E  - E9 A922D9FF     jmp     004016FC
0066F453    8BB5 DBFBFFFF   mov     esi, [ebp-425]
0066F459    0BF6            or      esi, esi
0066F45B    0F84 97000000   je      0066F4F8
0066F461    8B95 DFFBFFFF   mov     edx, [ebp-421]
0066F467    03F2            add     esi, edx
0066F469    833E 00         cmp     dword ptr [esi], 0
0066F46C    75 0E           jnz     short 0066F47C
0066F46E    837E 04 00      cmp     dword ptr [esi+4], 0
0066F472    75 08           jnz     short 0066F47C
0066F474    837E 08 00      cmp     dword ptr [esi+8], 0
0066F478    75 02           jnz     short 0066F47C
0066F47A    EB 7A           jmp     short 0066F4F6
0066F47C    8B5E 08         mov     ebx, [esi+8]
0066F47F    03DA            add     ebx, edx
0066F481    53              push    ebx
0066F482    52              push    edx

这里好像就是他们所说的真正的程序入口了,所谓的eop吧,但是你还要按F7或者F8两次,有个突变的样子,来到这里:
004016FC      EB            db      EB
004016FD      10            db      10
004016FE      66            db      66                               ;  CHAR 'f'
004016FF      62            db      62                               ;  CHAR 'b'
00401700      3A            db      3A                               ;  CHAR ':'
00401701      43            db      43                               ;  CHAR 'C'
00401702      2B            db      2B                               ;  CHAR '+'
00401703      2B            db      2B                               ;  CHAR '+'
00401704      48            db      48                               ;  CHAR 'H'
00401705      4F            db      4F                               ;  CHAR 'O'
00401706      4F            db      4F                               ;  CHAR 'O'
00401707      4B            db      4B                               ;  CHAR 'K'
00401708      90            db      90
00401709      E9            db      E9
0040170A      98            db      98
0040170B      F0            db      F0
0040170C      55            db      55                               ;  CHAR 'U'
0040170D      00            db      00
0040170E      A1            db      A1
0040170F      8B            db      8B
00401710      F0            db      F0
00401711      55            db      55                               ;  CHAR 'U'
00401712      00            db      00

    就是感觉这里和以前那里的内容不一样了。也许这里就是他们所说的虚拟地址区域什么的吧。
    然后,在这个地方按鼠标右键,选择dump debugged process 保存这个exe文件为你选择的地方,就行了(这个好像就是他们说的狭义esp定律吧,不知道是不是)。好像这个不需要重建输入表和清除自校验。
这时你用peid检测它,就可以看到:Borland C++ 1999,多么兴奋的事情啊!

    现在到了爆破的时候了,刚开始用od调试的时候,有这些问题,不知道那位兄台解释一下,加没有加壳都可以用od调试,而且脱了壳之后,一共遇到六处下断的地方,是这样的,连续按F8运行,到跳出需要填入注册码的地方前一个地方下断(下断点就是在汇编代码前的那个区域双击,或者说是四个方框中的第二个方框双击,也是机器码的地方,因为前面一个是地址,第二个是机器码,第三个是汇编码,第四个就是诸事区,就是你自己添什么都可以的!),一共好像有六个吧,而且每个都是:call 地址   ,这种地方弹出来的,所以每次都只有跟进去了,就按F7跟进去撒,搞到最后好像还循环了一样,弄得我头都大了(希望那位大虾知道的告诉我一声),没办法,这个方法不行了。
    这时候,我就用C32asm了,这个其实很好的,我觉得比W32dsm还好用,而且是国产的,这个就用来打开脱壳的那个exe文件(dll不管,好像不需要,exe也可以运行),然后点 查看 字符串,你就可以看到很多汉字,因为我这个软件会根据不用的电脑生成各种序列号,这个是固定的,跳出来的那个方框需要输入用户名和注册码(用户名是虚的,没有任何意义),我想了一下,这个应该就是根据序列号生成注册码,这个注册算法对我来说太难,太花时间了,我只是想要用软件而已,不一定什么都得做,对吧,所以我分析了一下,第一次需要注册码,注册了之后,就不需要输入注册码了撒,那么第一次怎么找注册码呢,怎么分析注册算法呢,我想到一个简单方法,那就是,不管你输入什么,程序要判断这个注册码是否正确撒,你就可以把它改成相反的条件,就是你输入错误的注册码,你就注册成功了。
    这个一般在程序开始不远的地方的,第一次注册会有两个支路,一个就是注册成功,一个就是注册失败。一般是这种:
cmp al al
je  地址         
   或者其他比较,如果是je你只需要改成jne,很简单是吧,那怎么用C32asm修改程序文件呢,你就在需要修改的地方,点鼠标右键,选择 “对应hex编辑”,然后按“Ctrl+Q”,再按“shift+A”,就可以了。想怎么改就怎么改!
    也许有人要问怎么找到这个比较的地方,就是那个cmp al al的地方,一般每个程序都有汉字说明,我这个程序也是。在使用C32asm的时候,你点查看 字符串就可以看到很多汉字,这里面有很多有用信息,你看了就知道了,比如我这个软件吧,需要注册撒,你输入注册,就会看到注册成功,注册失败等,

而且注册成功和注册失败两个地方很近,那么你就可以发现他们的联系了撒
  

45 8C                  MOV EAX,DWORD PTR [EBP-74]              
::004192F7::  8B80 10030000            MOV EAX,DWORD PTR [EAX+310]            
::004192FD::  E8 C2351100              CALL 0052C8C4                           \:JMPDOWN
::00419302::  837D B8 00               CMP DWORD PTR [EBP-48],0               
::00419306::  EB 05                    JMP SHORT 0041930D                      \:JMPDOWN
::00419308::  8B55 B8                  MOV EDX,DWORD PTR [EBP-48]              
::0041930B::  EB 05                    JMP SHORT 00419312                      \:JMPDOWN
::0041930D::  BA 51995600              MOV EDX,569951                          \:BYJMP JmpBy:00419306,
::00419312::  B9 46995600              MOV ECX,569946                          \:BYJMP JmpBy:0041930B,    \->: 注册成功 !
::00419317::  A1 54A85700              MOV EAX,DWORD PTR [57A854]              
::0041931C::  8B00                     MOV EAX,DWORD PTR [EAX]                 
::0041931E::  E8 4D391400              CALL 0055CC70                           \:JMPDOWN
::00419323::  FF4D AC                  DEC DWORD PTR [EBP-54]                  
::00419326::  8D45 B8                  LEA EAX,DWORD PTR [EBP-48]              
::00419329::  BA 02000000              MOV EDX,2                              
::0041932E::  E8 953B1400              CALL 0055CEC8               

4D391400              CALL 0055CC70                           \:JMPDOWN
::00419323::  FF4D AC                  DEC DWORD PTR [EBP-54]                  
::00419326::  8D45 B8                  LEA EAX,DWORD PTR [EBP-48]              
::00419329::  BA 02000000              MOV EDX,2                              
::0041932E::  E8 953B1400              CALL 0055CEC8                           \:JMPDOWN
::00419333::  EB 6C                    JMP SHORT 004193A1                      \:JMPDOWN
::00419335::  6A 00                    PUSH 0                                  \:BYJMP JmpBy:00419105,
::00419337::  66:C745 A0 7400          MOV WORD PTR [EBP-60],74               
::0041933D::  33C9                     XOR ECX,ECX                             
::0041933F::  894D B4                  MOV DWORD PTR [EBP-4C],ECX              
::00419342::  8D55 B4                  LEA EDX,DWORD PTR [EBP-4C]              
::00419345::  FF45 AC                  INC DWORD PTR [EBP-54]                  
::00419348::  8B45 8C                  MOV EAX,DWORD PTR [EBP-74]              
::0041934B::  8B80 10030000            MOV EAX,DWORD PTR [EAX+310]            
::00419351::  E8 6E351100              CALL 0052C8C4                           \:JMPDOWN
::00419356::  837D B4 00               CMP DWORD PTR [EBP-4C],0               
::0041935A::  74 05                  
         

7D B4 00               CMP DWORD PTR [EBP-4C],0               
::0041935A::  74 05                    JE SHORT 00419361                       \:JMPDOWN
::0041935C::  8B55 B4                  MOV EDX,DWORD PTR [EBP-4C]              
::0041935F::  EB 05                    JMP SHORT 00419366                      \:JMPDOWN
::00419361::  BA 5D995600              MOV EDX,56995D                          \:BYJMP JmpBy:0041935A,
::00419366::  B9 52995600              MOV ECX,569952                          \:BYJMP JmpBy:0041935F,    \->: 注册失败 !
::0041936B::  A1 54A85700              MOV EAX,DWORD PTR [57A854]              
::00419370::  8B00                     MOV EAX,DWORD PTR [EAX]                 
::00419372::  E8 F9381400              CALL 0055CC70                           \:JMPDOWN
::00419377::  FF4D AC                  DEC DWORD PTR [EBP-54]                  
::0041937A::  8D45 B4                  LEA EAX,DWORD PTR [EBP-4C]              
::0041937D::  BA 02000000              MOV EDX,2                              
::00419382::  E8 413B1400              CALL 0055CEC8                           \:JMPDOWN
::00419387::  EB 18                    JMP SHORT 004193A1                      \:JMPDOWN
::00419389::  6A 00                    PUSH 0                                  \:BYJMP JmpBy:004190C1,
::0041938B::  B9 6B995600              MOV ECX,56996B                              \->: 注册失败 !
::00419390::  BA 5E995600              MOV EDX,56995E                              \->: 请输入注册码
::00419395::  A1 54A85700              MOV EAX,DWORD PTR [57A854]         

通过以上代码 你可以发现他们在一起,你只要把两个支路的条件改过来就行了。怎么改了,就是上面说的改je为jne,其他情况也差不多。你其实可以发现在注册成功和注册失败的中间有这么一行代码:
::00419335::  6A 00                    PUSH 0                                  \:BYJMP JmpBy:00419105,
你想想看,这个无条件转移就是它上面的顶点,就是这两个支路的顶点,这里有个判断语句就是我们所说的比较条件,改成相反条件就行了。那么地址就是00419105撒,哈哈,是不是很简单呢!
    为什么还要脱壳呢,为什么不直接改呢,这个我理解是,没有脱壳的时候,用C32asm打开程序,查看 字符串全是乱码,这个就根本不能改了。   
    好像说得比较乱,希望没有耽误大家时间,在这里说了我的一些感受和心得,同时有句话,希望看雪老大考虑考虑视频的问题,而且文件不是很大,视觉感受很好,不是有人说过,人的视觉接受了人所获信息的80%嘛(忘记是70%还是80%了)。就这样了,有错误的地方或者不足的地方,希望大家多多指正。

[课程]Android-CTF解题方法汇总!

收藏
免费 1
支持
分享
最新回复 (7)
雪    币: 898
活跃值: (4039)
能力值: ( LV9,RANK:3410 )
在线值:
发帖
回帖
粉丝
2
鼓励一下,刚开始都很难
只要自己肯下功夫,会有进步的
2006-1-20 18:12
0
雪    币: 207
活跃值: (40)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
不错啊。不要在乎别人对你的一言一行,走自己的路。继续努力。

F8    当然它要执行,不执行,软件怎么运行起来啊。^_^
HR    这些OD下的命令 意思是 下硬件断点 其他还有 D,HW等。这
      些你通过搜索OD帮助文件可以找到
2006-1-20 19:21
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
骂你脱壳白痴的 他也是从白痴开始的,有恒心和信心就一定可以成功@!!!
脱 nspack 1.4的其实可以考虑ESP定律.  对于压缩壳而言, 开始如果有 pushad 这个语句,那么根据"堆栈平衡"原理, 你可以把壳想象成一个子程序CALL 等它压缩完毕后必然会出栈,popad 经过这个语句后面的就是我们要找的
OEP了跨段跳跃从壳的区域跳跃到程序的代码段!  DUMP

命令 : hr 12FFA0
F9 运行
2006-1-22 14:33
0
雪    币: 200
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
谢谢各位的鼓励,我想我会在这个兴趣上更进一步的。
2006-1-23 13:26
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
看来要好好学习...........
2006-6-22 10:34
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
学习之中..................
2006-6-23 05:56
0
雪    币: 333
活跃值: (40)
能力值: ( LV9,RANK:730 )
在线值:
发帖
回帖
粉丝
8
能体会你的经历和感受。
2006-6-23 09:24
0
游客
登录 | 注册 方可回帖
返回
//