僅以此程式碼獻給我所有朋友或愛好VFP的朋友。 (10千字)
VFP 結構學習小工具
====================================
原始碼及編譯後的檔案:http://www.foxlock.net/fox.zip
'-----------------------------------------------------------------------------------------
' VFP-STRUCTURE Written By Aming Plindge Studio,1997-2002
' VFP反編譯的第一步,標準APP檔案的識別,但願此對VFP研究的朋友有一絲幫助
' 接觸Fox是1997在JNU的時候,研究也是在1997的年底,不是Fox,起碼不會“認識”琳丫頭,更不會
' 有今天的“品琳居”,呵呵。。
' Http://plindge.yeah.net Email:plindge@163.com
'-----------------------------------------------------------------------------------------
Option Explicit
Public Type VfpStructure
aAppFileName
As String '*// APP檔案的名稱
aIsApp As Boolean
'*// 是否為VFP的APP檔案
aAppSize As Long
'*// APP 檔案的實際長度
aFoxVersion
As String '*// VFP 檔案的版本
aEncrypt As String
'*// 檔案是否加密編譯
aFileNumbers As Long
'*// APP中所包含檔案的總數
aFileListStartPos
As Long '*// 檔案列表的開始位置
aFileListEndPos
As Long '*// 檔案列表的結束位置
aFileListSize As Long '*// 檔案列表的長度
aMainFileInFileList As Long '*//
主檔案在檔案列表的序號
aMainFileName As String
'*// 主檔案的名稱
aFilesName() As String
'*// 所有檔案的名稱
aFileNamePos() As
Long '*// 所有檔案各自名字在檔案列表的偏移
aFilesType() As Byte '*//
所有檔案各自的型別
aFilesStartPos() As Long
'*// 所有檔案各自在APP的開始位置
aFilesEndPos() As Long
'*// 所有檔案各自在APP的結束位置
aFilesSize()
As Long '*// 所有檔案各自的長度
aFoxChkSum As String '*//
FOX 程式的檢校 FoxChkSum
End Type
'--------------------------------------------------------------------------------------------
'- 對於VFP6.0/7.0 的APP檔案而言,其標誌為 FE F2 FF[EE] 20 02
'- 00h-04h 為VFP的版本標識
其中 02h FF表示為不加密編譯,EE表示加密編譯,20 表明該檔案為VFP6/7
'- * 對VFP的反編譯而言,第一步就是將加密的APP轉成普通的APP。
'- 05h-06h 檔案的數目 07h-08h 主檔案在檔案列表中的序號
'- 09h-0Ch 檔案列表的結束位置[EPOS]
0D-10h 檔案列表的開始位置[SPOS] 11h-14h 檔案列表長度
'- 15h-27h 保留 28h-29h 前37個位元組的檢校,進一步判斷是否為FOX檔案
'--------------------------------------------------------------------------------------------
Public Function GetFoxFile(aFile As String) As VfpStructure
Dim
aHeard(0 To 40) As Byte
On Error GoTo MetErrors:
GetFoxFile.aAppFileName
= aFile
Open aFile For Binary As #1
Get #1, , aHeard()
If aHeard(0) <> &HFE Or aHeard(1) <>
&HF2 Then
Close #1
GetFoxFile.aIsApp = False
Exit Function
ElseIf
aHeard(2) = &HFF Then
GetFoxFile.aIsApp
= True
GetFoxFile.aEncrypt = "[不加密]"
If aHeard(3) = &H1B Then
GetFoxFile.aFoxVersion = "VFP 3.0"
ElseIf aHeard(3) = &H1F Then
GetFoxFile.aIsApp = True
GetFoxFile.aFoxVersion = "VFP 5.0"
ElseIf aHeard(3) = &H20 Then
GetFoxFile.aIsApp = True
GetFoxFile.aFoxVersion
= "VFP 6.0/7.0"
End If
ElseIf aHeard(2) = &HEE Or aHeard(2) = &HFE Then
GetFoxFile.aIsApp = True
GetFoxFile.aEncrypt = "[加密]"
Close #1
Exit Function
Else
GetFoxFile.aIsApp = False
Close #1
Exit Function
End If
GetFoxFile.aFoxChkSum = Hex(aHeard(40)) & Hex(aHeard(39))
'// ChkSum 檢校
GetFoxFile.aFileNumbers = aHeard(5)
+ aHeard(6) * 16 ^ 2 '// 檔案數目
GetFoxFile.aMainFileInFileList
= aHeard(7) + aHeard(8) * 16 ^ 2 '// 主檔案在檔案列表的序號
Seek #1, 10
Get #1, 10, GetFoxFile.aFileListEndPos '// 檔案列表的結束地址
Seek #1, 14
Get #1, 14, GetFoxFile.aFileListStartPos
'// 檔案列表的開始地址
Seek #1, 18
Get #1, 18, GetFoxFile.aFileListSize '// 檔案列表的長度,實際也 = 檔案列表的結束地址 - 檔案列表的開始地址
' 以下程式碼重新定義各陣列大小
ReDim GetFoxFile.aFilesName(0
To GetFoxFile.aFileNumbers - 1) As String '// 檔名
ReDim GetFoxFile.aFilesType(0 To UBound(GetFoxFile.aFilesName)) As Byte
'// 檔案型別
ReDim GetFoxFile.aFileNamePos(0 To UBound(GetFoxFile.aFilesName))
As Long '// 檔名在列表中的位置
ReDim GetFoxFile.aFilesStartPos(0
To UBound(GetFoxFile.aFilesName)) As Long '// 檔案的開始地址
ReDim
GetFoxFile.aFilesEndPos(0 To UBound(GetFoxFile.aFilesName)) As Long '//
檔案的結束地址
ReDim GetFoxFile.aFilesSize(0 To UBound(GetFoxFile.aFilesName))
As Long '// 檔案的實際長度也= 結束地址 - 開始地址
' 每個檔案結構的存放空間是25位元組,因此
APP中,檔案列表的結束位置開始算的話,
' 後面的部分剛好 = 檔案數 * 25,在EXE則比標準APP多14位元組,= 檔案數 * 25 + 14
' 14個位元組來儲存 APP 的長度及編譯引數。
Dim m As Long, n As Long
For m = 0 To GetFoxFile.aFileNumbers - 1
Seek #1, (GetFoxFile.aFileListEndPos + 1) + m * 25
Get #1, (GetFoxFile.aFileListEndPos + 1) + m * 25,
GetFoxFile.aFilesType(m) '// 檔案型別,00 表示程式碼,0X 表示資料
Seek #1, (GetFoxFile.aFileListEndPos + 2) + m * 25
Get #1, (GetFoxFile.aFileListEndPos + 2) + m * 25,
GetFoxFile.aFilesStartPos(m) '// 每個檔案的開始地址
Seek
#1, (GetFoxFile.aFileListEndPos + 2) + m * 25 + 12
Get #1, (GetFoxFile.aFileListEndPos + 2) + m * 25 + 12, GetFoxFile.aFileNamePos(m)
'// 每個檔名在檔案列表的開始地址
Next m
' 以下程式碼用於取每個檔案的結束地址
For m = 0 To UBound(GetFoxFile.aFilesEndPos) - 1
GetFoxFile.aFilesEndPos(m) = GetFoxFile.aFilesStartPos(m
+ 1) - 1
Next m
' 最後一個檔案的結束地址當然是檔案列表開始的前一位元組啦
GetFoxFile.aFilesEndPos(UBound(GetFoxFile.aFilesEndPos))
= GetFoxFile.aFileListStartPos - 1
' 以下程式碼用於取每個檔案的實際長度
For m = 0 To UBound(GetFoxFile.aFilesEndPos)
GetFoxFile.aFilesSize(m) = GetFoxFile.aFilesEndPos(m) - GetFoxFile.aFilesStartPos(m)
Next m
' 以下程式碼用於取檔案列表的檔名,一個個地賦予檔名陣列
For m = 0 To UBound(GetFoxFile.aFilesName)
GetFoxFile.aFilesName(m) = Space(255)
Seek #1, GetFoxFile.aFileListStartPos + 1 + GetFoxFile.aFileNamePos(m)
Get #1, GetFoxFile.aFileListStartPos + 1 + GetFoxFile.aFileNamePos(m),
GetFoxFile.aFilesName(m)
Next m
Close #1 '// 關閉我們開啟的檔案
GetFoxFile.aMainFileName = GetFoxFile.aFilesName(GetFoxFile.aMainFileInFileList)
Exit Function
MetErrors:
MsgBox "發現錯誤!", vbInformation + vbSystemModal, "資訊提示"
Close
#1
Exit Function
End Function
' -----------------------------------------------------------------------------
' - 將VFP的EXE檔案轉化為APP檔案,APP檔案的實際長度=EXE檔案最後4個位元組表示的長度
' - VFP的EXE = PE頭
+ APP檔案
' -----------------------------------------------------------------------------
Public Sub Exe2App(sFile As String, dFile As String)
Dim ExeSize
As Long '// EXE檔案的長度
Dim AppSize As Long
'// APP檔案的長度
Dim dData() As Byte
'// 用於儲存APP檔案資料的陣列
ExeSize = FileLen(sFile)
'// 取EXE檔案的長度
Open sFile For Binary As #2
Seek #2, ExeSize - 3
Get #2, ExeSize - 3, AppSize '// 取得APP檔案的實際長度
ReDim dData(0 To AppSize - 1) As Byte '// 重新定義陣列大小
Seek #2, ExeSize - AppSize + 1 '// APP檔案的開始位置
Get #2, , dData()
Close #2
Open dFile
For Binary As #3
Put #3, , dData()
'// 將資料寫入APP檔案
Close #3
End Sub
'------------------------------------------------------------------------
'- aBuffer 是所取得的FOX結構型別,ID是編號,dPath 是要分離到的目錄
'- 演算法設計:定義一個陣列,大小=從當前編號的檔案的大小,從當前編號的檔案
'- 開始的地方讀取大小相當的資料,賦予陣列
'------------------------------------------------------------------------
Public Sub SplitFile(aBuffer As VfpStructure, ID As Long, dPath As String)
Dim tData() As Byte
ReDim tData(0 To aBuffer.aFilesSize(ID) - 1) As
Byte
Open aBuffer.aAppFileName For Binary As #4
Seek #4, aBuffer.aFilesStartPos(ID)
+ 1
Get #4, aBuffer.aFilesStartPos(ID) + 1, tData()
Close #4
Open dPath & aBuffer.aFilesName(ID) For Binary As #5
Put #5, , tData()
Close #5
End Sub
'------------------------------------------------------------------------
'- 分離所有的檔案。演算法設計:因為前面已經設計好當個檔案分離的演算法,所以
'- 只需要將所有的檔案一個個分離就可以了。aBuffer
是所取得的FOX結構型別,
'- dPath 是要分離到的目錄,注意格式帶 "\" 如 "C:\"、"C:\FOXPRO\"
'------------------------------------------------------------------------
Public Sub SplitFileAll(aBuffer As VfpStructure, dPath As String)
Dim
k As Long
For k = 0 To aBuffer.aFileNumbers - 1
SplitFile
aBuffer, k, dPath
Next k
End Sub
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' 函式 StrLen 功用: 取字串的實際長度,相當與 Len,但
' Len不支援中文(雙位元組) 這個能較好地支援。
'
Len("-丫頭") = 3 ; StrLen("-丫頭") = 5
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Public Function Strlen(ByVal tStr As String) As Integer
Strlen = LenB(StrConv(tStr,
vbFromUnicode))
End Function
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' 函式 StrRight 功用: 從字串的右邊起取若干個字元,相當與 Right,但
' Right不支援中文(雙位元組) 這個能較好地支援。
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Public Function StrRight(ByVal Str5 As String, ByVal Len5 As Long) As String
Dim Tmpstr As String
Tmpstr = StrConv(Str5, vbFromUnicode)
Tmpstr =
RightB(Tmpstr, Len5)
StrRight = StrConv(Tmpstr, vbUnicode)
End Function
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' 函式 StrLeft 功用: 從字串的左邊起取若干個字元,相當與 Left,但
' Left不支援中文(雙位元組) 這個能較好地支援。
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Public Function StrLeft(ByVal Str5 As String, ByVal Len5 As Long) As String
Dim Tmpstr As String
Tmpstr = StrConv(Str5, vbFromUnicode)
Tmpstr =
LeftB(Tmpstr, Len5)
StrLeft = StrConv(Tmpstr, vbUnicode)
End Function
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' 函式 mUcase 功用: 將第一個字母轉為大寫,其他的轉為小寫。
' 使用 mUcase(字串),返回字串
' 例子
mUcase("foxpro"),返回 Foxpro
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Public Function mUcase(aString As String) As String
If Left(aString,
1) = StrLeft(aString, 1) Then
mUcase = UCase(Left(aString,
1)) & LCase(StrRight(aString, Strlen(aString) - 1))
Else
mUcase = LCase(aString)
End If
End Function
相關文章
- 幽默:朋友發給我一段程式碼2022-12-04
- 英語會話精靈 2.0 --謹以此文獻給初學破解的愛好者
(7千字)2015-11-15會話
- VFP的簡單加密,可能很多朋友都已經掌握了。此文僅針對初學者。 (6千字)2002-09-20加密
- tkprof命令列工具用法小結,獻給初學者朋友2010-06-20命令列
- 程式設計師女朋友如何給程式設計師男朋友過生日?2013-05-29程式設計師
- 自學程式設計的朋友,我想給你們這 5 個建議2019-05-20程式設計
- 寫給正在找工作的朋友2009-01-10
- 微信分享 分享朋友圈 分享騰訊微博 發給朋友2014-07-12
- 程式設計師朋友們,請答應我?別再去東南亞寫程式碼了好麼?2019-07-17程式設計師
- 寫給新入行的程式設計師小朋友2021-10-03程式設計師
- 微信分享網頁連結至朋友、朋友圈、微博程式碼2017-04-03網頁
- 朋友融資了,給我看了一眼他們價值1個億的Go AI 程式碼2018-12-13GoAI
- 我用開源工具給女朋友寫道歉信!2021-02-23開源工具
- 再見JQuery,我的老朋友2018-07-27jQuery
- 我的機器人朋友們2024-04-21機器人
- 給喜歡的女孩子寫了一段python程式碼,不用我表白,就成我女朋友了2019-01-04Python
- 給女朋友講ActiveMQ是啥?2019-08-20MQ
- 獻給所有的黑客新手2013-11-22黑客
- 男朋友和男的朋友的區別2006-11-03
- 分享給愛看電影的朋友們一款應用,磁力網盤app~~2020-10-08APP
- 本人作品---夢龍智慧專案管理99A解狗教程(獻給對加密狗有興趣的朋友)
(13千字)2015-11-15專案管理加密
- “我”是如何把一臺舊iPhone 6翻新賣給一個朋友的2015-09-07iPhone
- 寫給想入門的朋友,侃侃自己的破解心得。2015-11-15
- Laraver 新增 Swagger 支援 純操作過程,獻給一頭霧水 + 四處碰壁的朋友2019-11-28Swagger
- 程式設計師用寫程式碼的方式找女朋友2014-06-17程式設計師
- 如何給 swoft 貢獻程式碼2019-10-15
- 寫給想學網頁設計的朋友們2010-12-20網頁
- 最簡短的話,寫給身邊的程式設計師朋友吧2020-06-03程式設計師
- 我的一次作業,希望對學習彙編的朋友有用。
(9千字)2015-11-15
- 程式設計師怎樣才能達到程式設計的最高境界?(送給喜歡寫程式碼的朋友)2010-09-20程式設計師
- 如何讓您的VFP程式更安全?對VFP程式設計師的一點忠告。 (1千字)2001-11-21程式設計師
- HarmonyOS 的分散式技術,讓小朋友愛上塗鴉2021-05-20分散式
- 太熱了!程式猿給女朋友做了個智慧小風扇2015-08-16
- 給女朋友講解什麼是代理模式2018-12-28模式
- 如何破解深思Ⅲ加密狗!想解狗的朋友過來看了!
(10千字)2015-11-15加密
- pyhton好學麼,適合哪些朋友學習?2020-10-09
- 這樣寫程式碼,真是帥到沒有朋友2021-03-14
- 女朋友突然問我DNS是個啥....2020-12-14DNS