【标题】漏洞?利用工具获取被FoxLock加密后的VFP程序未加密原代码(随笔)
【作者】KuNgBiM
【邮箱】kungbim[at]163.com
【目的】学习而已
今天一朋友叫我帮他看一个要求注册才能使用的程序,查壳粗略一看Microsoft Visual Basic 5.0 / 6.0编译,但奇怪的发现程序包内有VFP6R.DLL、VFP6RCHS.DLL、VFP6RENU.DLL这么几个VFP程序的动态连接库文件,难道VB与VFP混编?没听过......
纳闷之余,拿出OD胡乱下断一番,但一个F9运行就把调试器KILL了,难道判断失物?程序被伪装?被加密?于是乎又拿出PEID仔细查看了下,区段显示“.foxlock”这不是VFP的保护壳吗?这下没辙了,公开的工具中没有一个能现成脱壳的,而找寻前辈的文章中也没有一篇关于它的脱壳文章。但抱着Cracker不弃不馁的原则,决定小小研究一翻。
此时我联想到了现在很多的木马类壳和捆绑程序的运行原理,在内存中释放执行决定试一试,看内存中能否抓取被FoxLock加密后的VFP程序的代码,于是运行该程序后,然后打开WinHex找到对应程序的进程,然后在“整个内存”中搜索“注册”一类的关键字符,果然找到了下面一类的代码。(为了不损害作者的利益,我把WEB地址替换掉了)
00184A20 01 00 00 00 10 56 45 52 53 49 4F 4E 20 3D 20 20 .....VERSION =
00184A30 20 33 2E 30 30 00 00 00 01 00 00 00 0F 64 61 74 3.00........dat
00184A40 61 65 6E 76 69 72 6F 6E 6D 65 6E 74 00 00 00 01 aenvironment....
00184A50 00 00 00 0F 64 61 74 61 65 6E 76 69 72 6F 6E 6D ....dataenvironm
00184A60 65 6E 74 00 00 00 01 00 00 00 0F 44 61 74 61 65 ent........Datae
00184A70 6E 76 69 72 6F 6E 6D 65 6E 74 00 00 00 01 00 00 nvironment......
00184A80 00 1A 4E 61 6D 65 20 3D 20 22 44 61 74 61 65 6E ..Name = "Dataen
00184A90 76 69 72 6F 6E 6D 65 6E 74 22 0D 0A 00 00 00 01 vironment"......
00184AA0 00 00 00 01 31 00 00 00 01 00 00 00 01 31 00 00 ....1........1..
00184AB0 00 01 00 00 00 04 66 6F 72 6D 00 00 00 01 00 00 ......form......
00184AC0 00 04 66 6F 72 6D 00 00 00 01 00 00 00 05 46 6F ..form........Fo
00184AD0 72 6D 31 00 00 00 01 00 00 00 DF 54 6F 70 20 3D rm1.......逿op =
00184AE0 20 30 0D 0A 4C 65 66 74 20 3D 20 30 0D 0A 48 65 0..Left = 0..He
00184AF0 69 67 68 74 20 3D 20 31 39 31 0D 0A 57 69 64 74 ight = 191..Widt
00184B00 68 20 3D 20 34 31 37 0D 0A 44 6F 43 72 65 61 74 h = 417..DoCreat
00184B10 65 20 3D 20 2E 54 2E 0D 0A 43 61 70 74 69 6F 6E e = .T...Caption
00184B20 20 3D 20 22 D7 A2 B2 E1 20 22 0D 0A 46 6F 6E 74 = "注册 "..Font
00184B30 53 69 7A 65 20 3D 20 31 30 0D 0A 4D 61 78 42 75 Size = 10..MaxBu
00184B40 74 74 6F 6E 20 3D 20 2E 46 2E 0D 0A 46 6F 72 65 tton = .F...Fore
00184B50 43 6F 6C 6F 72 20 3D 20 31 32 38 2C 30 2C 32 35 Color = 128,0,25
00184B60 35 0D 0A 6C 6E 6F 77 72 65 67 20 3D 20 0D 0A 69 5..lnowreg = ..i
00184B70 65 31 20 3D 20 77 77 77 2E 78 78 78 78 2E 63 6F e1 = www.xxxx.co
00184B80 6D 2F 78 78 78 78 0D 0A 69 65 32 20 3D 20 77 77 m/xxxx..ie2 = ww
00184B90 77 2E 78 78 78 78 2E 63 6F 6D 2F 78 78 78 78 2F w.xxxx.com/xxxx/
00184BA0 78 78 78 78 2E 68 74 6D 0D 0A 4E 61 6D 65 20 3D xxxx.htm..Name =
00184BB0 20 22 46 6F 72 6D 31 22 0D 0A 00 00 00 01 00 00 "Form1"........
00184BC0 0E 75 50 52 4F 43 45 44 55 52 45 20 55 6E 6C 6F .uPROCEDURE Unlo //注意这里开始的代码!
00184BD0 61 64 0D 0A 6C 78 6E 3D 70 66 6C 6D 6E 0D 0A 6C ad..lxn=pflmn..l
00184BE0 76 6D 78 3D 33 30 30 0D 0A 6C 73 63 3D 74 68 69 vmx=300..lsc=thi
00184BF0 73 66 6F 72 6D 2E 6C 6E 6F 77 72 65 67 0D 0A 6C sform.lnowreg..l
00184C00 74 6D 78 3D 67 65 74 69 76 28 6C 78 6E 2C 22 49 tmx=getiv(lxn,"I
00184C10 6E 66 6F 72 6D 61 74 69 6F 6E 22 2C 22 44 65 73 nformation","Des
00184C20 63 72 69 70 22 2C 22 30 30 22 29 0D 0A 6C 76 73 crip","00")..lvs
00184C30 3D 74 68 69 73 66 6F 72 6D 2E 6C 6E 6F 77 72 65 =thisform.lnowre
00184C40 67 0D 0A 6C 73 63 31 3D 26 4C 49 4D 58 53 30 55 g..lsc1=&LIMXS0U
00184C50 2E 0D 0A 6C 6E 74 3D 66 6D 74 6F 6E 31 28 72 73 ...lnt=fmton1(rs
00184C60 6F 62 28 67 65 74 69 76 28 6C 78 6E 2C 22 41 6C ob(getiv(lxn,"Al
00184C70 6C 52 69 67 68 74 53 65 72 76 65 72 22 2C 22 56 lRightServer","V
00184C80 65 72 22 2C 22 42 22 29 29 29 0D 0A 6C 63 69 67 er","B")))..lcig
00184C90 74 3D 22 54 68 69 73 66 6F 72 6D 73 65 74 2E 66 t="Thisformset.f
00184CA0 6F 72 6D 33 2E 54 65 78 74 31 2E 4D 61 78 6C 65 orm3.Text1.Maxle
00184CB0 6E 67 74 68 3D 22 0D 0A 69 66 20 6C 73 63 31 3D ngth="..if lsc1=
00184CC0 6C 74 6D 78 20 74 68 65 6E 0D 0A 09 69 66 20 74 ltmx then...if t
00184CD0 79 70 65 28 22 6C 76 6D 78 22 29 23 22 55 22 20 ype("lvmx")#"U"
00184CE0 74 68 65 6E 0D 0A 09 09 6C 76 6D 78 3D 33 35 36 then....lvmx=356
00184CF0 0D 0A 09 65 6E 64 69 66 0D 0A 09 69 66 20 6C 6E ...endif...if ln
00184D00 74 3E 31 36 30 0D 0A 09 09 6C 76 6D 78 3D 33 0D t>160....lvmx=3.
00184D10 0A 09 65 6E 64 69 66 0D 0A 09 69 66 20 6C 78 72 ..endif...if lxr
00184D20 73 28 67 65 74 69 76 28 6C 78 6E 2C 22 41 6C 6C s(getiv(lxn,"All
00184D30 52 69 67 68 74 53 65 72 76 65 72 22 2C 22 56 61 RightServer","Va
00184D40 72 22 2C 72 73 6F 62 28 73 79 73 28 33 29 29 29 r",rsob(sys(3)))
00184D50 29 23 67 65 74 69 76 28 6C 78 6E 2C 22 49 6E 66 )#getiv(lxn,"Inf
00184D60 6F 72 6D 61 74 69 6F 6E 22 2C 22 43 72 65 61 74 ormation","Creat
00184D70 65 42 79 22 2C 22 31 31 22 29 20 74 68 65 6E 0D eBy","11") then.
00184D80 0A 09 09 6C 63 76 3D 67 65 74 69 76 28 6C 78 6E ...lcv=getiv(lxn
00184D90 2C 22 41 6C 6C 52 69 67 68 74 53 65 72 76 65 72 ,"AllRightServer
00184DA0 22 2C 22 56 61 72 22 2C 72 73 6F 62 28 73 79 73 ","Var",rsob(sys
00184DB0 28 33 29 29 29 0D 0A 09 09 70 75 74 69 76 28 6C (3)))....putiv(l
00184DC0 78 6E 2C 22 41 6C 6C 52 69 67 68 74 53 65 72 76 xn,"AllRightServ
00184DD0 65 72 22 2C 22 56 61 72 22 2C 6C 63 76 29 0D 0A er","Var",lcv)..
00184DE0 09 09 70 75 74 69 76 28 6C 78 6E 2C 22 49 6E 66 ..putiv(lxn,"Inf
00184DF0 6F 72 6D 61 74 69 6F 6E 22 2C 22 43 72 65 61 74 ormation","Creat
00184E00 65 42 79 22 2C 6C 78 72 73 28 6C 63 76 29 29 0D eBy",lxrs(lcv)).
00184E10 0A 09 09 70 75 74 69 76 28 6C 78 6E 2C 22 49 6E ...putiv(lxn,"In
00184E20 66 6F 72 6D 61 74 69 6F 6E 22 2C 22 54 79 70 65 formation","Type
00184E30 22 2C 22 4A 72 65 22 29 0D 0A 09 09 70 75 74 69 ","Jre")....puti
00184E40 76 28 6C 78 6E 2C 22 41 6C 6C 52 69 67 68 74 53 v(lxn,"AllRightS
00184E50 65 72 76 65 72 22 2C 22 56 65 72 22 2C 22 42 22 erver","Ver","B"
00184E60 29 0D 0A 09 65 6E 64 69 66 0D 0A 65 6C 73 65 09 )...endif..else.
00184E70 0D 0A 09 6C 74 76 6D 3D 67 65 74 69 76 28 6C 78 ...ltvm=getiv(lx
00184E80 6E 2C 22 49 6E 66 6F 72 6D 61 74 69 6F 6E 22 2C n,"Information",
00184E90 22 4D 79 43 6F 64 65 22 2C 22 2B 2B 22 29 0D 0A "MyCode","++")..
00184EA0 09 69 66 20 61 74 28 6C 74 76 6D 2C 6C 73 63 29 .if at(ltvm,lsc)
00184EB0 3D 31 20 6F 72 20 61 74 28 6C 73 63 2C 6C 74 76 =1 or at(lsc,ltv
00184EC0 6D 29 3D 31 20 74 68 65 6E 0D 0A 09 09 6C 76 73 m)=1 then....lvs
00184ED0 3D 6C 74 76 6D 0D 0A 09 09 69 66 20 6C 74 6D 78 =ltvm....if ltmx
00184EE0 3D 26 4C 49 4D 58 53 30 55 2E 20 74 68 65 6E 0D =&LIMXS0U. then.
00184EF0 0A 09 09 09 69 66 20 74 79 70 65 28 22 6C 76 6D ....if type("lvm
00184F00 78 22 29 23 22 55 22 20 74 68 65 6E 0D 0A 09 09 x")#"U" then....
00184F10 09 09 6C 76 6D 78 3D 33 35 36 0D 0A 09 09 09 65 ..lvmx=356.....e
00184F20 6E 64 69 66 0D 0A 09 09 09 69 66 20 6C 6E 74 3E ndif.....if lnt>
00184F30 31 36 30 0D 0A 09 09 09 09 6C 76 6D 78 3D 33 0D 160......lvmx=3.
00184F40 0A 09 09 09 65 6E 64 69 66 09 0D 0A 09 09 65 6E ....endif.....en
00184F50 64 69 66 0D 0A 09 65 6C 73 65 09 09 0D 0A 09 09 dif...else......
00184F60 69 66 20 6C 6E 74 3E 38 20 74 68 65 6E 0D 0A 09 if lnt>8 then...
00184F70 09 09 69 66 20 74 79 70 65 28 22 6C 76 6D 78 22 ..if type("lvmx"
00184F80 29 23 22 55 22 20 74 68 65 6E 0D 0A 09 09 09 09 )#"U" then......
00184F90 6C 76 6D 78 3D 33 0D 0A 09 09 09 65 6E 64 69 66 lvmx=3.....endif
00184FA0 0D 0A 09 09 65 6E 64 69 66 0D 0A 09 65 6E 64 69 ....endif...endi
00184FB0 66 0D 0A 65 6E 64 69 66 0D 0A 6C 63 69 67 74 3D f..endif..lcigt=
00184FC0 6C 63 69 67 74 2B 74 72 61 6E 28 6C 76 6D 78 29 lcigt+tran(lvmx)
00184FD0 0D 0A 66 6F 72 20 6C 69 3D 31 20 74 6F 20 31 30 ..for li=1 to 10
00184FE0 0D 0A 09 6C 63 69 67 74 69 3D 67 65 74 69 76 28 ...lcigti=getiv(
00184FF0 22 44 61 74 61 2E 69 6E 69 22 2C 22 53 65 74 22 "Data.ini","Set"
00185000 2C 22 44 65 66 61 75 74 6C 53 65 72 76 65 72 22 ,"DefautlServer"
00185010 2C 22 30 30 22 29 0D 0A 09 69 66 20 6C 63 69 67 ,"00")...if lcig
00185020 74 69 3D 22 30 30 22 20 74 68 65 6E 0D 0A 09 09 ti="00" then....
00185030 65 78 69 74 0D 0A 09 65 6E 64 69 66 0D 0A 65 6E exit...endif..en
00185040 64 66 6F 72 0D 0A 45 4E 44 50 52 4F 43 0D 0A 00 dfor..ENDPROC...
(只是为了举例,代码略)
从以上代码复制整理后可直接还原成以下代码(未加密的VFP程序源代码):
uPROCEDURE Unload
lxn=pflmn
lvmx=300
lsc=thisform.lnowreg
ltmx=getiv(lxn,"Information","Descrip","00")
lvs=thisform.lnowreg
lsc1=&LIMXS0U.
lnt=fmton1(rsob(getiv(lxn,"AllRightServer","Ver","B")))
lcigt="Thisformset.form3.Text1.Maxlength="
if lsc1=ltmx then
if type("lvmx")#"U" then
lvmx=356
endif
if lnt>160
lvmx=3
endif
if lxrs(getiv(lxn,"AllRightServer","Var",rsob(sys(3))))#getiv(lxn,"Information","CreateBy","11") then
lcv=getiv(lxn,"AllRightServer","Var",rsob(sys(3)))
putiv(lxn,"AllRightServer","Var",lcv)
putiv(lxn,"Information","CreateBy",lxrs(lcv))
putiv(lxn,"Information","Type","Jre")
putiv(lxn,"AllRightServer","Ver","B")
endif
else
ltvm=getiv(lxn,"Information","MyCode","++")
if at(ltvm,lsc)=1 or at(lsc,ltvm)=1 then
lvs=ltvm
if ltmx=&LIMXS0U. then
if type("lvmx")#"U" then
lvmx=356
endif
if lnt>160
lvmx=3
endif
endif
else
if lnt>8 then
if type("lvmx")#"U" then
lvmx=3
endif
endif
endif
endif
lcigt=lcigt+tran(lvmx)
for li=1 to 10
lcigti=getiv("Data.ini","Set","DefautlServer","00")
if lcigti="00" then
exit
endif
endfor
ENDPROC
相信大家看到上面的代码已经明白了吧?这样就不怕不能反编译被FoxLock保护的VFP程序了!
结束语:FoxLock是没内存保护功能呢?还是有该功能作者没用或者是程序的加密力度不够强大?
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课