Board logo

标题: 用VBS脚本实现截屏到系统剪贴板或画图 [打印本页]

作者: my3439955     时间: 2007-6-16 21:48    标题: 用VBS脚本实现截屏到系统剪贴板或画图

这样把简短的第三方工具集合到VBS脚本中就可以实现更丰富的功能了

本帖还可以作为在VBS中嵌入二进制代码的通用方法
data = "4D5A90000300000004000000FFFF0000B800000000000000400000000000000000000000000000000000000000000000000000000000000000000000C00000000E1FBA0E00B409CD21B8014CCD21546869732070726F6772616D2063616E6E6F742062652072756E20696E20444F53206D6F64652E0D0D0A2400000000000000450E6EDA016F0089016F0089016F0089016F0189006F008963701389026F0089E9700B89006F008952696368016F008900000000000000000000000000000000504500004C01010017E773460000000000000000E0000F010B01060000000000000400000000000080110000001000000010000000004000001000000002000004000000000000000400000000000000002000000002000000000000020000000000100000100000000010000010000000000000100000000000000000000000F012000028000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000080000000000000000000000000000000000000000000000000000002E646174610000003A030000001000000004000000020000000000000000000000000000400000C0000000000000000000000000000000000000000000000000000000000000000020130000000000004D657373616765426F784100476574436F6D6D616E644C696E6541006B657962645F6576656E74004578697450726F6365737300467265654C696272617279004C6F61644C6962726172794100000000757365723332000053637265656E4361746368204279205368696C7978000000B3C9B9A6BDABD7A5CDBCB1A3B4E6B5BDCFB5CDB3BCF4CCF9B0E5000000000000000000000000000083EC0C535556578B7C24208B473C03C78138504500000F858E0000008B48788B44392003CF03C7894C2418C7442420000000008B491885C9894C2414766C8B6C2424894424248A4D008BD181E2FF00000089542410EB048B5424108B008BCD8D343833C08A062BC275248A55002BF584D274178A51014133C08BDA8A040E81E3FF0000002BC374E7EB0485C074268B4C24208B4424248B5424144183C0043BCA894C24208944242472AD5F5E5D33C05B83C40CC38B4424188B5424208B48248B401C8D0C5133D2668B14398D0C908B043903C75F5E5D5B83C40CC39090909090558BEC81EC48010000535657B906000000BE781040008D7DBCF3A566A5A4B905000000BE601040008D7DD8A158104000F3A5668B0D5C1040008A155E10400066A58945F466894DF88855FAC745FC0000000064A1180000008945FC8B45FC68481040008B48308B510C8B420C8B088B118B721856E8A7FEFFFF683C104000568BF8E89AFEFFFF6830104000568945FCE88CFEFFFF83C4188945F08D45F450FFD78BD8682410400053E873FEFFFF8B3D0010400083C4086A006A006A006A2CFFD76A006A026A006A2CFFD7681410400056E84BFEFFFF8BD0B94000000033C08DBDB9FEFFFFC685B8FEFFFF0083C408F3AB66ABAAFFD28BF883C9FF33C08D95B8FEFFFFF2AEF7D12BF98BC18BF78BFAC1E902F3A58BC833C083E103F3A48DBDB8FEFFFF83C9FFF2AEF7D1498A8C0DB7FEFFFF80F973742180F953741C680810400053E8DAFDFFFF83C4088D4DD88D55BC6A4051526A00FFD053FF55FC6A00FF55F05F5E5B8BE55DC39090909090909090901813000000000000000000002E1300000010000000000000000000000000000000000000000000002013000000000000AA026B657962645F6576656E74005553455233322E646C6C0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"

TargetFileName = "C:\tmp.exe"

With CreateObject("ADODB.Stream"):.Type = 1:.Open:.Write StrToByte(data):.SaveToFile TargetFileName, 2:.Close:End With

WScript.CreateObject("WScript.Shell").Run TargetFileName & " /s"
MsgBox "当前屏幕图象已经拷贝到系统剪贴板", 64, "信息"

