看有人求去弹窗,应该是魔兽争霸的开图工具,顺手看看,不知此程序是否坛里兄弟所写,得罪之处敬请原谅,程序也有新版本,
应该有所不同,此文只做研究交流,并无其它用意.
程序没壳,但是是P-code的,启动和关闭的时候都会打开程序主页,而且此主页会弹广告
类似的问题一般认为比较容易,直接搜索主页地址改掉就行,试了下把所有的字符串都改了还是不行,原来没这么简单
VB的程序一般不太想碰,用OD不太好调试,N年前用过WKT VBDebugger,还是回顾下吧,我用的是1.3,其它版本应该也没问题
先用WKT加载程序,然后点WKT上的Run,接着会弹出两个MessageBox,尽快把他们点掉,不然程序会假死,最后出现个让人眼花
的界面,这就是WKT的调试界面,怎么用?以前我的文章提过,不过估计也搜索不到了,这调试器的资料实在太少了,这里补充下:
左上窗口为p-code的代码,右上窗是堆践窗口,左下是程序运行的结果
有几个按键常用的,其它的我讲不出来它的功能,Save Source是保存当前代码窗口里的代码,Save Messages保存运行结果,
Form Manager可显示程序各个Form的资料,应该很有用的,Class Manager同上一样不过是显示Class的,API显示程序调用到的
Api地址(双击可设断点),Opcodes显示OPcodes代码的地址(双击可设断点),On Execution是调试过程中的中断列表,其效果就
象Trw的bl命令,Memory Dump等同于Trw的D和U命令,String Refs是程序的字串列表,右边还有几个鍵是调试程序用的,分别对应
热鍵F8,F12,F10,F5,F6,前四个的功能和Trw的功能是一样的,F6能让你指定调试时一次运行的行数.
先看下开始处的代码:
00423018: 00 LargeBos
0042301A: 00 LargeBos
0042301C: 4B OnErrorGoto Next
0042301F: 00 LargeBos
00423021: 0A ImpAdCallFPR4 Module1!00420E78h
00423026: 00 LargeBos
00423028: F5 LitI4: -> 1h 1
0042302D: 59 PopTmpLdAdStr
00423030: 1B LitStr: 'X<<t4FF@#(aX3us'
00423033: 0B ImpAdCallI2 RWini!00421B2Ch
00423038: 23 FStStrNoPop
0042303B: 08 FLdPr
0042303E: FD Lead2/MemStStrCopy
00423042: 2F FFree1Str
00423045: 00 LargeBos
00423047: 1B LitStr: 'http://warmh.cn/software/warmhvv.htm'
0042304A: 08 FLdPr
0042304D: FD Lead2/MemStStrCopy
00423051: 00 LargeBos
看不懂吧,我也看不懂,不过还是能猜出点什么,至少能看出来ListStr是指字符串,后面那个明显是网址:)
按下Ctrl+S看看还有哪些字符串,没什么有用的,都是些标题和网址之类的,之前也试过改掉没用,所以就忽略了
其中有个字符串很特别,上面的代码也有,对的就是它'X<<t4FF@#(aX3us',职业敏感提醒我们,类似的字符串十有
八九有问题,双击00423030: 1B LitStr: 'X<<t4FF@#(aX3us'这一行下中断,F5运行,中断后我们F8单步看看
调试技巧:
00421B55: 66 NextI4: jump to 00421B45 Counter = 33
看到带有Jump的行,是个循环,按F10是执行到循环退出也就是下一行,反正代码也看不懂,不过要注意的是如果这样跳出循环
是看不到结果的,如果一个循环过程是生成注册码的话,你就错过咯
跳过一个没结果显示的Jump后,来到这里(这是循环执行过几次的代码,你的有可能不一样)
00421C34: 28 LitVarI2 0012F8DCh 1h , 1
00421C39: 6C ILdRf 0000000Ch
00421C3C: 04 FLdRfVar 0012F944h
00421C3F: 4D CVarRef:
00421C44: 04 FLdRfVar 0012F8A0h
00421C47: 0A ImpAdCallFPR4 rtcMidCharVar on address 7347A5FBh
00421C4C: 04 FLdRfVar 0012F8A0h
00421C4F: FD Lead2/CStrVarVal
00421C53: 0B ImpAdCallI2 rtcAnsiValueBstr on address 7347A683h
00421C58: FC Lead1/CUI1I2
00421C5A: FC Lead1/FStUI1
00421C5E: 2F FFree1Str
00421C61: 36 FFreeVar -> 2
00421C68: FC Lead1/FLdUI1
00421C6C: E7 CI4UI1
00421C6D: 04 FLdRfVar 0012F908h
00421C70: FC Lead1/Ary1LdUI1
00421C72: E7 CI4UI1
00421C73: 04 FLdRfVar 0012F8DCh
从这开始是个循环,当单步大概到后面的Jump时结果窗口会显示出一个个的字符,如下:
Stack dump is enabled and relative to ESP<-EBP.
Breakpoint reached.
FStStr -> ' '
Freeing Addrs: 0012F8DCh 0012F8A0h
FStStrNoPop -> 'h'
Freeing Addrs: 0012F8DCh 0012F8A0h 0012F88Ch
Freeing Addrs: 0012F8DCh 0012F8A0h
FStStrNoPop -> 't'
Freeing Addrs: 0012F8DCh 0012F8A0h 0012F88Ch
Freeing Addrs: 0012F8DCh 0012F8A0h
FStStrNoPop -> 't'
Freeing Addrs: 0012F8DCh 0012F8A0h 0012F88Ch
Freeing Addrs: 0012F8DCh 0012F8A0h
FStStrNoPop -> 'p'
Freeing Addrs: 0012F8DCh 0012F8A0h 0012F88Ch
Freeing Addrs: 0012F8DCh 0012F8A0h
FStStrNoPop -> ':'
Freeing Addrs: 0012F8DCh 0012F8A0h 0012F88Ch
Freeing Addrs: 0012F8DCh 0012F8A0h
FStStrNoPop -> '/'
Freeing Addrs: 0012F8DCh 0012F8A0h 0012F88Ch
Freeing Addrs: 0012F8DCh 0012F8A0h
FStStrNoPop -> '/'
Freeing Addrs: 0012F8DCh 0012F8A0h 0012F88Ch
Freeing Addrs: 0012F8DCh 0012F8A0h
FStStrNoPop -> 'w'
Freeing Addrs: 0012F8DCh 0012F8A0h 0012F88Ch
Freeing Addrs: 0012F8DCh 0012F8A0h
FStStrNoPop -> 'a'
Freeing Addrs: 0012F8DCh 0012F8A0h 0012F88Ch
Freeing Addrs: 0012F8DCh 0012F8A0h
FStStrNoPop -> 'r'
Freeing Addrs: 0012F8DCh 0012F8A0h 0012F88Ch
Freeing Addrs: 0012F8DCh 0012F8A0h
FStStrNoPop -> 'm'
Freeing Addrs: 0012F8DCh 0012F8A0h 0012F88Ch
......
仔细观察这个循环执行时的堆栈,会发现'X<<t4FF@#(aX3us'里的字符逐个会出现,而这个字符串的长度与弹出的网址长度一样,
很明显是在解密字符串,猜想是个比较简单的算法,就不研究它是怎样算了,找到了目标,我们试试改下这个加密的字符串
用WinHex打开程序搜索'X<<t4FF@#(aX3us',选Unicode,找到一处
0001c070h: 00 00 00 00 00 00 00 00 1E 00 00 00 58 00 3C 00 ; ............X.<.
0001c080h: 3C 00 74 00 34 00 46 00 46 00 40 00 23 00 28 00 ; <.t.4.F.F.@.#.(.
0001c090h: 61 00 58 00 33 00 75 00 73 00 00 00 16 00 00 00 ; a.X.3.u.s.......
把字符串全清0,运行一下,提示'请不要破解本程序, 谢谢合作.'然后出错了,字符串前面是长度,把他也清0试试
程序正常启动,也没再弹出窗口了,但是,退出程序却卡住了,要等很久才能关闭.
因为不知道程序的算法和判断方式,索性就直接把他字符串改成另外的试试,把第一个X改成S,程序果然就能正常启动
和退出了,弹窗也完全没了,再调试发现字符串解密出来变成dttp://....了,程序里应该有个判断不是http开头就忽略
掉了,至此大功告成.
总结下:
搜索
58 00 3C 00 3C 00 74 00 34 00 46 00 46 00 40
把58改成53即可
Sam.com 2009年10月16日
[招生]系统0day安全班,企业级设备固件漏洞挖掘,Linux平台漏洞挖掘!