runsnake 发表于 2013-2-7 11:37:21

关于跟cmd启动的命令行式的程序交互的问题

用免费的ssh代理上网,其中登录ssh用plink.exe
有两个问题:
① 如何跟命令行程序交互?象用:
$sCmd = 'cmd.exe /d /c ""' & @ScriptDir & '\plink.exe" userID@xx.xx.xx.xx -P 443 -D 8848 -N -v -pw xxxx'"
$iPid = Run($sCmd, @TempDir, @SW_HIDE, 15)
$sStr = StdoutRead($iPID, True, False)
把$sCmd填入用户名,密码和IP后,就可以看到进程‘plink.exe’,也可以得到plink.exe里的一些信息(在变量$sStr里),现在的问题是如何跟plink.exe交互,如plink.exe要求输入‘y/n’来确定用户是不是要保存当前Cache,此时plink.exe只有进程,cmd界面已经隐藏了。但肯定能交互的,见下面的问题。

② 如何读出别的程序启动的plink.exe里的信息
如在这里https://www.usassh.net/free.php,里面提供免费的ssh代理,但上面只提供用户名和密码,不提供ip地址(以前可以用free.usassh.com,但现在不能用这个了),下载它的客户端,就可以用这上面的用户名密码登录ssh,从来用代理。发现这个客户端也是用plink.exe来登录ssh的(也是隐藏了cmd界面,只有plink.exe进程)。
    一则我发现这个客户端可以跟plink.exe交互,也就是问题①里的,它给plink.exe输入‘y’了,这是用什么方法做到的?(若是第一次用,就可以从log目录下log文件看到它读取的plink信息,但里面的ip地址是假的);
    二则就是怎么读取这个客户端启动的plink.exe里的信息,好得到ip呀。或者有什么别的方法知道plink里登录的ip

henry10423 发表于 2013-2-7 12:31:49

如果要交互,
推荐 cURL 很强大的传输模拟器,
之后配合Autoit 工作。
号称双面剑{:face (355):}

runsnake 发表于 2013-2-7 12:53:22

回复 2# henry10423


    这是什么东西?不会还是send, controlsend的那一套吧
若是普通的象程序界面发送字符,au3本身就有函数支持

我现在是不知道上面所提的那个客户端是如何做到跟cmd命令行程序交互的(向plink发送了'y'字符)

上面plink只是个例子,经常还有别的只在cmd下运行的程序,象上面那样运行后,就不知道如何跟程序交互了。我原来一直以为不可能交互的,结果今天我运行了这个客户端后,发现人家已经实现了。因为plink.exe并不是这家的,而是大家公知的一个开源程序。

runsnake 发表于 2013-2-7 19:57:32

我搜了下版面,也没有发现跟我问题相关的有价值的帖子

唯一还有点相关的,是这个:http://www.autoitx.com/forum.php?mod=viewthread&tid=35011&highlight=%B7%AD%C7%BD

看到Qokelate大侠写的“自制翻墙神器”里,居然也是提取usassh里的帐号密码。
但其ip还是用的free.usassh.com,不知你是怎么得到这个的(我得到这个是猜的),若是提取出来的,请告之下是如何提取的。

看了下大侠的源代码,也没有解决交互问题,得先在cmd运行plink一次,然后输入‘y’保存后,才在这个“自制翻墙神器”程序里好用。

b161033 发表于 2013-2-9 10:55:01

楼主你可以用findwindow获取它的句柄和窗口文本,再分析文本,发送按键y或n,再发送回车。试下看!

b161033 发表于 2013-2-9 11:04:09

或你可以用spawn,pipe方法,重定向输入输出来实现的要求,记得以前有个重定向cmd.exe的输入输出到文本框的程序。你看下。

Qokelate 发表于 2013-2-9 11:52:27

回复 1# runsnake


    你提到的这个问题可以通过ConsoleWrite解决,当时我写时没有那个交互提示,因此也没有加入处理,后来转向GoAgent了,帖子也一直没更新了

runsnake 发表于 2013-2-9 12:32:55