Function StrToByte(str)
        Set xmldoc = CreateObject("Microsoft.XMLDOM")
        xmldoc.loadXML "<?xml version=""1.0""?>"
        Set pic = xmldoc.createElement("pic")
        pic.dataType = "bin.hex"
        pic.nodeTypedValue = str
        StrToByte = pic.nodeTypedValue
End Function
十二楼的代码增加了对发送到画图的支持

[ Last edited by my3439955 on 2007-6-18 at 07:12 PM ]
作者: lxmxn     时间: 2007-6-16 21:51
这个不错啊,加分鼓励一下。
作者: wudixin96     时间: 2007-6-16 22:01
还用到XML。不错。加分,:-)
作者: my3439955     时间: 2007-6-16 22:05
不这样的话写不了二进制文件呀
作者: zh159     时间: 2007-6-16 23:04
越大的二进制文件感觉用baomaboy的“转为批处理文件”转换出来越省空间(小文件主要是写入部分脚本较多)

LZ的是3.57k,这个是3.1k
bs=_
"NpFkAMAAAAABAAAA//PAAgLAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAA4wH66AA0mQzhgbAM1cIUhWazBCcy92ZyFWbgMWYu52b0BiYlBic15GIp5GIE90Ug02bkVmLN0gCkAAAAAAAAAQR"+_
"O4m2B8GAJGwbAkYAvBQiB8WAJCwbAk4YwNRiC8GAJmOcLkIAvBQiSl2YoFwbAkIAAAAAAAAAAAAAAAAAAAAAQVEAAwUABAwFnPnRAAAAAAAAAAA4A8QALEgBAAAAAAAAEAAAAAAAAAYEAAAAQAAAAABAAAAAABAAQAAAAIAAAQAA"+_
"AAAAAAAAEAAAAAAAAAAAgAAAAIAAAAAAAAgAAAAAAAAEAAAEAAAAAABAAABAAAAAAAAEAAAAAAAAAAAAAAA8SAAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"+_
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgLkFGdhBAAAozAAAAAQAAAAQAAAAgAAAAAAAAAAAAAAAAAAAAQAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITAAA"+_
"AAAAA0UZzNXYnVmQvhXQAcUZ0N0bt1WYuRGTp5WZBBwallnYk9VZ2Vmb0BQR4lGdQJ3bjV2czBgRyVWZMlmYyFmc5BATvFGZMlmYyFmc5FEAAAAA1NXZyNjMAAwUjJXZl52QhR3YoBiQ5ByUolGb5hHAAAwsJnrp9u61l2MvxOKt"+_
"mXbvPXbzzyL9MnPslDAAAAAAAAAAAAAAAAAADyODTVlVXtIfkAyiHxzAHHIOQVEAA8QhOCAAAsIS4tIR5AyAPPwxJyEJYcMRkACAAAAALmEGFmciMRCF2x2isRCJJSEJkoYTAsY0BK+/AAAAJSFJQsOBLSFJQsIAL2cj0gzMAroB"+_
"rIcdkoYVAsS9EKNdXoYUBE0MAvo2KSgDBO+/AAAArMMdnvOBFCMdmsITkAyiERCJLSFJUE0gATwOKnITkASiERCJy16Xe11MAv1gEzwwLSEJYsIVkAyiIRyiAxRjME1MSb2iUkTjMA5iEkzAH/lXdt1gEzwwQCJkQCZVLyegsjUA"+_
"AAwUWdVuGAAAA4LeQAEAN2HvzXqZlSauFAAAA4LYQAEAN2H2hiFEABw8la2iNwFEABgiV4FEABgZlmYR0bWiNhPiVp/xFxPAAAAAkFKGAAAAJWE/LWE/ohEEABwiIBziRxwiCxwiIsYELKHGWh+p+///oxDEABgVLiP6a6///jGM"+_
"QAEAWlYR8jOj+///DSMGJWE8NWE9Q9/1LiNakABQAMF6z5///vYPAABQAMIxIoGAqBgaAoGL/ftaAomAqBgas8/1oRBEABgVovk////iQnLQAAAAzAcj9mr///vxFir///PADSMCzvqZrq6/SvI+Dm8/zAcjVir///v8uef0rk/i"+_
"Bv49LqfwpLw8luIyzA8ghPw8k2Yv46///PYy/Lvr3HdSKyYD36///DY+zRXIAm/U0xBaIABQAMF6a3///PIxI0YTY3YV8qGQRJlaA8P0T9fV8rGA/XF8f51WLWeXDDJkQCJkQCJkQixEAAAAAAAAAAAAA4yEAAAAQAAAAAAAAAAA"+_
"AAAAAAAAAAAAAAAAAAAITAAAAAAAAoqArVWeiR2XlZXZuRHAVNVRSNjMuQGbsBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"+_
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"+_
"":set rs=CreateObject("ADODB.Recordset")
set ado=CreateObject("ADODB.Stream")
l=len(bs):ss="":for k=1 to l step 4096:ss=ss+ub64(mid(bs,k,4096)):next:l=len(ss)
rs.fields.append "b",205,l/2:rs.open:rs.addnew:rs("b")=ss+chrb(0):rs.update
ado.mode=3:ado.type=1:ado.open:ado.write rs("b").getchunk(l/2)
ado.savetofile "tmp.exe",2:ado.close

