用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 <jmp.&wsock32.#12> ; \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 <jmp.&wsock32.#3> ; \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 <jmp.&wsock32.#3> ; \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,就到这把!!!