当当养“鸡”专业户:pi2.2.0脱壳及连接200限制去除逆向工程
【文章标题】: 当当养“鸡”专业户!<br />【文章作者】: KOOK1991<br />
【作者邮箱】: WeKnow@163.com<br />
【作者QQ号】: 371161181<br />
【软件名称】: Poison Ivy 2.2.0<br />
【下载地址】: http://www.poisonivy-rat.com/<br />
【加壳方式】: 未知<br />
【编写语言】: Borland Delphi 6.0 - 7.0<br />
【使用工具】: OllyICE、LoadPE、ImportREC、Topo<br />
【操作平台】: Win9x/NT/2000/XP<br />
【软件介绍】: 国外知名木马,服务端才几KB,强!<br />
【作者声明】: 我是菜鸟我怕谁!!!<br />
--------------------------------------------------------------------------------<br />
【详细过程】<br />
<br />
初中的时候一直认为拥有几千台肉鸡才叫“黑客”。眨眼间,两三年过去了,终于理解了“黑客”的真意,决心来看雪好<br />
好学学。无奈高手太多,使我无地自容,近来偶有感想,便拿出来显摆显摆……<br />
<br />
Poison Ivy,知道吧?很有名气的木马,可就不知道为啥在国内火不起来,但我挺爱用。(受不了一些哥们,这么小的木<br />
马不用,成天背着几百KB的鸽子满天飞……)好东西总有限制,Poison Ivy 2.2.0也不例外,限制最大连接数为200。<br />
于是我抄起了家伙,上路了……<br />
<br />
首先,阐述一下这回的破解目标:<br />
<br />
对Poison Ivy 2.2.0进行逆向工程,增加自定义最大连接数的功能,以方便我们使用。让更多的人成为养“鸡”专业户,<br />
从而脱贫、致富、奔小康!!!!!!<br />
<br />
用PEiD查不出来壳,无奈。直接用OllyICE上,停在入口点:<br />
<br />
005A3060 >60 pushad<br />
005A3061 E8 00000000 call 005A3066<br />
005A3066 5D pop ebp<br />
005A3067 81ED 725B4000 sub ebp, 00405B72<br />
005A306D 64:A1 30000000mov eax, dword ptr fs:<br />
005A3073 0FB640 02 movzx eax, byte ptr <br />
005A3077 0AC0 or al, al<br />
005A3079 74 04 je short 005A307F<br />
005A307B 33C0 xor eax, eax<br />
<br />
经验太少,看不出是什么壳:-(直接上。走过005A3060,直接用ESP定律“HE 0012FFA4”,F9运行,卡到这里:<br />
<br />
005A3711 50 push eax ; PI.005A36C0<br />
005A3712 33C0 xor eax, eax<br />
005A3714 64:FF30 push dword ptr fs:<br />
005A3717 64:8920 mov dword ptr fs:, esp<br />
005A371A EB 01 jmp short 005A371D<br />
005A371C 8700 xchg dword ptr , eax<br />
005A371E 0000 add byte ptr , al<br />
005A3720 0000 add byte ptr , al<br />
005A3722 0000 add byte ptr , al<br />
005A3724 0000 add byte ptr , al<br />
<br />
F8一路向前<br />
<br />
005A371D 0000 add byte ptr , al ; 访问违规:正在写入到<br />
<br />
Shift F8,来到:<br />
<br />
7C92EAF0 8B1C24 mov ebx, dword ptr <br />
7C92EAF3 51 push ecx<br />
7C92EAF4 53 push ebx<br />
7C92EAF5 E8 C78C0200 call 7C9577C1<br />
7C92EAFA 0AC0 or al, al<br />
7C92EAFC 74 0C je short 7C92EB0A<br />
7C92EAFE 5B pop ebx<br />
7C92EAFF 59 pop ecx<br />
7C92EB00 6A 00 push 0<br />
7C92EB02 51 push ecx<br />
7C92EB03 E8 11EBFFFF call ZwContinue<br />
7C92EB08 EB 0B jmp short 7C92EB15<br />
7C92EB0A 5B pop ebx<br />
7C92EB0B 59 pop ecx<br />
7C92EB0C 6A 00 push 0<br />
7C92EB0E 51 push ecx<br />
7C92EB0F 53 push ebx<br />
7C92EB10 E8 3DF7FFFF call ZwRaiseException<br />
<br />
Alt F9返回:<br />
<br />
00519B33 00B0 97510055 add byte ptr , dh<br />
00519B39 8BEC mov ebp, esp ; 来到这里<br />
00519B3B 83C4 F0 add esp, -10<br />
00519B3E B8 D8975100 mov eax, 005197D8<br />
00519B43 E8 1CD0EEFF call 00406B64<br />
00519B48 A1 ACCF5100 mov eax, dword ptr <br />
00519B4D 8B00 mov eax, dword ptr <br />
00519B4F E8 1822F7FF call 0048BD6C<br />
00519B54 A1 ACCF5100 mov eax, dword ptr <br />
00519B59 8B00 mov eax, dword ptr <br />
00519B5B BA 989B5100 mov edx, 00519B98 ; ASCII "Poison Ivy"<br />
00519B60 E8 FF1DF7FF call 0048B964<br />
00519B65 8B0D 90CE5100 mov ecx, dword ptr ; PI.0051F368<br />
00519B6B A1 ACCF5100 mov eax, dword ptr <br />
00519B70 8B00 mov eax, dword ptr <br />
00519B72 8B15 E8FB5000 mov edx, dword ptr ; PI.0050FC34<br />
00519B78 E8 0722F7FF call 0048BD84<br />
<br />
哈哈,来到OEP,很熟悉的Delphi开头。用LoadPE修正镜像大小,完全Dump。再打开ImportREC,OEP填上00119B38,自动查<br />
找INT -> 获取输入表 -> Fix Dump,脱壳OK~~~~~<br />
<br />
为了保险起见,再用PEiD查一下脱壳后的文件――“Borland Delphi 6.0 - 7.0”,呵呵,没错,就是你!!<br />
<br />
用Dede打开脱壳后的Poison Ivy,Dede卡住了,看来作者不是吃素的。<br />
<br />
只好用OllyICE载入脱壳后的Poison Ivy -> Ultra String Reference -> Find ASCII。看了半天,终于找到了一句有用的<br />
String:<br />
<br />
Ultra String Reference, 条目 1813<br />
Address=0051170A<br />
Disassembly=mov edx, 00511844<br />
Text String=please assign a password for the connection:<br />
<br />
Ultra String Reference, 条目 1814<br />
Address=0051170F<br />
Disassembly=mov eax, 0051187C<br />
Text String=new connection<br />
<br />
直接双击来到这里<br />
<br />
005116CD|.50 push eax ; /Parm<br />
005116CE|.68 7E660480 push 8004667E ; |Cmd = FIONBIO<br />
005116D3|.56 push esi ; |Socket<br />
005116D4|.E8 D7BDF7FF call ; \ioctlsocket<br />
005116D9|.81BB 3C070000>cmp dword ptr , 0C8<br />
005116E3|.7C 0B jl short 005116F0<br />
005116E5|.56 push esi ; /Socket<br />
005116E6|.E8 8DBDF7FF call ; \closesocket<br />
005116EB|.E9 F7000000 jmp 005117E7<br />
005116F0|>8D45 F4 lea eax, dword ptr <br />
005116F3|.8B15 ACF35100 mov edx, dword ptr <br />
005116F9|.E8 0632EFFF call 00404904<br />
005116FE|.803D 9DF35100>cmp byte ptr , 0<br />
00511705|.74 12 je short 00511719<br />
00511707|.8D4D F4 lea ecx, dword ptr <br />
0051170A|.BA 44185100 mov edx, 00511844 ;please assign a password for the connection:<br />
0051170F|.B8 7C185100 mov eax, 0051187C ;new connection<br />
00511714|.E8 AB41F2FF call 004358C4<br />
00511719|>8D4D C8 lea ecx, dword ptr <br />
<br />
哈哈,众里寻他千百度,蓦然回首――小样,你在这啊:<br />
<br />
005116D9|.81BB 3C070000 C8000000 cmp dword ptr , 0C8 ; 比较当前连接数和0C8(就是200嘛)<br />
005116E3|.7C 0B jl short 005116F0 ; 小于200则跳<br />
005116E5|.56 push esi ; /Socket<br />
005116E6|.E8 8DBDF7FF call ; \closesocket 断开连接<br />
<br />
可见在005116DF处的C8000000就是最大连接数,记住这个地址,后面有用的哦。<br />
<br />
找到了判断最大连接数的地方,可以直接把005116E3改成JMP,但有一点,假如你肉鸡太多,岂不被DDos了?看来这点还不<br />
够,我们还得控制最大连接数,也就是让程序随我们的意愿来自动修改005116DF处的最大连接数。考虑了半天,我决定用<br />
Poison Ivy的配置文件Poison Ivy.ini来保存欲设的最大连接数,以便我们在具体应用时方便地修改。<br />
<br />
先看看Poison Ivy.ini的内容吧!<br />
<br />
; 软件的启动模式(是否显示使用协议)<br />
Show=1<br />
; 软件的窗口及控件的大小设置<br />
MaximizedState=0<br />
Top=491<br />
Left=330<br />
Width=744<br />
Height=231<br />
ConTop=145<br />
ConLeft=110<br />
ConWidth=650<br />
ConHeight=380<br />
Column0=50<br />
Column1=90<br />
Column2=90<br />
Column3=80<br />
Column4=80<br />
Column5=60<br />
Column6=45<br />
Column7=63<br />
Column8=67<br />
Column9=50<br />
Column10=57<br />
DataTransfers=0<br />
; 很明显是有关控制端的配置信息,就把最大连接数存这吧<br />
ScrSize=75<br />
ScrBits=24<br />
ShareTo=<br />
ShareToSocks=<br />
ShareSocks=0<br />
Port=3460<br />
Password=admin<br />
BalloonTip=1<br />
MinimizeTray=1<br />
CloseTray=0<br />
Prompt=0<br />
PromptExit=0<br />
SimTransfers=2<br />
SDrounds=3<br />
Cache=1<br />
WindowColor=1<br />
TimestampColor=1<br />
KeynameColor=1<br />
WindowName=008000<br />
Timestamp=0000FF<br />
Keyname=808080<br />
PromptDelete=1<br />
AutoRefresh=0<br />
TreeLayout=1<br />
AutoLookUpdates=1<br />
AutoRemove=1<br />
HidePW=0<br />
; 配置被控端的信息1<br />
DNS=127.0.0.1:3460,<br />
ID=<br />
Password=admin<br />
Socks4=0<br />
S4DNS=<br />
; 配置被控端的信息2<br />
Startup=0<br />
ActiveXKey={1B4B734A-CC89-9B4A-0705-060108040104}<br />
<br />
Filename=<br />
Copy=0<br />
CopySystem=1<br />
CopyWindows=0<br />
Melt=0<br />
Keylogger=0<br />
Persistence=0<br />
; 配置被控端的信息3<br />
ProcessMutex=)!VoqA.I4<br />
KeyLoggerMutex=VLC9032Ca<br />
CustomInject=0<br />
CustomInjectProc=msnmsgr.exe<br />
<br />
我就决定在里添加一个子项“Crack”,用它来控制最大连接数,OK,开工!!!!<br />
<br />
要在配置文件中添加最大连接数的信息,最重要的就是读出最大连接数,那我没就必须找到程序是如何读配置文件的。重<br />
新回到OllyICE中看String:<br />
<br />
Ultra String Reference, 条目 1931<br />
Address=00514609<br />
Disassembly=mov edx, 00514C28<br />
Text String=settings<br />
<br />
Ultra String Reference, 条目 2070<br />
Address=0051591E<br />
Disassembly=mov edx, 00516828<br />
Text String=settings<br />
<br />
其中有很多的Settings,我只选了两处,因为其他的Settings都分布在这两处附近:<br />
<br />
00514609处:<br />
<br />
005145EB|.50 push eax<br />
005145EC|.B9 5C4C5100 mov ecx, 00514C5C ;sharetosocks<br />
005145F1|.BA 284C5100 mov edx, 00514C28 ;settings<br />
005145F6|.8B45 FC mov eax, dword ptr <br />
005145F9|.8B30 mov esi, dword ptr <br />
005145FB|.FF56 04 call dword ptr <br />
005145FE|.A0 A7F35100 mov al, byte ptr <br />
00514603|.50 push eax<br />
00514604|.B9 744C5100 mov ecx, 00514C74 ;sharesocks<br />
00514609|.BA 284C5100 mov edx, 00514C28 ;settings<br />
0051460E|.8B45 FC mov eax, dword ptr <br />
00514611|.8B30 mov esi, dword ptr <br />
00514613|.FF56 14 call dword ptr <br />
00514616|.A1 7CF35100 mov eax, dword ptr <br />
0051461B|.50 push eax<br />
0051461C|.B9 884C5100 mov ecx, 00514C88 ;port<br />
00514621|.BA 284C5100 mov edx, 00514C28 ;settings<br />
00514626|.8B45 FC mov eax, dword ptr <br />
00514629|.8B30 mov esi, dword ptr <br />
0051462B|.FF56 0C call dword ptr <br />
0051462E|.A1 ACF35100 mov eax, dword ptr <br />
00514633|.50 push eax<br />
00514634|.B9 984C5100 mov ecx, 00514C98 ;password<br />
00514639|.BA 284C5100 mov edx, 00514C28 ;settings<br />
0051463E|.8B45 FC mov eax, dword ptr <br />
00514641|.8B30 mov esi, dword ptr <br />
00514643|.FF56 04 call dword ptr <br />
00514646|.A0 9AF35100 mov al, byte ptr <br />
<br />
0051591E处:<br />
<br />
005158F8 .50 push eax<br />
005158F9 .B9 5C685100 mov ecx, 0051685C ;sharetosocks<br />
005158FE .BA 28685100 mov edx, 00516828 ;settings<br />
00515903 .8B45 F8 mov eax, dword ptr <br />
00515906 .8B18 mov ebx, dword ptr <br />
00515908 .FF13 call dword ptr <br />
0051590A .8B55 A4 mov edx, dword ptr <br />
0051590D .B8 B4F35100 mov eax, 0051F3B4<br />
00515912 .E8 A9EFEEFF call 004048C0<br />
00515917 .6A 00 push 0<br />
00515919 .B9 74685100 mov ecx, 00516874 ;sharesocks<br />
0051591E .BA 28685100 mov edx, 00516828 ;settings<br />
00515923 .8B45 F8 mov eax, dword ptr <br />
00515926 .8B18 mov ebx, dword ptr <br />
00515928 .FF53 10 call dword ptr <br />
0051592B .A2 A7F35100 mov byte ptr , al<br />
00515930 .68 840D0000 push 0D84<br />
00515935 .B9 88685100 mov ecx, 00516888 ;port<br />
0051593A .BA 28685100 mov edx, 00516828 ;settings<br />
0051593F .8B45 F8 mov eax, dword ptr <br />
00515942 .8B18 mov ebx, dword ptr <br />
00515944 .FF53 08 call dword ptr <br />
00515947 .A3 7CF35100 mov dword ptr , eax<br />
0051594C .68 98685100 push 00516898<br />
00515951 .8D45 A0 lea eax, dword ptr <br />
00515954 .50 push eax<br />
00515955 .B9 A8685100 mov ecx, 005168A8 ;password<br />
0051595A .BA 28685100 mov edx, 00516828 ;settings<br />
0051595F .8B45 F8 mov eax, dword ptr <br />
00515962 .8B18 mov ebx, dword ptr <br />
00515964 .FF13 call dword ptr <br />
00515966 .8B55 A0 mov edx, dword ptr <br />
<br />
具体谁是程序开始运行时读取Poison Ivy.ini的地方,不知道。分别下断点,0051591E在开始时断下来,00514609在结束<br />
时断下来,可见0051591E是读取Poison Ivy.ini,00514609是保存Poison Ivy.ini,知道了这些,继续!!<br />
<br />
分析一下,程序是如何读取Poison Ivy.ini里的内容的:<br />
<br />
00515930 .68 840D0000 push 0D84 ;压入默认端口<br />
00515935 .B9 88685100 mov ecx, 00516888 ;port INI中保存端口信息的子项名称<br />
0051593A .BA 28685100 mov edx, 00516828 ;settings INI中保存端口信息的项名称<br />
0051593F .8B45 F8 mov eax, dword ptr <br />
00515942 .8B18 mov ebx, dword ptr <br />
00515944 .FF53 08 call dword ptr ;进行读取<br />
00515947 .A3 7CF35100 mov dword ptr , eax ;把读取的值保存到51F37C<br />
<br />
00515930处之所以要把默认端口压入,是因为程序怕在读不出配置文件中port这一子项时,使用0来做端口导致出错,可<br />
见“push 0D84”的作用是让程序在00515944读不出配置文件该项时采用备用值0D84。<br />
<br />
好了,打开Topo差入100字节代码空间,(本人懒得去找了可用空间了,还是用工具吧,100字节肯定够用。)Topo中显示<br />
100字节加到了005A3A33,下面开始添加代码:<br />
<br />
首先,用OllyICE二进制编辑005A3A33,加入字符串“Crack”。(别忘了在“Crack”后加“00”。)<br />
<br />
接着,在005A3A39处添加我们的代码:<br />
<br />
005A3A39 68 840D0000 push 0C8 ; 压入默认最大连接数,保存备用值200<br />
005A3A3E B9 333A5A00 mov ecx, 005A3A33 ; ASCII "Crack" INI中保存最大连接数的子项名称<br />
005A3A43 BA 28685100 mov edx, 00516828 ; ASCII "Settings"INI中保存最大连接数的项名称<br />
005A3A48 8B45 F8 mov eax, dword ptr <br />
005A3A4B 8B18 mov ebx, dword ptr <br />
005A3A4D FF53 08 call dword ptr ; 进行读取<br />
005A3A50 A3 DF165100 mov dword ptr , eax ; 把读取的最大连接数保存到上文提到的005116DF处,替换原来的最大连接数<br />
<br />
方便起见,就让程序从00515930处跳到我们这里吧,即:<br />
<br />
00515930 .68 840D0000 push 0D84<br />
<br />
改为:<br />
<br />
00515930 .- E9 04E10800 jmp 005A3A39<br />
<br />
为了使程序正常运行我们还要在005A3A50的下面加入如下代码:<br />
<br />
005A3A55 68 840D0000 push 0D84 ; 把00515930原有功能修改了,最后还是要加上的,所谓“有借有还,再借不难”<br />
005A3A5A- E9 D61EF7FF jmp 00515935 ; 回归原位,这就相当于台湾再咋拗,到头还是得回归咱中国,呵呵:-)<br />
<br />
OK,用OllyICE保存EXE文件,让我来测试一下……<br />
<br />
打开Poison Ivy.ini在下加入Crack=0,呵呵一个也连接不上了。把Crack=0改为10000,哈哈,肉鸡出现了!!<br />
再把Crack=0删除,哦~~~~,肉鸡又出现了!!!!!成功!!!!!<br />
<br />
最后,给有对本文兴趣的朋友留个小作业:继续对00514609处进行逆向工程,使程序可以在关闭时自动保存当前的最大连<br />
接数……OK,就到这把!!!<br />
<br />
頁:
[1]