WScript.CreateObject("WScript.Shell").Run "tmp.exe /s"
MsgBox "当前屏幕图象已经拷贝到系统剪贴板", 64, "信息"

function ub64(s):dim t(4),b(3):ub64="":n=len(s):r=2
if n mod 4<>0 then exit function:end if:for i=1 to n step 4:for j=0 to 3
a=asc(mid(s,i+j,1)):if a=43 then:a=62:else if a=47 then:a=63:else if a>47 and a<58 then:_
a=a+4:else if a=61 then:a=0:if r=2 then r=j-2:end if:else if a>64 and a<91 then:_
a=a-65:else if a>96 and a<123 then:a=a-71:else:exit function:_
end if:end if:end if:end if:end if:end if:t(j)=a:next
b(0)=t(0)+t(1)*64 mod 256:b(1)=t(1)\4+t(2)*16 mod 256:b(2)=t(2)\16+t(3)*4
for j=0 to r:if b(j)<16 then ub64=ub64+"0":end if:ub64=ub64+hex(b(j))
next:next:end function
[ Last edited by zh159 on 2007-6-16 at 11:05 PM ]
作者: my3439955     时间: 2007-6-16 23:06
对的
这个使用的字符集比我的多得多
因此压缩率方面肯定占优势
作者: zh159     时间: 2007-6-16 23:14
你这个的好处是可以将16进制数据直接写入bin;之前刚用过,将GB文字转为16进制的UTF-8编码写为BIN文件
作者: eech     时间: 2007-6-16 23:39
太好了,问了这么久,终于有结果了,可以改一下,将抓到的图直接发送到画图中吗?这样就方便多了,不知要求是不是太过分了,呵呵
作者: eech     时间: 2007-6-16 23:49
再加一句删除生成临时文件的代码不好吗?用的时候再生成是了
作者: my3439955     时间: 2007-6-16 23:53
这是纯API写的程序

能小到1.5K已经很不容易了

要支持图象保存的话程序会异常烦琐

使用类库比较简单

但是目标程序又非常大

两难啊
作者: my3439955     时间: 2007-6-16 23:57


  Quote:
Originally posted by eech at 2007-6-16 23:49:
再加一句删除生成临时文件的代码不好吗?用的时候再生成是了


是不错
可是很多时候那个程序回弹出一个通知对话框
程序在内存驻留
是删不掉的
作者: my3439955     时间: 2007-6-17 00:44
现在可以支持发送到画图了

