• 标 题:Armadillo.exe的脱壳(2。50),请诸位大侠指教!! (2千字)
  • 作 者:yahoo007
  • 时 间:2002-4-15 21:09:24
  • 链 接:http://bbs.pediy.com

Armadillo.exe的脱壳(2.50)

在hying和zombieys两位大虾的指教下,初试脱armadillo.exe,没有想到意外成功
以下不妥的地方还请诸位大侠多多指教

我用TRW装载Armadillo.exe(2。50)。按照zombieys大虾的方法,bpx virtualprotect.共中断27次后,
按F12进入armadillo的领空。在下面:
0167:004C7DB3  MOV      CL,[EBP+0C]
0167:004C7DB6  PUSH    ECX
0167:004C7DB7  CALL    NEAR [EBP-3C]  《====进入
0167:004C7DBA  ADD      ESP,BYTE +08
0167:004C7DBD  MOV      [EBP-10],EAX
0167:004C7DC0  PUSH    DWORD 004D01B4
0167:004C7DC5  CALL    004C9798
0167:004C7DCA  ADD      ESP,BYTE +04
0167:004C7DCD  CALL    NEAR [004D2EF0]
0167:004C7DD3  PUSH    BYTE +00
0167:004C7DD5  PUSH    BYTE +00

进入后,来到下面:
0167:00C9C827  MOV      ECX,[EAX+20]
0167:00C9C82A  XOR      ECX,[EAX+1C]
0167:00C9C82D  XOR      ECX,[EAX+10]
0167:00C9C830  ADD      EDI,ECX
0167:00C9C832  CALL    `KERNEL32!GetCommandLineA`
0167:00C9C838  PUSH    EAX
0167:00C9C839  PUSH    EBX
0167:00C9C83A  PUSH    EBX
0167:00C9C83B  CALL    ESI
0167:00C9C83D  PUSH    EAX
0167:00C9C83E  CALL    EDI        《=====edi=41dc2c.(oep)
0167:00C9C840  MOV      ESI,EAX
0167:00C9C842  POP      EDI
0167:00C9C843  MOV      EAX,ESI
0167:00C9C845  POP      ESI
0167:00C9C846  POP      EBX
0167:00C9C847  RET   
进入41dc2c后,用makepe命令,dump出一个文件a.exe
用LoadPE分析原文件Armadillo.exe,选择“PE Editor”。点击“Sections”
看看“.rsrc”部分。Voffset=38000,VSize=8BE00.它的尾部是c3e00.加
imagebase 400000应该是4c3e00.我选择4c3f00为hying大虾的那段代码的
起始点。同时记下SizeOfImage
重新运行原文件Armadillo.exe,下bpx virtualalloc.断下后,记下该函数
的指针。取消断点。下断在入口点处:bpx 41dc2c.断下后,将eip改为我们
选定的地方:4c3f00.在这里,我们将hying大虾的那段代码写入。
6804000000 push    PAGE_READWRITE
6800100000 push    MEM_COMMIT
6800001100 push    110000h        <-申请内存的大小,可大一点。
6800000000 push    0
e8xxxxxxxx call    VirtualAlloc    <-申请内存
          mov    edi,eax          <--记下eax的值,假如为fa0000
          mov    ecx,????    <-文件映象大小减1000h,假如为xxxxxx
          mov    esi,401000h    <-基址加1000h,有的程序不是这个值
          rep  movsb
当rep bovsb指令运行完后,从fa0000开始的xxxxxx字节数据,用W命令保存为文件1.bin.
将eip改为原入口点。退出原程序。
用winhex打开dump出的文件a.exe,在offset 1000处将1.bin文件写入。存盘。
我们运行a.exe文件,出错!记下出错地址。再运行原Armadillo.exe,在出错地址设断。
断下后看看出错地址的内存,按PageUp键,上下看看内存,把上下??之间内存数据,
用W命令写入文件2.bin中,记下RVA(开始地址-400000)和size。用LoadPE打开dump文件a.exe,
增加一个sections,记住新增的offset.用winhex打开a.exe,将2.bin文件写入。
运行a.exe文件,呵呵,又出错了。记下出错地址,仿照上述办法,保存为bin文件,写入
a.exe文件中。再运行dump文件,呵呵,成功了。
armadillo2。5后的版本也可仿照此办法。
不正确、不清楚的地方,请诸位大侠多多指教。