e3322 发表于 2008-2-10 16:53:43

Themida/WinLicense V1.8.2.0 脱壳的详细过程(申请加分)

【文章标题】: Themida/WinLicense V1.8.2.0 脱壳的详细过程
【作者QQ号】: 806509040
【软件名称】: C与C++程序设计学习与实验系统
【下载地址】: http://www.newhua.com
【加壳方式】: Themida/WinLicense V1.8.2.0
【保护方式】: 未注册的软件有30天试用
【使用工具】: PE OD C32ASM
--------------------------------------------------------------------------------
【详细过程】
最近学习C语言 突然发现一款非常实用的工具 C与C++程序设计学习与实验系统。它可以运行在VISTA下软件集成了高校 C/C++教学中使用最多的三种编译器 Visual C++ 6.0 、Turbo C++3.0和Turbo C 2.0 ,给高校 C/C++ 语言的实验教学提供了简单易用的软件实验环境。同时,为了便于C语言学习,加入C语言学习指导、入门程序实例、典型源程序、典型的函数算法,课程设计指导、课程设计源程序、 Visual C++6.0 常见编译错误信息、Turbo C++3.0常见编译错误信息、 Turbo C2.0 常见编译错误信息、C语言专业词汇的中英文对照、二级 C 语言的真题笔试试卷及答案与分析和上机模拟试题和详尽的答案与分析等大量的学习资源。另外 “编程日记” 功能可以让你记录你的 C 语言学习历程, “资料管理” 功能让你大量的下载资料不再难找他是要注册的,否则特色功能可以试用15天,试用期后将禁用这些特色功能。所以准备破掉他,但发现他的壳比较难脱(本人是菜鸟),所以写出来供大家参考

详细过程】
   第一步:用peid查壳可得知加壳方法为:Themida/WinLicense V1.8.2.0 +   -> Oreans Technologies   * Sign.By.fly *
         如果查不出是什么壳,请更新peid程序里userdb.txt的内容,看雪论坛有下载。
   第二步:OllyICE v1.10设置--忽略在KERNEL32中的内存访问异常;隐藏调试工具;
   第三步:加载被调试程序停在程序入口:
   00730014 >   B8 00000000   mov   eax, 0
   00730019   60               pushad
   0073001A   0BC0             or       eax, eax
   0073001C   74 68         je       short 00730086
   0073001E   E8 00000000   call   00730023
   00730023   58               pop   eax
   00730024   05 53000000   add   eax, 53
   00730029   8038 E9         cmp   byte ptr , 0E9
   0073002C   75 13         jnz   short 00730041
   0073002E   61               popad
   0073002F   EB 45         jmp   short 00730076
   00730031   DB2D 37007300   fld   tbyte ptr
   00730037   FFFF             ???               ; 未知命令 ,如果隐藏OD在调试过程中还是退出
请注意OD的浮点陷井(呵呵)
   00730039   FFFF             ???                                       ; 未知命令
   0073003B   FFFF             ???                                       ; 未知命令
   0073003D   FFFF             ???                                       ; 未知命令
   0073003F   3D 40E80000   cmp   eax, 0E840
   00730044   0000             add   byte ptr , al
   00730046   58               pop   eax

   接着运行okdodo兄的脚本,脚本结束后到

