前言 之前开源过一个向日葵识别码读取的项目,版本号是向日葵正式版,基于配置文件读取账号以及基于内存方式读取密码。可是上述方案无法迁移到企业版的向日葵,而且刚好有个客户通过一些渠道加上我,同时也愿意花钱让我帮帮忙,实现企业级的向日葵识别码读取。好吧,最近太穷了,迫于生活,抱着研究研究的态度看看吧!
分析 基于配置文件的向日葵识别码分析 首先回到正式版的向日葵,它能够实现读取,好在向日葵app有把自身的识别码保存在配置文件中,具体路径在于:
1 "C:\Program Files (x86)\Oray\SunLogin\SunloginClient\config.ini"
但是不一定是保存在C盘中,不过没关系,除了盘符不同,子目录下基本保持一致!所以可以直接遍历,比如4个盘,遍历以下路径:
1 2 3 4 "C:\Program Files (x86)\Oray\SunLogin\SunloginClient\config.ini" "D:\Program Files (x86)\Oray\SunLogin\SunloginClient\config.ini" "E:\Program Files (x86)\Oray\SunLogin\SunloginClient\config.ini" "F:\Program Files (x86)\Oray\SunLogin\SunloginClient\config.ini"
另外,由于系统版本问题,也可能不在x86下,可能保存在该配置下
1 :\Program Files\Oray\SunLogin\SunloginClient\config.ini
基于上述文件,很容易就可以找到配置相关信息。完整的配置文件信息如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 [base] config_path=C:\ProgramData\Oray\SunloginClient\config.ini tracksvr= macaddress=K38:00:25:bf:47:17 encry_pwd=zZNAl3FMvk8= has_uu=0 showupdatetip=0 hostname=default hostdesc= level= levelname= levelchanel= istransfer= ismessage= expires= skin= sunlogincode= isfastcodelogin=1 logintype=2 license=3d50-9013-a392-66da licensepsw= fastcode=k967594961 fastcodepsw=RaBYp76DzfcZNAhdIB1Qz5lUflair4zi sunloginserver=rc10-fc.oray.com:443 slapiserver=slapi.oray.net account= language=0 first_run=0 green_tip=3 lastview=1 open_eyes=0 screenshots_path=C:\Users\lenovo\Documents\Sunlogin Files [green] startup=1
通过比对,可以很容易发现 [base] 下的 fastcode 就是我们想要找的向日葵识别码 967594961!
OK啊,基于上述原理,回到企业版的向日葵,客户反馈说用之前开源的东西不得行。刚接手时,个人觉得是不是配置文件发生了变更,或者版本不对。
所以第一步就是装上了向日葵企业版,并且保持版本信息和客户一致!
初步检索,发现配置文件好像好存在,通过everything检索sunlonginclient发现有关的config和之前路径相同,但是比对发现问题,ini配置文件的code和真实的识别码并不是相同的。
所以我个人的猜测应该是旧版本卸载时没有清理干净..无语
ok,果然把有关的config.ini删除,然后重启向日葵,发现config并没有重新生成,所以,软件之间的映射关系消失了….
但是有个很敏感的文件,在于sunlogin下的config,这个是安装时生成的,但是其中并没有相关的code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 [base] installautorun= no_window_user_pwd=0 isopened=1 config_path=D:\向日葵\SunloginClient\config.ini tracksvr= macaddress=C2:73:B1:D9:55:79 has_uu=0 showupdatetip=0 language=0 enable_print=0 width=1920 height=1080 open_eyes=1 screenshots_path=C:\Users\lenovo\Documents\Oray\Sunlogin Files hostname=default hostdesc= level= levelname= levelchanel= istransfer= ismessage= expires= security_tips_display=1 skin= isfastcodelogin=1 logintype=2 slapiserver=slapi.oray.net account= login_duration=1000 remindtime=2022-05-15 15:16:18 access_token= refresh_token= access_token_expires_time= login_event_upload=1 need_upload_asset=0 openmicrolive=0 publish_time=1653117355 selectmode=2 updatemode=1 cpu=5sB4yWxK+5xBGLBPCzmvfr6/qAZCykVTDFNpwZXXnNpu4na9sozb7VRFMfBQ/+7aMUp7rNF5qPe6w7iQDEsj3l+j5cWlEAaJa7Xi+LbD5QHY8g9g7KBqXmOkoY/3czZGBhzF8wLQtVa/iGN7PlmrP+RbT+SX8uUdX9mEEtZMBOC9y2EqMzgVtvnhqbn7bMoP59PxQaqYTUhGmDfuffwNXLxj0cagh/PgwZLo5mTm2ETaMM0qyrFSbjPgrpsNK6kamO1DE2PZy5YFwuLBjzv3Iw== memory=Ct7HM1VSRxw= baseboard=5sB4yWxK+5xBGLBPCzmvfvcfONrfh+Zm9dRTootVyVt7uAeeptNvPFbUzz9Yg4IJjbdh5Q9Rte66w7iQDEsj3omcQ/tsAjOSeHMxc/ayoOOlRoc0gQviB4sN9A0jJmL09M2fkab0Zq5nI8oUBDBv92bkGu7uvXVYgMHmWo/6lwloFSpk/PBbvCXCzFxsx1RRCmEf8RlGxbQ= videocontroller=5sB4yWxK+5xBGLBPCzmvfpsNW6EnJEuGOc7oETI5Ni+C0sF509/x+XFYDwqtMZcSisgy62axgUG6w7iQDEsj3mNkFnsL1xFvVEi9/bVyWZMZG72DkwdZHHFMqqq6AyDcDhq/1nXFC1Q3FkK/Owh1mm+eyt2uGFOI0tFpTLSVFou6Mt9EpzclfZlVCRnNNH/P8F7ufnmq4Ez3drczjnAEkw== networkadapter=5sB4yWxK+5xBGLBPCzmvfsalJM6xa19LH5HD5xCDQQMJJh6vp1m8xXvlVLzFjvUbiPvZfxwAXCS6w7iQDEsj3qyI8sWNrcesDe9e5cjJtoGkaVgXejjp+/nhqbn7bMoP59PxQaqYTUhGmDfuffwNXOfFQ9Zn4xqr9mFd5ZXYcXgGisa5i7SyGw== desktop_monitor_info=5sB4yWxK+5xBGLBPCzmvfhw0dGh5C3dN1mGjS0qBtuBaMq21IZR8LqBzqfg/MgjCGiJgUXGoUt+6w7iQDEsj3gulQBqIB9nGI1IWKg2XOXuRQN8GcntdhJjq0E6ee+tmG+Wr3fbsZ/QsslsRSb0wKTqBMOycjRURZuQa7u69dVgL/zVPlis6cyIdbEgErMBB keyboard_info=5sB4yWxK+5xBGLBPCzmvfmLZpzB9jlf6/c2qigy4G5bTcb7967bItZRvQAPFOInLgJAkv96xy8i6w7iQDEsj3l+j5cWlEAaJcwMxh4Fv/u0cjWtl81avM+JZU5dLvLptgXIQ5xdlJmdv96sElIFEx9W6LMwrqrWAg7p5MpWN7Agx7PlSDoBx1L43NIN45LeL os_name=aDyPwYldEfIopeqYYZktKieT3zjNobg2gmerHxUlads= diskdrive=5sB4yWxK+5xBGLBPCzmvfjLaX9p9JpjSFwGpyEA3nZEqCND8Qo+/sJq2oXbx/RMqmZjWRSrpHo26w7iQDEsj3jB/wb7qjZMCKQYl0bgl534n8HnXis4BAXWTKn6p2863ZuQa7u69dVj84S6ncQckuF6p3+0FK4e0/Lz+97IilukJpOKHrgpqi7iIJcJ5TpI4nksRCcRBopq1f8YdCtx7lu3Gviq8IzjR/wpG7REZnW1DP1GHGw6+57ztR136ogN92zTzJXUkifIki2RrtUpqDT/f0mMWgn0nz+Sv14cJv40QGcjqfgcJMGfjym4uD0WDzmiHiAQ9wTa1el8t7VY4WyIvRfpA79QOBcLiwY879yM= is_enterprise=1 firstclickadvance=1 auto_proxy=0 [local_security] certificate=0 enabledpms=0 autolockdesktop=0 [advance] recordpath=C:\Users\lenovo\Documents\Oray\Sunlogin Files [common] autorun=1 enablevpn=0 projection=1 timeout=10 autoclose=1 notify=1 serviceonly=0 enableremotecontrol=1 askforquit=1 enablewakeup=0 openshareurl=0 buyshareurl=0 shareurl= [desktopmonitor] enable=0 desktop=1 framerate=1 times= motiondetection=0 sensitivity= area= [security] custompassword= usecustompassword=0 usewindowuser=1 wakeuppassword= wakeupselected=0 whitelist= blacklist= switch=0 enable=0 limitloginaccesstime= enablelimitloginaccess=0 harassoption=1 landiscovery=1 password= autolock=0 code_access_request=0 host_id_freq=0 [desktop] clsid={3D7855BD-C91B-4B47-AC5C-1EDFBD30927B} section=MODULES_LIST operatingenvironment=2 enable=1 manuconfirm=0 confirmtime=15 autoauth=1 autolockws=0 defaultresponse=1 enablemirrordriver=1 disabledesktopeffects=1 remoteswitchctrl= [forward] clsid={92EEE51B-DEC5-477A-874A-66461B5A95BF} section=MODULES_LIST friendlyname=绔彛杞彂 homepage=/html/forward/index.html channels=name=%E5%BE%AE%E8%BD%AF%E8%BF%9C%E7%A8%8B%E6%A1%8C%E9%9D%A2&pro=&addr=127%2E0%2E0%2E1%3A3389;name=%E8%B7%AF%E7%94%B1%E5%99%A8&pro=http&addr=192%2E168%2E0%2E1%3A80; [fastcode_error] fastcode_after=10 [network] open=0 type=2 address=127.0.0.1 port=8889 domain= username= password= ip=
而且相关信息貌似是base64编码,不过解码后乱码,应该不是直接编码,而是经过某算法加密
其中有关很敏感的键名baseboard,和一开始的config节点base有点像…这个时候如果要解密,需要涉及逆向,最极端的方式就是hook…反编译,会导致整个流程非常复杂。
所以,配置文件这条路应该走不通。
好吧,换条路!
基于协议的向日葵识别码分析 这个路,有点奇葩,一开始不是找配置嘛,发现一个log日志文件夹…
sunlogin_service.20220521-164550.log 中有几个比较关键的日志信息捕获到:
1 2 3 4 5 6 7 8 9 10 11 12 13 2022-05-21 16:45:51.223 - Info - Current client status: 2 2022-05-21 16:45:51.223 - Info - send status_changed notify 2 2022-05-21 16:45:51.223 - Info - Login task time 0 2022-05-21 16:45:51.224 - Info - Do login( type: 2 ) at 410 2022-05-21 16:45:51.224 - Info - [http call3] new call id:1, url:https://slapi.oray.net/remote/get-fastcode 2022-05-21 16:45:51.226 - Info - [http call3] id:1 create new connection : https://slapi.oray.net:443 2022-05-21 16:45:51.544 - Info - attempt to connect server slapi.oray.net:443(114.215.172.2:443) 2022-05-21 16:45:52.760 - Info - [http call3] id:1, url:https://slapi.oray.net/remote/get-fastcode, status code:200 2022-05-21 16:45:53.036 - Info - attempt to connect server rc10-fc10.oray.com:443(121.40.171.186:443) 2022-05-21 16:45:53.656 - Info - [service] attempted logon 2022-05-21 16:45:53.899 - Info - [service] logon server OK. public ip:183.236.0.85 2022-05-21 16:45:54.054 - Info - [online] attempted client online 2022-05-21 16:45:54.357 - Info - [online] client online OK.
仔细观察,有一个httpcall 是 https://slapi.oray.net/remote/get-fastcode
fastcode是向日葵识别码,那么get-fastcode不就是获取识别码的意思嘛!
于是乎,有个大胆的想法,首先先来个直接访问 返回xml格式数据:
1 2 3 4 5 6 7 8 9 10 <?xml version="1.0" encoding="utf-8"?> <response> <category>remote</category> <action>getfastcode</action> <code>1004</code> <message>MISSING_PARAMETERS</message> <datas> <data type="field" name="param">mac</data> </datas> </response>
大概意思就是缺少字段嘛,比如mac字段…
新吧,那就抓个包看看内部传输协议传输了什么数据
果断祭出神器charles,打通8889的socket代理,然后把向日葵设置个内部代理
然后重启下向日葵
ok,捕获到4条链接
提交了
1 2 3 4 5 GET /remote/get-fastcode?fastcode=767585688&fastcodepwd=Byzlwou99GKf2TzQ3mjTe1dYHOm6M4Ln&isforced=0&mac=C2%3A73%3AB1%3AD9%3A55%3A79&code=&version=3%2E2%2E1%2E44986&client=Windows%2Cx64%2CEnt%2Cappname%3DsunloginRemoteClient& HTTP/1.1 Accept: */* Host: slapi.oray.net User-Agent: SLRC/3.2.1.44986 (Windows,x64,Ent,appname=sunloginRemoteClient) Content-Type: application/x-www-form-urlencoded
返回了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 HTTP/1.1 200 OK Date: Sat, 21 May 2022 12:09:24 GMT Content-Type: text/xml;charset=utf-8 Transfer-Encoding: chunked Front-End-Https: on Connection: keep-alive <?xml version="1.0" encoding="utf-8"?> <response> <category>remote</category> <action>getfastcode</action> <code>0</code> <message>SUCCESS</message> <datas> <data type="field" name="fastcode">k767585688</data><data type="field" name="license">0e14-eb23-fcc1-b470</data><data type="field" name="password">Byzlwou99GKf2TzQ3mjTe1dYHOm6M4Ln</data><data type="field" name="lastusetime">1653134964</data><data type="field" name="slapi">slapi.oray.net</data><data type="field" name="sysserviceid">0</data><data type="field" name="expiredate">-1</data><data type="field" name="login">rc10-fc10.oray.com</data><data type="field" name="httpsserver">rc10-fc10.oray.com:443</data><data type="field" name="pubsvr">pubsub02.oray.net</data><data type="field" name="tracksvr"></data><data type="field" name="lastmodifytime">1653134964</data><data type="field" name="statuscode">2579</data><data type="field" name="security_tips_display">1</data><data type="field" name="force_login">1</data><data type="field" name="retryinterval">30</data><data type="field" name="expiredate_timestamp">1653167364</data> </datas> </response>
一看到返回中有了fastcode,767585688刚刚好和真实的识别码一毛一样,我靠,非常激动,就这么简单啊。等等,我发现一个事情,提交的参数中也有fastcode!
…无语了一下,不知道是不是必要参数,果断把参数删除,顺便删除其他参数,只保留一开始的mac
大概缩减陈过这样:
1 https://slapi.oray.net/remote/get-fastcode?isforced=0&mac=C2%3A73%3AB1%3AD9%3A55%3A79
提交,ok啊,返回了fastcode,一毛一样,原来还是这么简单啊,也就是通过mac映射识别码啊!
不急着把代码首先,先和客户要了台服务器,准备测试一下。
有个细节说一下,向日葵提交的mac是C2%3A73%3AB1%3AD9%3A55%3A79
如果通过cmd的ipconfig获取,有时候对照不上,不过没关系,向日葵下的config.ini中保存了mac,从那里直接读取就好!
ok,连上客户服务器,一顿操作猛如虎,发现一个离谱的事情,返回的fastcode和真实的识别码不同。。
裂开,一开始以为是mac有问题,或者对发起者ip也进行了校验,但是发现无论是我还是客户机,查询客户机的mac对应的识别码就是对不上!
回到本机,多查了几次,发现….被风控封了
1 2 3 4 5 6 7 8 9 10 <?xml version="1.0" encoding="utf-8"?> <response> <category>remote</category> <action>getfastcode</action> <code>1220</code> <message>GET_FASTCODE_TOO_MUCH</message> <datas> </datas> </response>
而且向日葵程序也加载不出来识别码了
然后经过下面的过程。。。。
1.还是访问获取fast-code
1 https://slapi.oray.net/remote/get-fastcode?fastcode=767585688&fastcodepwd=Byzlwou99GKf2TzQ3mjTe1dYHOm6M4Ln&isforced=0&mac=C2%3A73%3AB1%3AD9%3A55%3A79&code=&version=3%2E2%2E1%2E44986&client=Windows%2Cx64%2CEnt%2Cappname%3DsunloginRemoteClient&
返回了个新的fastcode
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 HTTP/1.1 200 OK Date: Sat, 21 May 2022 12:31:37 GMT Content-Type: text/xml;charset=utf-8 Transfer-Encoding: chunked Front-End-Https: on Connection: keep-alive <?xml version="1.0" encoding="utf-8"?> <response> <category>remote</category> <action>getfastcode</action> <code>0</code> <message>SUCCESS</message> <datas> <data type="field" name="fastcode">k999677784</data><data type="field" name="license">e391-d78d-8b89-a052</data><data type="field" name="password">ys8nWP0tVtSLMJ3IbHZthhkxiMmi0tPI</data><data type="field" name="lastusetime">1653136297</data><data type="field" name="slapi">slapi.oray.net</data><data type="field" name="sysserviceid">0</data><data type="field" name="expiredate">-1</data><data type="field" name="login">rc10-fc12.oray.com</data><data type="field" name="httpsserver">rc10-fc12.oray.com:443</data><data type="field" name="pubsvr">pubsub02.oray.net</data><data type="field" name="tracksvr"></data><data type="field" name="lastmodifytime">1653136297</data><data type="field" name="statuscode"></data><data type="field" name="security_tips_display">1</data><data type="field" name="force_login">1</data><data type="field" name="retryinterval">30</data><data type="field" name="expiredate_timestamp">1653168697</data> </datas> </response>
到这一步申请了个新的识别码,999677784
2.进行更新操作
1 2 3 4 5 6 7 8 POST /sunlogin/remote-info.update HTTP/1.1 Accept: */* Host: slapi.oray.net User-Agent: SLRC/3.2.1.44986 (Windows,x64,Ent,appname=sunloginRemoteClient) Content-Type: application/x-www-form-urlencoded Content-Length: 506 code=e391%2Dd78d%2D8b89%2Da052&auth=&fastcode=k999677784&fastcodeauth=ys8nWP0tVtSLMJ3IbHZthhkxiMmi0tPI&mask=2578&statuscode=2579&pcname=TOUALECULA&phversion=44986&version=3%2E2%2E1%2E44986&cpu=Intel%28R%29%20Core%28TM%29%20i5%2D8265U%20CPU%20%40%201%2E60GHz&cpu_num=&memory=20293MB&osname=Microsoft%20Windows%2010%20%E5%AE%B6%E5%BA%AD%E7%89%88&baseboard=LENOVO%20LNVNB161216&diskdrive=RPFTJ256PDD2MWX&videocontroller=NVIDIA%20GeForce%20MX250&networkadapter=Intel%28R%29%20Wireless%2DAC%209462&enterprise=1&
返回
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 HTTP/1.1 200 OK Date: Sat, 21 May 2022 12:31:38 GMT Content-Type: text/xml;charset=utf-8 Transfer-Encoding: chunked Front-End-Https: on Connection: keep-alive <?xml version="1.0" encoding="utf-8"?> <response> <category>sunlogin</category> <action>remoteinfoupdate</action> <code>0</code> <message>SUCCESS</message> <datas> <data type="field" name="configmodifiedtime">1653136298</data> </datas> </response>
3.响应UI
这个时候,我的识别码真正变化了无语
这时候还是回去访问一开始缩短的链接,也就是通过mac查识别码
1 2 3 4 5 6 7 8 9 10 <?xml version="1.0" encoding="utf-8"?> <response> <category>remote</category> <action>getfastcode</action> <code>0</code> <message>SUCCESS</message> <datas> <data type="field" name="fastcode">k883600822</data><data type="field" name="license">3655-9fca-27b7-113e</data><data type="field" name="password">vqRgXU5niFP3SSz3MukQ5znadf09t2bZ</data><data type="field" name="lastusetime">1653136486</data><data type="field" name="slapi">slapi.oray.net</data><data type="field" name="sysserviceid">0</data><data type="field" name="expiredate">-1</data><data type="field" name="login">rc08-fc01.oray.com</data><data type="field" name="httpsserver">rc08-fc01.oray.com:443</data><data type="field" name="pubsvr">pubsub02.oray.net</data><data type="field" name="tracksvr"></data><data type="field" name="lastmodifytime">1653136486</data><data type="field" name="statuscode"></data><data type="field" name="security_tips_display">1</data><data type="field" name="force_login">1</data><data type="field" name="retryinterval">30</data><data type="field" name="expiredate_timestamp">1653168886</data> </datas> </response>
这个时候才发现。。。。mac和识别码的映射关系。。。。。
不过还好,说明mac不能反查识别码,要不然,这个还是很恐怖的隐私漏洞!
到了这里,可能会觉得说基于协议的这条路是不是走不通了!
其实,也不完全是,技术上是能够实现的,思路如下:
通过代码搭建一个socket服务器,具备存储转发功能
向日葵设置代理
socket代理服务器检查到特征,进行code提取
这个识别,首先对客户来说,非常不友好,因为凭什么我要这么麻烦去设置代理呢?对开发人员,我凭什么做一个小功能专门这么麻烦去做这个。。。。
所以,此路说走得通也走得通,走不通也走不通
基于窗口句柄的内容提取 这个思路应该是大多数人想到了,但是很遗憾走不通
非常简单,找个窗口句柄对组件进行解析,发现:
发现只能解析一个窗口,其他组建解析不了
不像其他软件,可以解析到具体的按钮组件等
原因嘛,很easy,向日葵是自绘窗口,所以嘛
切换到UI绑定看看
UI探测也不行,不过有一说一。tv远程软件可以通过绑定句柄进行识别码获取,qq虽然也是自绘窗口,句柄探测找不到组建,但是ui探测是读取到一些信息,比如聊天记录啦
好吧,这条路不行
基于动态内存的向日葵识别码提取 这条路,是最终的路,也是可行的。
不过也是我最不愿意的,因为有点类似hook,涉及内存的操作其实都是很危险的!
先前提到配置文件,不管信息是保存在配置文件,还是保存在数据库,或者是云端,不管有没有加密,其实最终数据都会加载在内存中。。。
那就直接祭出CE大法
搜索关键字
21个结果,emmm等一会,如果这个值过一会发生了变化,说明不是长久存在,需要找个一个恒定值
剔除变化结果,浏览在内存的表现形式
像这种表现得独立的,忽略吧,他的特征难以让我们定位到的所在
这种还行
这个就非常不错,表现出json格式,所以我们只要找到 “fastcode”:”k 这个关键词即可
转换成 hex 形式
1 22 66 61 73 74 63 6F 64 65 22 20 3A 20 22 6B
实现代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 .版本 2 .支持库 ncdx98 .支持库 spec mess.初始化 () mess.提高权限 () ' 一键提高自身权限 进程_枚举 (dname, did) .计次循环首 (取数组成员数 (dname), i) .如果真 (dname [i] = “SunloginClient.exe”) id = did [i] 调试输出 (id) hProcess = OpenProcess (2035711, 0, id) .如果真 (hProcess = 0) 到循环尾 () .如果真结束 调试输出 (hProcess) Number = 内存搜索_x64 (hProcess, “22 66 61 73 74 63 6F 64 65 22 20 3A 20 22 6B”, , , , , , , , Array, 3) 调试输出 (Array) .如果真 (Number = 0) 到循环尾 () .如果真结束 CloseHandle (hProcess) 句柄 = mess.打开进程 (id) .计次循环首 (取数组成员数 (Array), j) res = dealBuff (到文本 (mess.读文本型 (句柄, Array [j], , 64))) 调试输出 (res) .如果真 (取文本长度 (res) = 9) mess.关闭句柄 (句柄) 返回 (res) .如果真结束 .计次循环尾 () mess.关闭句柄 (句柄) 跳出循环 () .如果真结束 .计次循环尾 () 返回 (“”)
结果:
顺利读取…下班了!