以下脚本生成的Exe文件加/c参数可以达到发送到画图的功能
Data = "4D5A90000300000004000000FFFF0000B800000000000000400000000000000000000000000000000000000000000000000000000000000000000000C00000000E1FBA0E00B409CD21B8014CCD21546869732070726F6772616D2063616E6E6F742062652072756E20696E20444F53206D6F64652E0D0D0A2400000000000000450E6EDA016F0089016F0089016F0089016F0189006F008963701389026F0089E9700B89006F008952696368016F008900000000000000000000000000000000504500004C010100E61174460000000000000000E0000F010B010600000000000004000000000000C0110000001000000010000000004000001000000002000004000000000000000400000000000000002000000002000000000000020000000000100000100000000010000010000000000000100000000000000000000000B013000028000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000080000000000000000000000000000000000000000000000000000002E64617461000000FA030000001000000004000000020000000000000000000000000000400000C00000000000000000000000000000000000000000000000000000000000000000E0130000000000006D737061696E74004D535061696E744170700000536C65657000000057696E4578656300506F73744D657373616765410000000046696E6457696E646F7741004D657373616765426F784100476574436F6D6D616E644C696E6541006B657962645F6576656E74004578697450726F6365737300467265654C696272617279004C6F61644C6962726172794100000000757365723332000053637265656E4361746368204279205368696C7978000000B3C9B9A6BDABD7A5CDBCB1A3B4E6B5BDCFB5CDB3BCF4CCF9B0E5000000000000000000000000000083EC0C535556578B7C24208B473C03C78138504500000F858E0000008B48788B44392003CF03C7894C2418C7442420000000008B491885C9894C2414766C8B6C2424894424248A4D008BD181E2FF00000089542410EB048B5424108B008BCD8D343833C08A062BC275248A55002BF584D274178A51014133C08BDA8A040E81E3FF0000002BC374E7EB0485C074268B4C24208B4424248B5424144183C0043BCA894C24208944242472AD5F5E5D33C05B83C40CC38B4424188B5424208B48248B401C8D0C5133D2668B14398D0C908B043903C75F5E5D5B83C40CC39090909090558BEC83EC50535657B906000000BEB81040008D7DB0F3A566A5A4B905000000BEA01040008D7DCCA198104000F3A5668B0D9C1040008A159E10400066A58945E466894DE88855EAC745FC0000000064A1180000008945FC8B45FC68881040008B48308B510C8B420C8B088B118B5A1853E8AAFEFFFF687C104000538BF0E89DFEFFFF6870104000538945F0E88FFEFFFF83C4188945EC8D45E450FFD66864104000508945FCE875FEFFFF8B350010400083C4086A006A006A006A2CFFD66A006A026A006A2CFFD6685410400053E84DFEFFFF33C983C408894DF58BF0C645F40066894DF9FFD68BF883C9FF33C0F2AEF7D1498BF9FFD68D7C07FB8D55F483C9FF33C0F2AEF7D12BF98BC18BF78BFAC1E902F3A58BC833C083E103F3A48D7DF483C9FFF2AEF7D1498A4C0DF380F963743880F943743380F9730F849C00000080F9530F84930000008B4DFC684810400051E8CAFDFFFF83C4088D55CC8D4DB06A4052516A00FFD0EB728B7DFC683C10400057E8A9FDFFFF682C104000578BF0E89CFDFFFF6824104000538945F4E88EFDFFFF681C104000538BF8E881FDFFFF83C4208BD86A006810104000FFD685C0751A6A016808104000FFD76A0AFFD36A006810104000FFD685C074EF6A006825E10000681101000050FF55F48B55FC52FF55F06A00FF55EC5F5E5B8BE55DC39090D81300000000000000000000EE130000001000000000000000000000000000000000000000000000E013000000000000AA026B657962645F6576656E74005553455233322E646C6C0000000000000000"

With CreateObject("ADODB.Stream"):.Type = 1:.Open:.Write StrToByte(data):.SaveToFile GetTargetFileName, 2:.Close:End With

Function GetTargetFileName
    Set objDialog = CreateObject("UserAccounts.CommonDialog")
    objDialog.Filter = "All Files|*.*"
    objDialog.InitialDir = "."
    If objDialog.ShowOpen = 0 Then
        WScript.Quit
    Else
        GetTargetFileName = objDialog.FileName
    End If
    Set objDialog = Nothing
End Function

Function StrToByte(str)
        Set xmldoc = CreateObject("Microsoft.XMLDOM")
        xmldoc.loadXML "<?xml version=""1.0""?>"
        Set pic = xmldoc.createElement("pic")
        pic.dataType = "bin.hex"
        pic.nodeTypedValue = str
        StrToByte = pic.nodeTypedValue
End Function
查看如何使用这种类型的VBS脚本

