首页
社区
课程
招聘
[原创]漏洞?利用工具获取被FoxLock加密后的VFP程序未加密原代码(随笔)
发表于: 2007-7-30 06:29 10159

[原创]漏洞?利用工具获取被FoxLock加密后的VFP程序未加密原代码(随笔)

2007-7-30 06:29
10159
【标题】漏洞?利用工具获取被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直播授课

收藏
免费 0
支持
分享
最新回复 (16)
雪    币: 0
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
2
思路清晰 精彩 学习 高人 膜拜
2007-7-30 07:23
0
雪    币: 224
活跃值: (33)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
vf脱壳要从运行库下手。像楼主这样要全部搞开一个exe文件可能要几个月啊。
2007-7-30 10:24
0
雪    币: 210
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
高手呀!佩服佩服
2007-7-30 11:10
0
雪    币: 817
活跃值: (1927)
能力值: ( LV12,RANK:2670 )
在线值:
发帖
回帖
粉丝
5
何必全部分析呢?我们的目的主要是分析程序的注册部分,直接对注册代码部分下手就可以了,而以上是我举的例子而已。
2007-7-30 11:32
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
老K真是强大啊
学习 支持(虽然看不懂 嘎嘎)
2007-7-30 12:25
0
雪    币: 690
活跃值: (1821)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
7
foxlock好象是Aming写的,看样子作者不会更新了!
2007-7-30 13:30
0
雪    币: 817
活跃值: (1927)
能力值: ( LV12,RANK:2670 )
在线值:
发帖
回帖
粉丝
8
嗯,是Aming写的,不过就是好象没有更好的文章来解决被FOXLOCK加密的程序
2007-7-30 14:45
0
雪    币: 325
活跃值: (97)
能力值: ( LV13,RANK:530 )
在线值:
发帖
回帖
粉丝
9
强人哈,膜拜留恋。
2007-7-30 15:22
0
雪    币: 224
活跃值: (147)
能力值: ( LV9,RANK:970 )
在线值:
发帖
回帖
粉丝
10
支持~~
2007-7-30 15:37
0
雪    币: 224
活跃值: (33)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
你把文件地址发过来。我给你脱脱看。
2007-7-30 18:56
0
雪    币: 205
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
喜欢这种帖子,顶一个。谢谢楼主。
2007-7-31 01:09
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
好像不错哦.支持下.
2007-7-31 01:26
0
雪    币: 175
活跃值: (2331)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
那位有FoxLock?
2007-7-31 20:58
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
好看好看,谢谢。
2007-8-2 00:29
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
破的是什么版本的foxlock?
2007-8-6 09:28
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
好像不错哦.支持下.
2007-8-9 14:31
0
游客
登录 | 注册 方可回帖
返回
//