脚本执行完毕!请注意OEP是否被偷代码!

   0061C920   68 DC686100   push   006168DC               伪OEP,① call 0061c92 看堆栈
   0061C925   64:A1 00000000   mov   eax, dword ptr fs:
   0061C92B   50               push   eax
   0061C92C   8B4424 10       mov   eax, dword ptr
   0061C930   896C24 10       mov   dword ptr , ebp
   0061C934   8D6C24 10       lea   ebp, dword ptr
   0061C938   2BE0             sub   esp, eax
   0061C93A   53               push   ebx
   0061C93B   56               push   esi
   0061C93C   57               push   edi
   0061C93D   8B45 F8         mov   eax, dword ptr
   0061C940   8965 E8         mov   dword ptr , esp
   0061C943   50               push   eax
   0061C944   8B45 FC         mov   eax, dword ptr
   0061C947   C745 FC FFFFFFF>mov   dword ptr , -1
   0061C94E   8945 F8         mov   dword ptr , eax
   0061C951   8D45 F0         lea   eax, dword ptr
   0061C954   64:A3 00000000   mov   dword ptr fs:, eax
   0061C95A   C3               retn   ; 直接F4,F8到VM中
   堆栈如下:
   0012FF8C   0097480D   Sungame.0097480D   
   0012FF90   006C15E8   Sungame.006C15E8   ② push 006C15E8
   0012FF94   00000060                     ③ push 60   ,在这里

   直接F4,F8到VM中到
   0097480D   68 CD05892B   push   2B8905CD   ; ALt+M在代码段00401000 F2下断后shift+F9
   00974812   ^ E9 63B1FFFF   jmp   0096F97A
   00974817   0AF3             or       dh, bl
   00974819   F61429         not   byte ptr
   0097481C   C6               ???                                       ; 未知命令
   0097481D   CD C7         int   0C7
   0097481F   BA 68476083   mov   edx, 83604768
   00974824   53               push   ebx
   00974825   ^ E9 50B1FFFF   jmp   0096F97A
   到这里后按下ALt+M 在代码段00401000 F2下断 后shift+F9运行中断在
   006169E0   3D 00100000   cmp   eax, 1000               ; ④   Call 006169E0
   006169E5   73 0E         jnb   short 006169F5
   006169E7   F7D8             neg   eax
   006169E9   03C4             add   eax, esp
   006169EB   83C0 04         add   eax, 4
   006169EE   8500             test   dword ptr , eax
   006169F0   94               xchg   eax, esp
   006169F1   8B00             mov   eax, dword ptr
   006169F3   50               push   eax
   006169F4   C3               retn                                     ; 直接F4,F8到VM中
   直接F4,F8到VM中到
   00974820   68 47608353   push   53836047                     
   00974825   ^ E9 50B1FFFF   jmp   0096F97A
   0097482A   399E 8C165657   cmp   dword ptr , ebx
   00974830   09A2 9385E6EC   or       dword ptr , esp
   00974836   15 688ED6FE   adc   eax, FED68E68
   0097483B   26:E9 39B1FFFF   jmp   0096F97A
   Alt+M在代码段00401000 F2下断后shift+F9运行后中断在
   00EA098D   FF33             push   dword ptr    ;kernel32.GetVersionExA,ebx=0069D088
   00EA098F   E9 A5830000   jmp   00EA8D39
   00EA0994   01FB             add   ebx, edi
   00EA0996   332B             xor   ebp, dword ptr
   00EA0998   E9 ED520000   jmp   00EA5C8A
   00EA099D   B8 01000000   mov   eax, 1
   00EA09A2   21C1             and   ecx, eax
   00EA09A4   E9 1BD20400   jmp   00EEDBC4
   00EA09A9   81FA 000000F0   cmp   edx, F0000000

   注意EDX里面的值(0069D088)得就是GetVersionExA所在的地址了

   在寄存器窗口中在0069D088这里跟随到数据窗口,后到

   0069D088   7C812ADE   kernel32.GetVersionExA
   0069D08C   7C809BF8   kernel32.MultiByteToWideChar
   0069D090   7C80A0D4   kernel32.WideCharToMultiByte
   ………………
   往上看后往下看可知道
   0069CFFC   00000000
   0069D000   77DC1558   ADVAPI32.CryptEncrypt         IAT开始地址
   0069D004   77DA7883   ADVAPI32.RegQueryValueExA
   0069D008   77DCC41B   ADVAPI32.RegOpenKeyA
   …………………………………………
   0069D490   1000F870   wzSound.wzsnd_update_3d_source
   0069D494   1000F9A0   wzSound.wzsnd_stop
   0069D498   00000000
   0069D49C   00000000                   IAT结束地址,好了这里不明白自动找的和手动找的怎么不一样。

   Rav=0069CFFC-0040000=0029CFFC,Size=0069D49C-0069CFFC=4A0 这里在修复时可用到
