手脱 UltraProtect 1.x -> RISCO Software Inc

来源:互联网 发布:利拉德职业生涯数据 编辑:程序博客网 时间:2024/05/01 16:44

 

手脱 UltraProtect 1.x -> RISCO Software Inc.

用PEID 查壳

用OD 载入。。。

分析代码。。。。 不选非法访问内存!!!

可以用ESP定律来取得它的入口地址。。

当然首先应该看一下它是否被抽取了入口代码,将它们隐藏起来了。。

载入后后,可以对代码进行分析,用最后一次异常的方法来到那个 ret 然后打开内存镜像,在代码处内存访问断点,来到程序OEP,发现程序的OEP 被抽取了。。

那么我就来将抽取的OEP 找出来吧。。。

可以运用ESP 定律。。。因为 UltraProtect 1.x -> RISCO Software Inc.

用 fi 看是 1.4x 的,是一个高版本。。。所以不能像拖地版本那样,运行后来到

最后一次异常的 ret 后,在此处 用跟踪的方法 设置命令 push ebp 去搜索 程序

的入口地址。。当然,如果是 BC++ , 汇编的,这就根本不行了,,它们的入口比较特殊。。。

用ESP 定律,暂停后,用F9 继续走,知道拷到 push ebp.. 此时,你就要对程序入口的代码比较熟悉了。。。

通过比较,我们可以发现:

mov eax, dword ptr [4DE3C0]

shl eax, 2

mov dword ptr [4DE3C4], eax

这是 BC++ 的头。。。让我们将它进行二进制复制下来吧。。。

A1 C0 E3 4D 00 C1 E0 02 A3 C4 E3 4D 00

 

应为 BC++ 的头

机器码为

PUSH EDI ************** 57

PUSH ECX ************** 51

XOR EAX,EAX************ 33c0

这三个是固定的,它的汇编代码也是不变的。。。所以只要确定它们就可以:

MOV EDI,BC++.XXXXXXXX(当然这应该是具体的地址!!哈哈)

MOV ECX,BC++.YYYYYYYY

机器码:

****** BF XXXXXXXX

****** B9 YYYYYYYY

 

那个具体的地址怎么确定呢??

通过对汇编的分析,我们只要找到 cmp ecx,edi 就可以了。。应为通过数据窗口会出现:

edi=00501404 (epromm51.00501404)

ecx=01509890 (epromm51.01509890)

我们就能将地址捕获。。。。哈哈。。 那么我们怎么去捕获他们呢??

具体的,我们必须来到程序的OEP 从那寻找我们的答案。。。。

现在我们运用一种可以快速到达 OEP 的方法;

首先,重新载入程序,忽略所有异常(这招好酷哦!),打开内存镜像,在idata

处,下内存写入断点,shift+F9, 暂停后,再次打开堆栈。删除内存断点,

在 .text 处下内存访问断点 shift+F9运行(连续两次)。

就能来到程序 OEP 。。如果没有看到:

00401000 19 db 19

00401001 D6 db D6

00401002 28672701 dd epromm51.01276728

00401006 4B db 4B ; CHAR 'K'

00401007 56 db 56 ; CHAR 'V'

00401008 25 db 25 ; CHAR '%'

00401009 30 db 30 ; CHAR '0'

0040100A 5A db 5A ; CHAR 'Z'

0040100B 4D db 4D ; CHAR 'M'

0040100C 6F db 6F ; CHAR 'o'

0040100D 57 db 57 ; CHAR 'W'

0040100E 7A db 7A ; CHAR 'z'

0040100F E0 db E0

00401010 E0 db E0

00401011 35 db 35 ; CHAR '5'

00401012 7C db 7C ; CHAR '|'

00401013 49 db 49 ; CHAR 'I'

00401014 02 db 02

00401015 6E db 6E ; CHAR 'n'

00401016 40 db 40 ; CHAR [email='@']'@'[/email]

00401017 0B db 0B

00401018 CE db CE

00401019 A1 db A1

0040101A . 16 push ss

0040101B . 3BCF cmp ecx, edi //重点在这呀!当程序运行到它

一切就搞定了。。

0040101D . 76 05 jbe short 00401024

这个,那你就对代码进行分析一下,你就会发现了。。。哈哈,好慢呀!!

数据框出现:

edi=00501404 (epromm51.00501404)

ecx=01509890 (epromm51.01509890)

现在一切工作的差不多了,将它们的二进制代码弄出来粘上去就完成的讲抽取的

OEP 给弄回来了,只要在重建一下 EIP 就行了。。。

这还有一个要注意的地方就是在 组建二进制数据时,注意低位与高位数据的安排顺序,很重要,不然就会出错。。同一命令从左向右,当是多字节例如 BF 00501404

就应该将为 BF 04145000。 其他类似。。

A1 C0 E3 4D 00 C1 E0 02 A3 C4 E3 4D 00 57 51 33 C0 BF 04 14 50 00 B9 90

98 50 01

 

以下是BC++ 程序代码的头:

00401000 > $ A1 A8534B00 MOV EAX,DWORD PTR DS:[4B53A8]

00401005 . C1E0 02 SHL EAX,2

00401008 . A3 AC534B00 MOV DWORD PTR DS:[4B53AC],EAX

0040100D . 57 PUSH EDI

0040100E . 51 PUSH ECX

0040100F . 33C0 XOR EAX,EAX

00401011 . BF 88DA4C00 MOV EDI,BC++.004CDA88

00401016 . B9 C0358D00 MOV ECX,BC++.008D35C0

0040101B . 3BCF CMP ECX,EDI

0040101D . 76 05 JBE SHORT BC++.00401024