• 标 题:Armadillo 2.5x 加壳的Konvertor 3.13脱壳 (5千字)
  • 作 者:fwnl
  • 时 间:2002-5-5 12:44:46
  • 链 接:http://bbs.pediy.com

Armadillo 2.5x 加壳的Konvertor 3.13脱壳
crack by fwnl
软件说明:是一个图片、音乐、文字及影音格式文件的转换程序,它总共可以转换135种文件格式,包含25种音乐格式、4种影音格式、105种图片格式及1种文字格式。
软件下载:http://www.onlinedown.net/konvertor.htm
破解工具:trw2000,Import REConstructor v1.4.2+ ,winhex10.45, Peditor 1.7.

    首先要谢谢hying,leo_cyl,yahoo007,电神等大哥,因为这篇文章中的内容是按他的研究成果来写的.
特别是yahoo007大哥给了我不少帮助,也要谢谢hying大哥给我的Konvertor 3.12A的输入表.
    由于最后输入表的问题并没有完美解决,所以还希望各位说说手动修复输入表的方法和技巧,因为这
方面的资料真是太少了,这也是我写这篇文章的初衷之一吧,谢谢

一.找oep
方法一:
    这种方法是按leo_cyl上次的脱文来找的,原理请看leo_cyl写的Armadillo 2.52的脱文(强烈建义
脱壳前看看,并搞清楚原理)

  首先用trw2000载入主程序,下 bpx createprocessa. F5返回程序被中断,下Pmodule返回程序中
然后Ctrl+↓ 向下看

0187:00909B06  CALL    `KERNEL32!WaitForDebugEvent`  //看到这个就不远了
0187:00909B0C  TEST    EAX,EAX
0187:00909B0E  JZ      NEAR 0090A128
0187:00909B14  MOV      DWORD [EBP+FFFFFD70],00911468
.............
.............
注意下面的这几句格式,在别的加壳程序中也是差不多的
0187:00909CB7  MOV      ECX,[EBP+FFFFFE74]     
0187:00909CBD  CMP      DWORD [ECX+0C],C0000005
0187:00909CC4  JNZ      NEAR 00909E89
0187:00909CCA  MOV      EDX,[EBP+FFFFFE74]
0187:00909CD0  CMP      DWORD [EDX+5C],BYTE +00    //下断在这里
0187:00909CD4  JZ      00909CE2
0187:00909CD6  MOV      DWORD [EBP+FFFFFD70],009114E8

于是bpx 909cd0, f5返回,程序中断在00909CD0 下dd edx+18,再按一下F5可看见oep-> 474e06

方法二:
  这种方法是按电神大哥说的方法来找的:

  首先用trw2000载入主程序,bpx VirtualProtect,,在最后一次被中断后,下Pmodule返回程序,然后F10
单步走,当走到遇上的第2个call时,F8进入,然后F10单步走,直到走到call edi,
edi的值就是oep-> 474e06
    注意:开始 bpx virtualprotect 时,其中会中断很多次,这个程序在我机子上是中断 91 次,
所以我就是从第 91 中断后开始 F10单步走的.
 
二.初步脱壳
    这里我是用的hying大哥的方法,因为leo_cyl上次的脱文中的意思我还没有搞明白,那篇文中谈到的几个
关键点在这个程序中我没找到 :(

下面的事就是要把hying大哥说的一段代码写入到程序里
6804000000 push    PAGE_READWRITE
6800100000 push    MEM_COMMIT
6800005800 push    580000h  <-用peditor看程序的size of image ,我这里看到是57f000,大一点就写
6800000000 push    0                                                                580000h
xxxxxxxxxx call    VirtualAlloc    <-申请内存
          mov    edi,eax     
          mov    ecx,57e000      <- size of image-1000h= 57e000
          mov    esi,401000h      <-基址加1000h,有的程序不是这个值
          rep  movsb
    载入程序,按一下F10,看看当前的地址,我的是90b7d9, 于是d 90b7d9, Alt+↓ 向下看
看到 910F64处内存有一片 00 00 00 00 00

    重新载入程序.bpx VirtualAlloc,Pmodule返回程序中,code on,可是看到
      Call KERNEL32! VirtualAlloc前的代码,我机子上是 FF1528019100

    然后,再重新载入程序, d 910F64 再 u 910F64,在内存窗口开始填入680400000068001000006800005800
6800000000FF1528019100,可看见下面内容, 再A 910f7e 回车写入 mov edi,eax 就可知代码为 89c7
后面的也是这样,最后可见代码窗口为下面这样:
0187:00910F64 6804000000      PUSH    DWORD 04
0187:00910F69 6800100000      PUSH    DWORD 01000
0187:00910F6E 6800005800      PUSH    DWORD 00580000
0187:00910F73 6800000000      PUSH    DWORD 00
0187:00910F78 FF1528019100    CALL    `KERNEL32!VirtualAlloc`
0187:00910F7E 89C7            MOV      EDI,EAX
0187:00910F80 B900E05700      MOV      ECX,0057E000
0187:00910F85 BE00104000      MOV      ESI,00401000
0187:00910F8A F3A4            REP MOVSB
0187:00910F8C 0000            ADD      [EAX],AL

    用Peditor 1.7打开原加壳程序,点FLC,在virtual Address 填入910f64,点do! 可知offset(hex)为3BF64
   
    用winhex打开原加壳程序,从3BF64开始写入      6804000000680010000068000058006800000000FF152801910089C7B900E05700BE00104000F3A4
保存后用trw2000打开这个被修改的程序,bpx 474e06 ,中断后 r eip 910f64 ,然后f10单步走,走到00910F7E
时记下eax的值,我机子上是5560000,继续走到 910f8c时,下命令 w 5560000  5ADE000 c:\ppp.bin
                      (5560000+57E000=5ADE000)
然后 r eip 474e06,F5返回,关闭程序

  这时我们载入原加壳程序,bpx 474e06, f5返回中断,pedump脱出程序test.exe
用winhex分别打开test.exe和ppp.bin,在test.exe的offset 1000处开始,用ppp.bin替换下面的数据,
替换的长度就是ppp.bin的长度,然后保存.

三.修复输入表
    这部分对我来说太难了,因为工具并不能完全解决.我的方法是:
    在Import REConstructor v1.4.2+ 的 Attach to an Active Process 窗口中选取加壳程序的进程,有2个进程选上面的一个,然后在下方的oep处填入00074e06,点IAI AutoSearch,再点Get Imports,然后点Auto Trace,然后点看还有多少地址是NO,剩下的事就是手动找这些函数了.

hying大哥说过  CreateEventW
              GetStringTypeA
如果发现这两个函数连续在一起的话,上面一个该改为GetStringTypeW

手工修复修入表后,程序应能运行了,好像也就不用注册了,可是注册部分在壳中,壳脱了注册也就不用了

    这程序的输入表我是手工找到一部分,然后参照hying大哥给我的Konvertor 3.12A的输入表修复的

    真希望那位能说说手工输复输入表,因为没有谁具体说过,都是很抽象的,向我这样菜鸟根本搞不明白,
我看了很多资料也只看到,BPX GetVersion ,然后在u 那些未解决的地址,再看看上面或下面,找出正确的函数.但是并不是所有的都能这样解决.

    因为是初次接触Armadillo的壳,所以中文错误和不足之处可能不少,希望各高手指正,那样就太谢谢了

    :)                                                                                fwnl
                                                                                    2000.5.5
                                                                                      长沙