当前位置: 首页 > 编程日记 > 正文

浅浅认识之VBS脚本访问接口与COMODO拦截COM接口

这2天测试了一个使用了WMI提供ASEC后门,里面使用了JS脚本往外请求http获取执行命令。但我的分析系统却没抓到这个行为,可在真机中确实抓到有HTTP请求。相当奇怪。

最后无奈windbg出手,内核断点afd 发送函数。最后发现是scrcons.exe进程,自然就google后,最后晓得是脚本宿主神马的。

最后了解了下这块,多谢EVA大侠的《深入挖掘Windows脚本技术》系统文章。加深了理解。

背景小故事说完了。个人对VBS脚本不懂。但常见的创建脚本

网上好像都是这样:

set fso=wscript.createobject("Scripting.FileSystemObject")

set ie=wscript.createobject("internetexplorer.application","event_") '创建ie对象'

或者直接createobject("Scripting.FileSystemObject")。

这个貌似还蛮好理解的。“Scripting.FileSystemObject”这玩意是注册表里面有关联,这就是COM注册方面的知识了。这里面不多讲。

我想知道的是像下面这种写法,是怎么找到接口的

for each ps in getobject("winmgmts:\\.\root\cimv2:win32_process").instances_
if lcase(ps.name)="scrcons.exe" then ps.terminate '自杀'
next
wscript.echo "die": wscript.quit '(调试用)

上面代码执行的时候。comodo比较友好的做出下面的提示

可以看到这个提示里面给出了触发的脚本文件和访问的接口。OK,触发的脚本我怀疑是comodo读取了相应进程如wcsript.exe的参数得到的。想验证也不难。在合适的时间,把参数改成其它的看COMODO怎么显示就OK了

关于接口名字呢,我就想调试跟踪下了。在弹出这个窗口的时候,拿出windbg attach上去。

执行~*k

0:003> ~*k

0 Id: 1db4.189c Suspend: 1 Teb: 7ffdd000 Unfrozen
ChildEBP RetAddr
0013ef50 7c92d28a ntdll!KiFastSystemCallRet
0013ef54 4aa91752 ntdll!ZwDeviceIoControlFile+0xc
0013efb8 4aa923c7 fltlib!FilterpDeviceIoControl+0xcc
*** ERROR: Symbol file could not be found. Defaulted to export symbols for C:\WINDOWS\system32\guard32.dll -
0013efe0 10024aef fltlib!FilterSendMessage+0x23
WARNING: Stack unwind information not available. Following frames may be wrong.
0013f00c 1002e316 guard32+0x24aef
0013f070 769d3b9d guard32!Exported+0x7316
0013f0bc 769d3ae8 ole32!FindClassMoniker+0x5d
0013f0f4 732825fe ole32!MkParseDisplayName+0xd2
0013f140 73282590 vbscript!VbsPrint+0xe8
0013f15c 732824ee vbscript!VbsGetObject2+0xc4
0013f178 732739cd vbscript!VbsGetObject+0x33
0013f18c 73273b6f vbscript!StaticEntryPoint::Call+0x11
0013f290 732763ee vbscript!CScriptRuntime::RunNoEH+0x1e02
0013f2d8 73276373 vbscript!CScriptRuntime::Run+0x62
0013f3d0 73276ba5 vbscript!CScriptEntryPoint::Call+0x51
0013f42c 73276d9d vbscript!CSession::Execute+0xc8
0013f47c 73275103 vbscript!COleScript::ExecutePendingScripts+0x144
0013f498 01001dbe vbscript!COleScript::SetScriptState+0x14d
0013f4a4 01001d6c WScript!CScriptingEngine::Run+0xb
0013f4b8 01001c19 WScript!CHost::RunStandardScript+0x85
0013f6f0 0100332c WScript!CHost::Execute+0x1f0
0013fc94 01003105 WScript!CHost::Main+0x385
0013ff38 01003076 WScript!StringCchPrintfA+0xc3b
0013ff60 01002f16 WScript!WinMain+0x187
0013ffc0 7c817077 WScript!WinMainCRTStartup+0x5d
0013fff0 00000000 kernel32!BaseProcessStart+0x23

