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
长沙
- 标 题:Armadillo 2.5x 加壳的Konvertor 3.13脱壳 (5千字)
- 作 者:fwnl
- 时 间:2002-5-5
12:44:46
- 链 接:http://bbs.pediy.com