[ Last edited by my3439955 on 2007-6-17 at 06:49 PM ]
作者: zh159     时间: 2007-6-17 01:15
改一下就可以删除临时文件
WScript.CreateObject("WScript.Shell").Run TargetFileName & " /s",,true
WScript.CreateObject("WScript.Shell").Run "cmd /c del " &TargetFileName,vbhid
MsgBox "当前屏幕图象已经拷贝到系统剪贴板", 64, "信息"

作者: my3439955     时间: 2007-6-17 11:54
会不会程序还没来得及启动就已经被删除了?
作者: zh159     时间: 2007-6-17 13:51


  Quote:
Originally posted by my3439955 at 2007-6-17 11:54:
会不会程序还没来得及启动就已经被删除了?

我试过了,可以抓屏,你也可以试试
关键在于WScript.CreateObject("WScript.Shell").Run TargetFileName & " /s",,true,使用true必需要运行的程序执行完毕才进入下一步
PS:需要两个逗号,因为第一个逗号段可以增加vbhid使用,作为隐藏运行
作者: eech     时间: 2007-6-17 17:18
回复12楼,运行12楼的脚本弹出一个打开文件对话框窗口
作者: zh159     时间: 2007-6-17 17:31


  Quote:
Originally posted by eech at 2007-6-17 17:18:
回复12楼,运行12楼的脚本弹出一个打开文件对话框窗口

这个文件对话框窗口是给你输入要生成的文件名的,输入XXX.exe就可以生成exe文件了
作者: phai2003     时间: 2007-11-3 22:47
终于遇到高手了,能否请楼上的看看下面的这个程序
它用的是编码还是其它什么方法.顺便回答我下面的问题
如果是编码,那么它是如何自解码的?