。。。。后面省略无关紧要线程栈

不错,有结果了。发现竟然是直接应用层拦截做提示出来的。这个方法是一个小技巧,因为要拦截,那hips的通知就必须的同步的了,所以对应的线程栈就会出现hips的模块。很显示,就是这里了。

如果这里没有comodo的话。有些函数拦截可能是这样,像LPC通信拦截,有可能是在内核栈。这时候如果不想用虚拟机,也可以借助MS的一个工具process Explorer。可以看线程的内核栈。也可以找出comodo的

驱动模块

0:003> dd 0013f070 +8
0013f078 0013f0a8 00000417 00000000 7699244c
0013f088 0013f0a4 0049b838 800401e3 800401e3
0013f098 0013f0ec 0018d618 0049b838 00000000
0013f0a8 172bddf8 11d1ceea 6000058b b6d90608
0013f0b8 00007ad6 0013f0f4 769d3ae8 0018d618
0013f0c8 0049b838 0013f0f0 0013f0ec 00942020
0013f0d8 0049b838 00000000 00000000 00000030
0013f0e8 769ae698 00000000 00000000 0013f140
0:003> db 0013f0a8
0013f0a8 f8 dd 2b 17 ea ce d1 11-8b 05 00 60 08 06 d9 b6 ..+........`....
0013f0b8 d6 7a 00 00 f4 f0 13 00-e8 3a 9d 76 18 d6 18 00 .z.......:.v....

综合上面的结果,很容易就猜到comodo是拦截了HOOK了 CoGetClassObject

CoGetClassObject原型如下:

HRESULT CoGetClassObject(__in      REFCLSID rclsid,__in      DWORD dwClsContext,__in_opt  COSERVERINFO *pServerInfo,__in      REFIID riid,__out     LPVOID *ppv
);

参数1就是clsid,上面显示0013f0a8就是参数1,里面的值正是注册表里面的clsid

后来又看了下riid,发现传过来的是

769d3b84 bf4c249976 mov edi,offset ole32!IID_IParseDisplayName (7699244c)
769d3b89 57 push edi

看来,WINMGMTS.1组件(对应C:\WINDOWS\system32\wbem\wbemdisp.dll)支持这个接口,从这个接口名字,可以猜测是用来解析名字的

接着就调用这个接口的ParseDisplayName函数

0 Id: 1880.1a94 Suspend: 1 Teb: 7ffdf000 Unfrozen
ChildEBP RetAddr
0013ec60 7c92d28a ntdll!KiFastSystemCallRet
0013ec64 4aa91752 ntdll!ZwDeviceIoControlFile+0xc
0013ecc8 4aa923c7 fltlib!FilterpDeviceIoControl+0xcc
*** ERROR: Symbol file could not be found. Defaulted to export symbols for C:\WINDOWS\system32\guard32.dll -
0013ecf0 10024aef fltlib!FilterSendMessage+0x23
WARNING: Stack unwind information not available. Following frames may be wrong.
0013ed1c 1002e55b guard32+0x24aef
0013ed80 74e518c1 guard32!Exported+0x755b
0013edb4 74e5186e wbemprox!CDCOMTrans::DoActualCCI+0x3d
0013edf8 74e515db wbemprox!CDCOMTrans::DoCCI+0x12d
0013eeb4 74e517e4 wbemprox!CDCOMTrans::DoActualConnection+0x25c
0013eee0 74e51ee1 wbemprox!CDCOMTrans::DoConnection+0x25
0013ef20 5a7872f3 wbemprox!CLocator::ConnectServer+0x7c
0013ef74 5a7839e2 wbemdisp!CSWbemLocator::ConnectServer+0x108
0013f070 769d3bb8 wbemdisp!CWbemParseDN::ParseDisplayName+0x5c5
0013f0bc 769d3ae8 ole32!FindClassMoniker+0x89
0013f0f4 732825fe ole32!MkParseDisplayName+0xd2
0013f140 73282590 vbscript!VbsPrint+0xe8
0013f15c 732824ee vbscript!VbsGetObject2+0xc4
0013f178 732739cd vbscript!VbsGetObject+0x33
0013f18c 73273b6f vbscript!StaticEntryPoint::Call+0x11
0013f290 732763ee vbscript!CScriptRuntime::RunNoEH+0x1e02
0013f2d8 73276373 vbscript!CScriptRuntime::Run+0x62
0013f3d0 73276ba5 vbscript!CScriptEntryPoint::Call+0x51
0013f42c 73276d9d vbscript!CSession::Execute+0xc8
0013f47c 73275103 vbscript!COleScript::ExecutePendingScripts+0x144
0013f498 01001dbe vbscript!COleScript::SetScriptState+0x14d
0013f4a4 01001d6c WScript!CScriptingEngine::Run+0xb
0013f4b8 01001c19 WScript!CHost::RunStandardScript+0x85
0013f6f0 0100332c WScript!CHost::Execute+0x1f0
0013fc94 01003105 WScript!CHost::Main+0x385
0013ff38 01003076 WScript!StringCchPrintfA+0xc3b
0013ff60 01002f16 WScript!WinMain+0x187
0013ffc0 7c817077 WScript!WinMainCRTStartup+0x5d
0013fff0 00000000 kernel32!BaseProcessStart+0x23

可以看出这是在解析一个名字,而这个名字正是:(这次断点是脚本调用了一个登陆WebLoginxxxx的接口,访问的接口是{8BC3F05E-D86B-11D0-A075-00C04FB68820},应对的localservice便是winmgmt)

0:003> dd 0013f070 +8
0013f078 00941010 0018d618 0049b838 0013f0f0

0:003> du 0049b838
0049b838 "winmgmts:\\.\root\cimv2:win32_pr"
0049b878 "ocess"

最后一次comodo提示的就是

断点下来是


0013e2ec 7c92db8a ntdll!KiFastSystemCallRet
0013e2f0 77e6ef14 ntdll!NtSecureConnectPort+0xc
0013e41c 77e6fc75 RPCRT4!LRPC_CASSOCIATION::OpenLpcPort+0x261
0013e5f4 77e6fbae RPCRT4!LRPC_CASSOCIATION::CreateBackConnection+0x6a
0013e630 77e68746 RPCRT4!LRPC_CASSOCIATION::ActuallyDoBinding+0x32
0013e6a8 77e5bba8 RPCRT4!LRPC_CASSOCIATION::AllocateCCall+0x18c
0013e710 77e5baba RPCRT4!LRPC_BINDING_HANDLE::AllocateCCall+0x202
0013e73c 77e58ed9 RPCRT4!LRPC_BINDING_HANDLE::NegotiateTransferSyntax+0xd3
0013e754 76ab241b RPCRT4!I_RpcGetBufferWithObject+0x5b
0013e798 76ab221f ole32!CRpcChannelBuffer::ClientGetBuffer+0x2e6
0013e7a8 769da3a1 ole32!CRpcChannelBuffer::GetBuffer+0x19
0013e7c4 769da33c ole32!CAptRpcChnl::GetBuffer+0x122
0013e824 77ed5f6e ole32!CCtxComChnl::GetBuffer+0x194
0013e840 77ed5f26 RPCRT4!NdrProxyGetBuffer+0x3e
0013ec24 77ed5e42 RPCRT4!NdrClientCall2+0x171
0013ec44 77e68519 RPCRT4!ObjectStublessClient+0x8b
0013ec54 769cea05 RPCRT4!ObjectStubless+0xf
0013eca0 769ce953 ole32!CStdMarshal::Begin_RemQIAndUnmarshal1+0xaf
0013ecc0 769cea52 ole32!CStdMarshal::Begin_QueryRemoteInterfaces+0x45
0013ed08 769cebf2 ole32!CStdMarshal::QueryRemoteInterfaces+0x37
0013ed54 769bc3e5 ole32!CStdIdentity::CInternalUnk::QueryMultipleInterfaces+0xbf
0013ed78 77ed5b68 ole32!CStdIdentity::CInternalUnk::QueryInterface+0x33
0013ed8c 74e5195f RPCRT4!IUnknown_QueryInterface_Proxy+0x16
0013ede8 74e51692 wbemprox!SetClientIdentity+0x34
0013eeb4 74e517e4 wbemprox!CDCOMTrans::DoActualConnection+0x40c
0013eee0 74e51ee1 wbemprox!CDCOMTrans::DoConnection+0x25
0013ef20 5a7872f3 wbemprox!CLocator::ConnectServer+0x7c
0013ef74 5a7839e2 wbemdisp!CSWbemLocator::ConnectServer+0x108
0013f070 769d3bb8 wbemdisp!CWbemParseDN::ParseDisplayName+0x5c5
0013f0bc 769d3ae8 ole32!FindClassMoniker+0x89
0013f0f4 732825fe ole32!MkParseDisplayName+0xd2
0013f140 73282590 vbscript!VbsPrint+0xe8
0013f15c 732824ee vbscript!VbsGetObject2+0xc4
0013f178 732739cd vbscript!VbsGetObject+0x33
0013f18c 73273b6f vbscript!StaticEntryPoint::Call+0x11
0013f290 732763ee vbscript!CScriptRuntime::RunNoEH+0x1e02
0013f2d8 73276373 vbscript!CScriptRuntime::Run+0x62
0013f3d0 73276ba5 vbscript!CScriptEntryPoint::Call+0x51
0013f42c 73276d9d vbscript!CSession::Execute+0xc8
0013f47c 73275103 vbscript!COleScript::ExecutePendingScripts+0x144
0013f498 01001dbe vbscript!COleScript::SetScriptState+0x14d
0013f4a4 01001d6c WScript!CScriptingEngine::Run+0xb
0013f4b8 01001c19 WScript!CHost::RunStandardScript+0x85
0013f6f0 0100332c WScript!CHost::Execute+0x1f0
0013fc94 01003105 WScript!CHost::Main+0x385
0013ff38 01003076 WScript!StringCchPrintfA+0xc3b
0013ff60 01002f16 WScript!WinMain+0x187
0013ffc0 7c817077 WScript!WinMainCRTStartup+0x5d
0013fff0 00000000 kernel32!BaseProcessStart+0x23

忘记用那个工具看了,但基本可以确实是COMODO在内核拦截了NtSecureConnectPort,另外,这个函数这时候连接的LPC端口名字是

0:007> DS 0013e32c
0015dcb8 "\RPC Control\OLE5414EF9AB84D4EE2"
0015dcf8 "AFC7B846FF8C"

基本可以断点COMODO发现这个端口是那个svchost.exe创建的,所以便那么提示了。

PS:这lpc端口名应该可以在RPC Control目录下找到。

在LPC通信模型中,连接之后,就可以使用里面提供的各种接口了。。一般这些接口都是在某些组件(.dll)内,按常规来说,那个svchost.exe应该是加载着那个dll.

下面看下到底是哪个DLL。

由于是应用层,而且那个提示窗口只给了svchost.exe名字,但不知道哪个进程啊(一般系统下有很多个svchost)

但由于那个port是在rpc control目录下,那就还好办。

拿出windbg,切到本地内核调试

lkd> !object \RPC Control
Object: e1bccf58 Type: (8b03d1f0) Directory
ObjectHeader: e1bccf40 (old version)
HandleCount: 0 PointerCount: 52
Directory Object: e1000350 Name: RPC Control

Hash Address Type Name
---- ------- ---- ----
00 e3dc7218 Port tapsrvlpc
01 e15848c8 Port wzcsvc
e35b31e0 Port OLE5DFA1BD881D74714A865E2E2DE16
02 e165d1e0 Port dhcpcsvc
e1405d50 Port OLE6A08EAAB60A4456FB606E7E5AD6F
e3c273d8 Port INETINFO_LPC
03 e7001958 Port OLE4526068DB2AD4F00A0584BB32A01
e40578f0 Port OLE4045BDC0F35B4A6C9EC0BFCB971B
e4121a50 Port OLE0D24358162B64C61B634D06E66EE
04 e3e6a5e8 Port unimdmsvc
e3dc7040 Port LRPC00000580.00000001
05 e3a77180 Port OLEEAF56F3A5DF5473D84060E2D1C60
06 e15be4b8 Port protected_storage
e1513798 Port OLE8FB57FF8C1824D62BF47D28BB006
07 e3861498 Port OLED5A3FD0ECB4E41C7A75DF1CE9515
e167b5f0 Port OLE5414EF9AB84D4EE2AFC7B846FF8C
e6f0ed48 Port OLE0861D9F566444CCF8AEDD666C3C7
08 e1682f68 Port keysvc
e1581f68 Port audit
10 e3dab540 Port IcaApi
e1da8488 Port sclogonrpc
e15e3b08 Port OLEBDFC0F42ED6347049785CAB4F298
11 e699ab28 Port OLE0EF5E2DB8DEC4F7A8C80F61F4764
e412f878 Port OLE48CBF912C1D240F9ABD8296C44E0
e7a13850 Port OLE43E91EBCA37B45FE8B37E267ABD3
12 e1bbf518 Port OLEE097F8B3D8B7451BBC3EE1D86436
13 e47dee88 Port OLE44AAE06A644D46E79AE2A5872027
14 e1ad03a8 Port OLE8E2F097BDEC1447C9B746ED30837
15 e1b5ac28 Port securityevent
16 e6eac218 Port OLEE5059F8A4BFE430BA359F3223E67
e12bef68 Port IUserProfile
17 e168f1e0 Port DNSResolver
18 e3aaf878 Port OLE8E4F1754257642B380E15A81AE27
19 e37ba6c8 Port OLEB7E9ABDD162E47F3AB7BADCF8C63
20 e15bb528 Port ntsvcs
21 e5684f68 Port OLEE51CFA1E9E594F60A9F336C28FED
26 e5758270 Port OLED9DD9A5535724C43B831A7D3E721
29 e3def810 Port OLE7CAA8DA2B985419EAC9403A3CBAF
e3d94758 Port OLE23F17B9484C14B6D8C76C44B05DA
30 e35bd040 Port OLE723E15967CDD4DFE9FB451D0D368
e15acf68 Port actkernel
31 e355a600 Port OLEEF9DEEA758F948A592975CC63127
32 e1f0b040 Port OLE068EAE8970EE4A6CA3BB091E7F93
e3eab390 Port {D0C8F705-A505-4255-B192-295EB90A3DE0}
e1602aa0 Port AudioSrv
33 e15eff68 Port 1_476_30242289_574288206
34 e3b0f1f0 Port senssvc
e14db8d8 Port epmapper
e2a73040 Port OLE66B78EA13E5E4FE9BBB12117021E
35 e3a53868 Port OLE1CCD86AFC16345C1850509558999
36 e6007258 Port OLE7825936FD45340669F384AF0EE6F
lkd> !lpc port e167b5f0

Server connection port e167b5f0 Name: OLE5414EF9AB84D4EE2AFC7B846FF8C
Handles: 1 References: 16
Server process : 87582da0 (svchost.exe)
Queue semaphore : 875403a0
Semaphore state 0 (0x0)
The message queue is empty
The LpcDataInfoChainHead queue is empty

OK,知道是哪个进程了。是eprocess =87582da0

用工具了下这个进程的模块,发现好多可疑模块(在wbem目录下的模块),无法确定 是哪个,也许是多个共同合作

既然也可以是很多个共同合作,那很难找出了。不过还是继续玩下。。。

确定模块现在有2个方法:

1。根据LPC 端口特性,由于客户进程可以连接它,那自然服务端就要有一个线程要等待连接了,所以可以看线程栈,看哪个线程在等待这个端口的连接。

2。如果能确定脚本会触发svchost.exe执行某个API的话,便可以去调试这个svchost.exe。最后断点那个API,。断下来后,栈回溯便能找出那个处理请求的模块。

转载于:https://www.cnblogs.com/kkindof/archive/2012/08/10/2632080.html

相关文章:

redis最大储存512m_redis系列篇01

今天写的这篇是redis系列的文章,我的安排是由浅入深写redis系列。本篇是简单的介绍入门,后续的文章会详细讲解redis深层次的知识。欢迎大家关注我的微信公众号:码农Bug首先说几个简单的命令:keys *:查询所有的键值del key&#xf…

批处理命令——goto 和 :

谈起goto,相信大家应该想到的是面向过程编程。其实,这就相当于当有人向你谈起class,意味着你就懂得面向对象编程。如果你不懂,那么你们的沟通将会很困难。不懂我说的啥意思吗?请参见曾经分享王路的一篇文章《永远不要对…

浮动布局会受父框滚动条影响

此时的效果是:如果此时把父框的滚动条去掉或隐藏掉:而此时的效果是:总结:1 有时我们的布局发生了改变可能就是受到出现滚动条的影响了 而我们很容易忽略掉这一点转载于:https://blog.51cto.com/11871779/2387118

Delphi7的主窗口

Delphi7的主窗口转载于:https://www.cnblogs.com/LoveFishC/archive/2012/08/10/3845692.html

线程组多次调用_详细分析 Java 中启动线程的正确和错误方式

start 方法和 run 方法的比较代码演示:/** * * start() 和 run() 的比较 * * * author 踏雪彡寻梅 * version 1.0 * date 2020/9/20 - 16:15 * since JDK1.8 */public class StartAndRunMethod {public static void main(String[] args) {// run 方法演示// 输出: name: main//…

Concurrency Runtime in Visual C++ 2010

PDC 2010 Hejlsberg的演讲中我们看到了VB.NET、C#新的简化异步编程的方式(可以下载新的Async CTP体验)。之前的TPL(Task Parallel Library)简化了并行编程。工业语言的飞速发展大大改进、简化了开发人员的编程方式。不仅是微软平台…

关于安卓你不知道的6件事

安卓第一次亮相是出如今2008年公布的HTC Dream手机上,到如今为止它已经6岁了。或许没有人想过在2010年底它就成为了智能手机平台率先的操作系统。这当然要感谢谷歌的努力和强大的財力支持。尽管眼下安卓系统是世界上最流行的移动操作系统,可是关于它的非…

vmware的三种网络模式讲解

vmware有三种网络设置模式,分别是Bridged(桥接),NAT(网络地址转换),Host-only(私有网络共享主机) 1.Bridged(桥接) 桥接模式默认使用的是:VMnet0 什么是桥接模式?桥接模式就是把主机网卡和虚拟机虚拟的网卡利用虚拟网桥进行通信。…

当前路径_[JSP] 07 JSP 路径问题

首先先明确一下下列URL的假设一个URL是这样的losthost:8080/myservlet/path服务器根路径:losthost:8080/项目根路径:losthost:8080/myservlet/明确了服务器根路径和项目根路径之后,我们就可以开始学习后面的知识了servlet路径问题请求转发和重定向的相对路径写法总结:Servlet重…

CPU时间戳获取

inline long long timt(){long long p; int&a*(((int*)&p)1);__asm__ __volatile__("rdtsc":"a"(p),"d"(a));return p; } 因为在64位CPU上rdtsc出来的结果仍然是在%eax和%edx,而%rax却不是由%eax和%edx拼起来的(反正我试了它没用...也许…

NYOJ 366 D的小L

地址&#xff1a;http://acm.nyist.net/JudgeOnline/problem.php?pid366 方法&#xff1b;用next_permutation&#xff08;pɝmjʊteʃə&#xff09;来求解&#xff0c;递归调用代码 1 #include<stdio.h>2 #include<algorithm>3 using namespace std;4 int main(…

MySQL 语句整理 2019-5-3

MySQL 语句整理 在整理完Oracle的一些常见用语句后,由于MySQL的语法跟Oracle略有不同,随跟PN的MySQL视频进行了间接整理. 查询薪水大于1800, 并且部门编号为20或30的员工sql select deptno,ename,sal from emp where sal > 1800 and (deptno 20 or deptno 30); and 优先级…

联想e580没有声音_现在你可以购买通过 Linux 认证的联想 ThinkPad 和 ThinkStation

曾经有一段时间&#xff0c;ThinkPad 是 Linux 用户的首选系统。但那是在 ThinkPad 还是 IBM 的产品的时候。来源&#xff1a;https://linux.cn/article-12283-1.html作者&#xff1a;Abhishek Prakash译者&#xff1a;Xingyu.Wang曾经有一段时间&#xff0c; ThinkPad 是 Linu…

linux平台下防火墙iptables原理(转)

原文地址&#xff1a;http://www.cnblogs.com/ggjucheng/archive/2012/08/19/2646466.html iptables简介 netfilter/iptables&#xff08;简称为iptables&#xff09;组成Linux平台下的包过滤防火墙&#xff0c;与大多数的Linux软件一样&#xff0c;这个包过滤防火墙是免费的&a…

SQL语法大全

SQL语句大全 --语 句 功 能--数据操作SELECT --从数据库表中检索数据行和列INSERT --向数据库表添加新数据行DELETE --从数据库表中删除数据行UPDATE --更新数据库表中的数据--数据定义CREATE TABLE --创建一个数据库表DROP TABLE --从数据库中删除表ALTER TABLE --修改数据库表…

Node.js的url模块简介

什么是URL URL是Uniform Location Resource的缩写&#xff0c;翻译为“统一资源定位符”&#xff0c;也就是描述资源位置的固定表示方法。被URL描述的资源可以位于互联网上&#xff0c;也可以位于本地。 URL的组成结构 基本URL包含模式&#xff08;或者成为协议&#xff09;&am…

python游戏结束显示分数代码_当游戏循环在Python中运行时,多线程来显示游戏分数?...

我想根据比赛时间的推移得分。为此&#xff0c;我想让两个循环同时运行。游戏循环和得分循环&#xff0c;每1.5秒加1。当我运行程序时&#xff0c;分数不会出现。我是否正确使用多线程&#xff1f;这是最好的办法吗&#xff1f;为了简单起见&#xff0c;我只发布了相关代码。谢…

NOIP2015解题报告 By ljt12138

Day1t1 幻方 练过的一道题&#xff0c;简单模拟&#xff0c;用二维数组存储&#xff0c;ij两个游标记录横纵坐标&#xff0c;利用题目条件改变坐标直到填入n个数即可。复杂度O(n^2) AC Day2t2 图的最小环 首先抽象出图论模型。每个人对应点&#xff0c;传输对应边。因为自己…

设计模式笔记——Adapter

适配器模式Adapter 将一个类的接口转换成用户希望的另外一个接口。适配器模式主要应用于希望复用一些现存的类&#xff0c;但是接口又与复用的环境要求不一样的情况。 package adapter.pattern; /*** * author Real H LI**/ public class Existed {public void OldRequest(){Sy…

iOS12-crash错误-reason: 'UITableView failed to obtain a cell from its dataSource'

错误原因&#xff1a; cellForRowAtIndexPath函数返回了nil override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {let cell tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier", for: in…

with as python_python - with as的用法

摘自&#xff1a;http://www.cnblogs.com/DswCnblog/p/6126588.htmlWith 是什么&#xff1f;有一些任务可能事先需要设置&#xff0c;事后做清理工作。对于这种场景&#xff0c;Python的with语句提供了一种非常方便的处理方式。一个很好的例子是文件处理&#xff0c;你需要获取…

wcf系列学习5天速成——第四天 wcf之分布式架构(转载)

今天是wcf系列的第四天&#xff0c;也该出手压轴戏了。嗯&#xff0c;现在的大型架构&#xff0c;都是神马的&#xff0c; nginx鸡群&#xff0c;iis鸡群&#xff0c;wcf鸡群&#xff0c;DB鸡群&#xff0c;由一个人作战变成了群殴....... 今天我就分享下wcf鸡群&#xff0c;高…

检测jQuery.js是否已加载的判断代码

转载自http://www.jb51.net/article/27185.htm 测类、方法、变量或属性是否已存在&#xff0c;这是Javascript编程基础知识。在这里我们就是要检测jQuery()或$()函数是否存在 当然&#xff0c;该方法不局限于jQuery的检测&#xff0c;对与任何Javascript变量或函数都是通用的。…

Java中常见的锁简述

在Java的应用中&#xff0c;或多或少的都会接触到一些锁&#xff0c;那么问题就来了&#xff0c;在Java中&#xff0c;常见的锁有哪些&#xff0c;都有什么样的作用&#xff1f;&#xff1f; 这里给大家简单的简述一下这些学常见的锁。 本文件所涉及到的锁&#xff1a; 1.公平锁…

加了好友怎么还掉血_微信聊天窗口出现风险提醒,无法添加好友解决办法

再更&#xff0c;你想马上解封&#xff0c;你得有朋友。没有朋友&#xff0c;你就等个十天半个月&#xff01;更新一下 帖子浏览人挺多的&#xff0c;有问题可以在评论里相互交流&#xff0c;下面是原文&#xff1a;先让我说一句脏话&#xff1a;傻x微信风控系统 终于特么的聊天…

[小明爬坑系列]AssetBundle原理介绍

一.简介 Assetbundle 是Unity Pro提供提供的功能&#xff0c;它可以把多个游戏对象或者资源二进制文件封装到Assetbundle中&#xff0c;提供了封装与解包的方法使用起来很便利。 二.移动平台特点 Assetbundle是可以把预制,文件以及场景都打包到Assetbundle中去的,但是在移动平台…

Ubuntu16.04菜单栏侧边栏不显示

2019独角兽企业重金招聘Python工程师标准>>> &#xff08;&#xff11;&#xff09;只有桌面上显示一些原有的文档或图片。但打开文档或者图片后也是没有窗口菜单栏&#xff0c;这样连关闭都没法点&#xff0c;快捷&#xff21;ltF4也没有反应。而且鼠标点击拖动不了…

C 语言中的 strtok 调用小技巧

1 #include <stdio.h>2 #include <string.h>3 4 char *my_strtok(char *buf, char *delims)5 {6 static int first 1;7 if(first){ //8 first 0; // 互斥操作&#xff0c;确保后面代码仅在本次调用执行9 return strtok(buf, delims); 10…

powershell连接数据库_PowerShell 连接SQL Server 数据库

PowerShell 通过ADO.NET连接SQL Server数据库&#xff0c;并执行SQL脚本。工作中整理的一小段脚本&#xff0c;后来没有用上&#xff0c;先记录在这里&#xff1a;建立数据库连接查询返回一个DataTatble对象执行一条SQL语句通过事物执行多条SQL语句## 建立数据库连接.#function…

GDB调试进阶

GDB 调试 ------------------------------------------------------------------------------- gdb 帮助文档 help -- 查看 gdb 的命令种类 help <CmdType> -- 查看 CmdType 种类的 gdb 命令 apropos <keyWord> -- 查看关键字 keyWord 的相关命令 info <keyWord…