第四步:找回Stolen Code(这里和wynney兄的一样了,我只写出重点部分)
    Ctrl+B在数据窗口整个块中搜索33 C0 39 B1 E8 00 00 00 0F 95 C0 89 45 E4 6A 01
汇编代码就是下面一段:
    0061874C      33C0            xor      eax, eax
    0061874E      39B1 E8000000    cmp      dword ptr , esi
    00618754      0F95C0            setne    al
    00618757      8945 E4          mov      dword ptr , eax
    0061875A      6A 01            push      1
找到所在地址为0061874C后,在反汇编中来到这个地址
    0061874C      33C0            xor      eax, eax
    0061874E      39B1 E8000000    cmp      dword ptr , esi
    00618754      0F95C0            setne    al
    00618757      8945 E4          mov      dword ptr , eax
    0061875A      6A 01            push      1
    往上仔细看看和没加壳的程序对比一下,确定006186A4就是真正的OEP
    如果看不出来请仔细看没加壳的VC++7.0的OEP入口代码

    00618693      ED                in      eax, dx                            ; 真OEP;=③
    00618694      C7                ???                                        ; 未知命令
    00618695      1A05 165DAC93    sbb      al, byte ptr             ; (1)=②
    0061869B      EF                out      dx, eax
    0061869C      93                xchg      eax, ebx
    0061869D      A0 1DED9822      mov      al, byte ptr
    006186A2      7D 0C            jge      short 006186B0
    006186A4      ED                in      eax, dx
    006186A5      B1 19            mov      cl, 19
    006186A7      32CE            xor      cl, dh
    006186A9      85F3            test      ebx, esi
    006186AB      FB                sti
    006186AC      8CFD            mov      bp, seg?                        ; 未定义的段寄存器
    006186AE      98                cwde
    006186AF      52                push      edx
    006186B0      8B91 BB7D6B9E    mov      edx, dword ptr
    006186B6      4E                dec      esi
    006186B7      2A30            sub      dh, byte ptr
    006186B9      9E                sahf
    006186BA      65:B7 2B          mov      bh, 2B
    006186BD      6389 507206CA    arpl      word ptr , cx
    006186C3      7A 95            jpe      short 0061865A
    006186C5      A3 08927200      mov      dword ptr , eax            ; (5)=(7)+08
    006186CA      8B56 08          mov      edx, dword ptr
    006186CD      8915 0C927200    mov      dword ptr , edx            ; (6)=(7)+0C
    006186D3      8B76 0C          mov      esi, dword ptr
    006186D6      81E6 FF7F0000    and      esi, 7FFF
    006186DC      8935 00927200    mov      dword ptr , esi            ; (7)
    006186E2      83F9 02          cmp      ecx, 2
    006186E5      74 0C            je      short 006186F3
    006186E7      81CE 00800000    or      esi, 8000
    006186ED      8935 00927200    mov      dword ptr , esi
    006186F3      C1E0 08          shl      eax, 8
    006186F6      03C2            add      eax, edx
    006186F8      A3 04927200      mov      dword ptr , eax
    006186FD      33F6            xor      esi, esi
    006186FF      56                push      esi
    00618700      8B3D 10D16900    mov      edi, dword ptr             ; kernel32.GetModuleHandleA
    00618706      FFD7            call      edi
    00618708      66:8138 4D5A      cmp      word ptr , 5A4D
    0061870D      75 1F            jnz      short 0061872E
    0061870F      8B48 3C          mov      ecx, dword ptr
    00618712      03C8            add      ecx, eax
    00618714      8139 50450000    cmp      dword ptr , 4550
    0061871A      75 12            jnz      short 0061872E
    0061871C      0FB741 18      movzx    eax, word ptr
    00618720      3D 0B010000      cmp      eax, 10B
    00618725      74 1F            je      short 00618746
    00618727      3D 0B020000      cmp      eax, 20B
    0061872C      74 05            je      short 00618733
    0061872E      8975 E4          mov      dword ptr , esi
    00618731      EB 27            jmp      short 0061875A
    00618733      83B9 84000000 0>cmp      dword ptr , 0E
    0061873A    ^ 76 F2            jbe      short 0061872E
    0061873C      33C0            xor      eax, eax
    0061873E      39B1 F8000000    cmp      dword ptr , esi
    00618744      EB 0E            jmp      short 00618754
    00618746      8379 74 0E      cmp      dword ptr , 0E
    0061874A    ^ 76 E2            jbe      short 0061872E
    0061874C      33C0            xor      eax, eax                        我们搜索的位置
    0061874E      39B1 E8000000    cmp      dword ptr , esi
    00618754      0F95C0            setne    al
    00618757      8945 E4          mov      dword ptr , eax
    0061875A      6A 01            push      1

    好了,现在根据wynney兄所提到的各地址之间的关系
      引用:
      { 以 ⑺为基点有以下关系
      OEP位置=③
      ⑴=②,⑵=①,⑶=④
      ⑷=⑺-04,⑸=⑺+08,⑹=⑺+0C
   
      那么其他的都一样的啦
      对VC++ 7.0而言,以上关系是永远存在的
      }