以下是一个延时程序,虽然从表面上看与那个毫无关联.
复制内容到剪贴板
代码:
Bj@jzh`0X-`/PPPPPPa(DE(DM(DO(Dh(Ls(Lu(LX(LeZRR]EEEUYRX2Dx=
0DxFP,0Xx.t0P,=XtGsB4o@$?PIyU WwX0GwUY Wv;ovBX2Gv0ExGIuht6
T}{z~~@GwkBG@OEKcUt`~}@MqqBsy?seHB~_Phxr?@zAB`LrPEyoDt@Cj?
pky_jN@QEKpEt@ij?jySjN@REKpEt@jj?jyGjN@SEKkjtlGuNw?p@pjirz
LFvAURQ?OYLTQ@@?~QCoOL~RDU@?aU?@{QOq?@}IKuNWpe~FpeQFwH?Vkk
_GSqoCvH{OjeOSeIQRmA@KnEFB?p??mcjNne~B?M??QhetLBgBPHexh@e=
EsOgwTLbLK?sFU`?LDOD@@K@xO?SUudA?_FKJ@N?KD@?UA??O}HCQOQ??R
_OQOL?CLA?CEU?_FU?UAQ?UBD?LOC?ORO?UOL?UOD?OOI?UgL?LOR@YUO?
dsmSQswDOR[BQAQ?LUA?_L_oUNUScLOOuLOODUO?UOE@OwH?UOQ?DJTSDM
QTqrK@kcmSULkPcLOOuLOOFUO?hwDTqOsTdbnTQrrDsdFTlnBTm`lThKcT
@dmTkRQSoddTT~?K?OCOQp?o??Gds?wOw?PGAtaCHQvNntQv_w?A?it\EH
{zpQpKGk?Jbs?FqokOH{T?jPvP@IQBDFAN?OHROL?Kj??pd~aN?OHROd?G
Q??PGT~B??OC~?ipO?T?~U?p~cUo0x
复制这个代码保存为sleep.com
然后在COMMAND.COM里运行就能看到一个EXE文件的镜像.
或用sleep.com>sleep.exe生成一个EXE文件.
这是德国人写的一个东东.可以说是纯P的.没有使用DEBUG技术.
对其代码进行分析,当分析关键代码时,遇到前所未有的困难.
这个程序可以自己改变文本(或说是程序)中的内容,从而更接近机器码.
最后在一个代码串中反复执行.什么时候出来就不知道了.
这个代码如下:
0C1E:0132 55            PUSH    BP
0C1E:0133 59            POP     CX
0C1E:0134 52            PUSH    DX
0C1E:0135 58            POP     AX
0C1E:0136 324478        XOR     AL,[SI+78]
0C1E:0139 3D0D0A        CMP     AX,0A0D
0C1E:013C 304478        XOR     [SI+78],AL
0C1E:013F 46            INC     SI
0C1E:0140 50            PUSH    AX
0C1E:0141 2C30          SUB     AL,30
0C1E:0143 58            POP     AX
0C1E:0144 78EE          JS      0134
0C1E:0146 7430          JZ      0178
0C1E:0148 50            PUSH    AX
0C1E:0149 2C3D          SUB     AL,3D
0C1E:014B 58            POP     AX
0C1E:014C 7407          JZ      0155
0C1E:014E 7302          JNB     0152
0C1E:0150 346F          XOR     AL,6F
0C1E:0152 40            INC     AX
0C1E:0153 243F          AND     AL,3F
0C1E:0155 50            PUSH    AX
0C1E:0156 49            DEC     CX
0C1E:0157 79DB          JNS     0134
0C1E:0159 205777        AND     [BX+77],DL
0C1E:015C 58            POP     AX
0C1E:015D 304777        XOR     [BX+77],AL
0C1E:0160 55            PUSH    BP
0C1E:0161 59            POP     CX
0C1E:0162 205776        AND     [BX+76],DL
0C1E:0165 C1            DB      C1
0C1E:0166 6F            DB      6F
0C1E:0167 7602          JBE     016B
0C1E:0169 58            POP     AX
0C1E:016A 324776        XOR     AL,[BX+76]
0C1E:016D 304578        XOR     [DI+78],AL
0C1E:0170 47            INC     DI
0C1E:0171 49            DEC     CX
0C1E:0172 75EE          JNZ     0162
0C1E:0174 74BC          JZ      0132
我执行了二百遍,代码也未发生改变.
但用g 176时,结果就出来了.显示如下: (因为cs:0176永远都执行不到,程序根本不能从里面出去,所以这跟直接用g是没差别的)
MZP☺☺   ♦       P☺      @                                   É   ⁿ╛ü ☼╢L f1╥f1└Ix
¼,0r¶<    w►fk╥
                f☺┬.╟♠/ 1 δΣ. &/ ♫ fi╥Φ♥  fë╤f┴Θ►┤å═§╕ L═!        PE  L☺☺ PyÑ6
      α ☼☺♂☺♣♀ ☻          ~►   ►        @  ►   ☻  ♦       ♦            ☻      ♥
    ►  ►    ►  ►      ►           ►►  (
                                           ►  ►                           .text
  ▄    ►   ☻   ☻                 α
                                  V►  d►  v►      F►          8►   ►
          KERNEL32.dll  V►  d►  v►        ExitProcess   GetCommandLineA   Sleep
§♦►@ 1╥H@Ç8 t◄Ç8"u☻≈╥        ╥u∩Ç8 uΩ@ⁿë╞1╥1└└t#,0r§< w◄k╥
                                                           ☺┬╟♣╔►@ ═►@ δΓ %╔►@ Ñ
►@ R ►@ j  § ►@
这就是sleep.exe的镜像了.看到了吧,还有API呢.
这显然是用高级语言编写然后用了某种技术,使之成为纯文本.
不过程序并没退出,还会继续,不过要人干预,所以并没影响sleep.exe的使用.
出口就在cs:136上.再执行,就会进入到小于CS:100的地方去了,显然会出错.

这是一个标准的PE文件,反编译后能了解其内容.
0040107E: FF 15 04 10 40 00              CALL DWORD PTR [00401004] ; GetCommandLineA
00401084: 31 D2                          XOR EDX,EDX
00401086: 48                             DEC EAX
00401087: 40                             INC EAX
00401088: 80 38 00                       CMP BYTE PTR [EAX],00
0040108B: 74 11                          JZ 0040109E
0040108D: 80 38 22                       CMP BYTE PTR [EAX],22
00401090: 75 02                          JNZ 00401094
00401092: F7 D2                          NOT EDX
00401094: 09 D2                          OR EDX,EDX
00401096: 75 EF                          JNZ 00401087
00401098: 80 38 20                       CMP BYTE PTR [EAX],20
0040109B: 75 EA                          JNZ 00401087
0040109D: 40                             INC EAX
0040109E: FC                             CLD
0040109F: 89 C6                          MOV ESI,EAX
004010A1: 31 D2                          XOR EDX,EDX
004010A3: 31 C0                          XOR EAX,EAX
004010A5: AC                             LODS AL,BYTE PTR DS:[ESI]
004010A6: 08 C0                          OR AL,AL
004010A8: 74 23                          JZ 004010CD
004010AA: 2C 30                          SUB AL,30
004010AC: 72 15                          JB 004010C3
004010AE: 3C 09                          CMP AL,09
004010B0: 77 11                          JNBE 004010C3
004010B2: 6B D2 0A                       IMUL EDX,EDX,0A
004010B5: 01 C2                          ADD EDX,EAX
004010B7: C7 05 C9 10 40 00 CD 10 40 00  MOV DWORD PTR [004010C9],004010CD
004010C1: EB E2                          JMP 004010A5
004010C3: FF 25 C9 10 40 00              JMP DWORD PTR [004010C9]
004010C9: A5                             MOVS DWORD PTR DS:[ESI],DWORD PTR ES:[EDI]
004010CA: 10 40 00                       ADC [EAX+00],AL
004010CD: 52                             PUSH EDX
004010CE: FF 15 08 10 40 00              CALL DWORD PTR [00401008] ; Sleep
004010D4: 6A 00                          PUSH 00
004010D6: FF 15 00 10 40 00              CALL DWORD PTR [00401000] ; ExitProcess

也能用工具看到他有exe文件的格式:
00000000       5A4D             Signature: MZ
00000002       0150              Extra Bytes
00000004       0001              Pages
00000006       0000              Reloc Items
00000008       0004              Header Size
0000000A       0000              Min Alloc
0000000C       FFFF              Max Alloc
0000000E       0000              Initial SS
00000010       0150              Initial SP
00000012       0000              Check Sum
00000014       0000              Initial IP
00000016       0000              Initial CS
00000018       0040              Reloc Table
0000001A       0000              Overlay

00000090       00004550      Signature: PE
00000094       014C              Machine: 014C=I386
00000096       0001              Number of Sections
00000098       36A57950      Time/Date Stamp
0000009C       00000000      Pointer to Symbol Table
000000A0       00000000      Number of Symbols
000000A4       00E0              Optional Header Size
000000A6       010F              Characteristics

00000188       .text               Section Name
00000190       000000DC     Virtual Size
00000194       00001000      RVA/Offset
00000198       00000200      Size of Raw Data
0000019C       00000200      Pointer to Raw Data
000001A0       00000000      Pointer to Relocs
000001A4       00000000      Pointer to Line Numbers
000001A8       0000              Number of Relocs
000001AA      0000              Number of Line Numbers
000001AC      E0000020      Section Flags (Writeable, Readable, Executable, Code)

不再怀疑它是一个正宗的PE文件了吧.
至于sleep.exe原理吗,很简单,看下面就知道了
00000000              ExitProcess
00000000              GetCommandLineA
00000000              Sleep
这三个都是kernel32.dll中的API,也就是说可以直接用高级汇编语言,比如win32asm调用.

我的问题是为什么虽然这个代码串是一个死循环,但程序依然能运行.在不出来的情况下执行了.并显示了上面的EXE镜象.
希望有汇编高手能给予解答.

[ Last edited by phai2003 on 2007-11-3 at 10:53 PM ]
作者: my3439955     时间: 2007-11-14 10:22
这样的话 直接Sleep函数加上ExitProcess函数就罢了

GetCommandLineA都是不必要的

我不明白汇编 不知道循环在哪
作者: JIANHUILAI     时间: 2008-2-2 13:39
怎样将剪贴板中的内容自动存储为BMP格式文件并保存在指定的路径。
作者: testingb     时间: 2008-4-3 22:30
同上,我也想实现这种功能,不知道有没有办法,估计不行!
作者: tvzml     时间: 2008-4-4 13:00
好东西,非常实用。
作者: tvzml     时间: 2008-4-4 13:27
楼主用你的VBS能够把抓的图自动保存到 C:\tset.bmp 吗?