回复runsnake


    你提到的这个问题可以通过ConsoleWrite解决,当时我写时没有那个交互提示,因此也没 ...
Qokelate 发表于 2013-2-9 11:52 http://www.autoitx.com/images/common/back.gif

经测试,用ConsoleWrite不行的,再看了下它的帮助:This does not write to a DOS console unless the script is compiled as a console application..

可能是这个原因吧。我把脚本按上面说的编译成CUI的exe,还是不能跟plink交互的。真不知道我在一楼提的那个终端程序是怎么做到跟plink交互的。

===========================================
还是想再问Qokelate兄:你现在能得到usassh的免费帐号的ip或域名吗?现在那个free.usassh.com已经不能用了。

StdoutRead函数又无法从非脚本启动的plink里提取数据。

Qokelate 发表于 2013-2-9 12:35:45

本帖最后由 Qokelate 于 2013-2-9 12:38 编辑

回复 1# runsnake


    IP问题暂时还没找到有效的方案,貌似是服务器分配的

刚更新了下,可以参数下,测试 正常   While 是个死循环,实际应用时需要灵活一下    (见附件    )

里面没有的函数自己变通下即可,都是小问题

#include <Base.au3>


Local Const $sURL = 'https://www.usassh.net/free.php'
Local Const $sPLink_Exe = 'pLinkSSH.exe'
Local Const $sPLink_Path = @ScriptDir & '\' & $sPLink_Exe

Local $sParam = ' !!!@50.117.124.77 -P 443 -D 7070 -N -v -Z usassh -pw ###'

TCPStartup()
Local $sHexHTML = InetRead($sURL, 11)
TCPShutdown()


Local $sTextHTML = BinaryToString($sHexHTML, 4)


Local $sUser = StringRegExpPlus($sTextHTML, '免费SSH帐号.+\>(\w+)\<')
Local $sPWD = StringRegExpPlus($sTextHTML, '免费SSH密码.+\>(\w+)\<')
Local $sUpTime = StringRegExpPlus($sTextHTML, '更新时间.+\>([^\<]+)\s+')

$sParam = StringReplace($sParam, '!!!', $sUser)
$sParam = StringReplace($sParam, '###', $sPWD)

Local $nPID = Run('cmd.exe /d /c "' & $sPLink_Exe & $sParam & '"', @ScriptDir, @SW_HIDE, 15)

Local $sStd
While 1
        Sleep(5000)
        $sStd = StdoutRead($nPID, True, False)
        If StringInStr($sStd, 'Store key in cache? (y/n)') Then
                StdinWrite($nPID, 'y' & @CRLF & @CRLF)
                ExitLoop
        EndIf
WEnd

$sStd = StdoutRead($nPID, True, False)
MsgBoxT($sStd)
StdioClose($nPID)

Exit


runsnake 发表于 2013-2-9 13:03:06

回复 9# Qokelate


    谢谢,交互这个问题解决了。

你真厉害,能找到免费用的IP。能分享一下如何找到的吗?
不然,用上一段时又不能用了。

Qokelate 发表于 2013-2-9 13:03:22

再次分析了下EXE, 大概是从服务器获取一个XML文件,只要想办法得到这个XML即可
<server name="free" comment="鍏嶈垂鐢ㄦ埛绾胯矾" flag="12" load="79" ipaddr="50.117.124.77" type="obfucation" key="usassh" port="443"/><server name="s1娣锋穯鍔犲瘑" comment="鏂板姞鍧? flag="12" load="9" ipaddr="203.142.25.106" type="obfucation" key="usassh" port="443"/><server name="s2娣锋穯鍔犲瘑" comment="缇庡浗 鍔犲窞" flag="12" load="19" ipaddr="50.117.124.75" type="obfucation" key="usassh" port="443"/><server name="3娣锋穯鍔犲瘑" comment="缇庡浗 浜氱壒鍏板ぇ" flag="12" load="22" ipaddr="50.117.26.123" type="obfucation" key="usassh" port="443"/>

Qokelate 发表于 2013-2-9 14:57:26