找到我们标记的③的地方,改汇编后接着改⑴=②的地方,接着⑵=①的地方,下面两段代码就用原来没加壳前的代码,接着是⑶=④的地方,以下四段代码照原来没加壳的代码改写,接着
call      dword ptr 这里是从上面来的
接着有一段代码用原来没加壳的就可以,代码改好了现在要注意的是⑷=⑺-04,729200-04=7291FC得来;
⑸=⑺+08,⑹=⑺+0C,这两个的能看出来了,我就不写了

    还原Stolen Code后代码如下
    /////////////////////////////////////////////////////////////////////////////
    00618693      6A 60            push      60                              ; 真OEP;=③
    00618695      68 E8156C00      push      006C15E8                        ; (1)=②
    0061869A      E8 81420000      call      0061C920                        ; (2)=①
    0061869F      BF 94000000      mov      edi, 94
    006186A4      8BC7            mov      eax, edi
    006186A6      E8 35E3FFFF      call      006169E0                        ; (3)=④
    006186AB      8965 E8          mov      dword ptr , esp
    006186AE      8BF4            mov      esi, esp
    006186B0      893E            mov      dword ptr , edi
    006186B2      56                push      esi
    006186B3      FF15 88D06900    call      dword ptr       ; kernel32.GetVersionExA
    006186B9      8B4E 10          mov      ecx, dword ptr
    006186BC      890D FC917200    mov      dword ptr , ecx            ; (4)=(7)-04
    006186C2      8B46 04          mov      eax, dword ptr
    机器码如下:在这里也可以用机器码改写,我刚才一步步是为了给大家能看懂
    6A 60 68 E8 15 6C 00 E8 81 42 00 00 BF 94 00 00 00 8B C7 E8 35 E3 FF FF 89 65 E8 8B F4 89      3E 56 FF 15 88 D0 69 00 8B 4E 10 89 0D FC 91 72 00 8B 46 04
    ///////////////////////////////////////////////////////////
    006186C5      A3 08927200      mov      dword ptr , eax            ; (5)=(7)+08
    006186CA      8B56 08          mov      edx, dword ptr
    006186CD      8915 0C927200    mov      dword ptr , edx            ; (6)=(7)+0C
    006186D3      8B76 0C          mov      esi, dword ptr
    006186D6      81E6 FF7F0000    and      esi, 7FFF
    006186DC      8935 00927200    mov      dword ptr , esi            ; (7)
    006186E2      83F9 02          cmp      ecx, 2
    006186E5      74 0C            je      short 006186F3
    006186E7      81CE 00800000    or      esi, 8000
    006186ED      8935 00927200    mov      dword ptr , esi
    006186F3      C1E0 08          shl      eax, 8
    006186F6      03C2            add      eax, edx
    006186F8      A3 04927200      mov      dword ptr , eax
    006186FD      33F6            xor      esi, esi
    006186FF      56                push      esi
    00618700      8B3D 10D16900    mov      edi, dword ptr             ; kernel32.GetModuleHandleA
    00618706      FFD7            call      edi
    00618708      66:8138 4D5A      cmp      word ptr , 5A4D
    0061870D      75 1F            jnz      short 0061872E
    0061870F      8B48 3C          mov      ecx, dword ptr
    00618712      03C8            add      ecx, eax
    00618714      8139 50450000    cmp      dword ptr , 4550
    0061871A      75 12            jnz      short 0061872E
    0061871C      0FB741 18      movzx    eax, word ptr
    00618720      3D 0B010000      cmp      eax, 10B
    00618725      74 1F            je      short 00618746
    00618727      3D 0B020000      cmp      eax, 20B
    0061872C      74 05            je      short 00618733
    0061872E      8975 E4          mov      dword ptr , esi
    00618731      EB 27            jmp      short 0061875A
    00618733      83B9 84000000 0>cmp      dword ptr , 0E
    0061873A    ^ 76 F2            jbe      short 0061872E
    0061873C      33C0            xor      eax, eax
    0061873E      39B1 F8000000    cmp      dword ptr , esi
    00618744      EB 0E            jmp      short 00618754
    00618746      8379 74 0E      cmp      dword ptr , 0E
    0061874A    ^ 76 E2            jbe      short 0061872E
    0061874C      33C0            xor      eax, eax
    0061874E      39B1 E8000000    cmp      dword ptr , esi
    00618754      0F95C0            setne    al
    00618757      8945 E4          mov      dword ptr , eax
    0061875A      6A 01            push      1


    上面代码还原完成。
    第五步:脱壳和修复。   
在00618693,也就是OEP的地方,设置为新EIP后,用LordPE工具Dump得到1.exe(注意这里别连网线,网线接上就dump不出来的,原因我还没找,这次没接网线又不成功,晕了用OD自带的吧,好了有了)。打开SuperImportREC,填入以下(这里上面已经说明怎么得到的了)    EP=00618693-0040000=00218693    Rav=0069CFFC-0040000=0029CFFC    Size=0069D498-0069D49C=4A0         接着获取输入表,没有无效函数,修复1.exe完成得到1_.exe,现在我们看看有没有脱掉并且能不能运行,这里看到了不能运行了,方法就是上面的,请大家仔细点,别出错,我的可能是在那步出错了,我这是录第二次了,第一次录的已经可以运行,但没录下来,这次又不能运行了,晕了,小弟不才呀!!!好了可以运行了,脱壳完成
大家说字体太大了所以帮忙改下!见谅了!

[ 本帖最后由 蓝枫 于 2008-2-15 09:44 编辑 ]

dying 发表于 2008-2-10 17:06:28

/:L 字体设置那么大.看着累~~!

yybns 发表于 2008-2-11 18:24:01

学习一下。/:001

886788 发表于 2008-2-12 10:20:53

谢谢分享!!!/:018

xiaoer 发表于 2008-2-14 09:32:59

这个软件是用vb写的,你怎么能分析出来个,vc编的呢,

hclzss 发表于 2008-2-14 23:26:58

谢谢分享,正需要学习呢。

惜雪 发表于 2008-2-15 08:30:26

支持个,谢谢分享!(建议下把字体调成正常比较好,这样看有点乱……呵呵)

glts 发表于 2008-2-15 19:04:30

此程序确实为VB程序.楼主是否写错了:handshake

yzxyz68 发表于 2008-2-15 22:39:48

来学习一下哦:loveliness:

dulun 发表于 2008-2-16 13:29:27

写的非常漂亮/:014
页: [1] 2 3 4
查看完整版本: Themida/WinLicense V1.8.2.0 脱壳的详细过程(申请加分)