本帖最后由 Qokelate 于 2013-2-9 14:58 编辑

吃完饭再搞果然大脑灵活不少,完全搞掂    喜欢蛋疼的自个蛋疼去

去兜红包鸟~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


#NoTrayIcon
#include <Base.au3>

Local Const $sServerXML = 'http://www.hostzzz.com/ssh/servers.xml'
Local Const $sURL = 'https://www.usassh.net/free.php'
Local Const $sPLink_Exe = 'pLinkSSH.exe'
Local Const $sPLink_Path = @ScriptDir & '\' & $sPLink_Exe

Local $sParam = ' !!!@*** -P 443 -D 7070 -N -v -Z usassh -pw ###'

TCPStartup()
Local $sHexHTML = InetRead($sURL, 11)
Local $sHexXML = InetRead($sServerXML, 11)
TCPShutdown()

Local $sTextHTML = BinaryToString($sHexHTML, 4)
Local $sXML_Text = BinaryToString($sHexXML, 4)
$sHexHTML = 0
$sHexXML = 0

Local $sFreeIP = StringRegExpPlus($sXML_Text, '(?mi)免费.+ipaddr=\"(+)\"')

Local $sUser = StringRegExpPlus($sTextHTML, '免费SSH帐号.+\>(\w+)\<')
Local $sPWD = StringRegExpPlus($sTextHTML, '免费SSH密码.+\>(\w+)\<')
Local $sUpTime = StringRegExpPlus($sTextHTML, '更新时间.+\>([^\<]+)\s+')

$sParam = StringReplace($sParam, '!!!', $sUser)
$sParam = StringReplace($sParam, '***', $sFreeIP)
$sParam = StringReplace($sParam, '###', $sPWD)

Switch @Compiled
        Case 0
                ConsoleWrite('IP=' & $sFreeIP & @CRLF)
                ConsoleWrite('User=' & $sUser & @CRLF)
                ConsoleWrite('Password=' & $sPWD & @CRLF)
                Run(StringAddDQM($sPLink_Exe) & $sParam, @ScriptDir)
        Case 1
                Local $nPID = Run('cmd.exe /d /c "' & $sPLink_Exe & $sParam & '"', @ScriptDir, @SW_HIDE, 15)
                Local $sStd
                For $a = 1 To 60
                        Sleep(1000)
                        $sStd = StdoutRead($nPID, True, False)
                        If StringInStr($sStd, 'Store key in cache? (y/n)') Then
                                StdinWrite($nPID, 'y' & @CRLF & @CRLF)
                                ExitLoop
                        EndIf
                Next
                StdioClose($nPID)
EndSwitch

Exit

runsnake 发表于 2013-2-10 00:47:52

吃完饭再搞果然大脑灵活不少,完全搞掂    喜欢蛋疼的自个蛋疼去

去兜红包鸟~~~~~~~~~~~~~~~~~~~~~~~~~~ ...
Qokelate 发表于 2013-2-9 14:57 http://www.autoitx.com/images/common/back.gif


    厉害,实在感谢,一楼的两个问题完美解决!

另外,您是怎么找到'http://www.hostzzz.com/ssh/servers.xml'的?
我解压了那个终端程序USAssh.exe,把里的所有文件都看了一遍,都没有看见这样的地址。
有点贪了,很想您授渔于我,当然,不管怎么样,都很是感谢你的授我于鱼!

Qokelate 发表于 2013-2-10 00:53:11

回复 13# runsnake


    文件是从服务器读取的,打开客户端,登录,想办法把程序内存数据Dump下来即可(卖个小关子,自己想办法,别做伸手党)

{:face (356):}

runsnake 发表于 2013-2-10 01:49:16

正在努力学习如何得到这个文件的地址的。
应该这个字串'http://www.hostzzz.com/ssh/servers.xml'是写在exe里的。
你说的有点高级:读取程序在内存的数据
我想,那个程序运行后,抓包,也应该能得到这个字符串。反正它一定会去访问这个地址的。
页: [1] 2 3
查看完整版本: 关于跟cmd启动的命令行式的程序交互的问题