我有一个程序,每月将更新的数据库安装到我们使用的特殊软件中。我得到一个.exe,运行它,.exe“安装”一堆DBF / CDX文件到一个文件夹,然后以某种方式将数据库信息“挂钩”到我们的软件中。
以下是每月“安装”输出文件夹的样子:
我打开了DBF,我最感兴趣的是从(parts.dbf)提取信息(我相信至少有4个不同的软件)并浏览数据。大多数领域看起来很好,可读,一切都很好。但是,我需要的2个字段(价格和部件号)是不可读的。在“部件”列中,所有字段显示10或12个字符,后跟一堆9个(示例:< \ MFMIFJHMFll999999999999999999,KI9e ^ Z] pbk ^ 999999999999999999,JIFIPKMFL999999999999999999999)。在Price栏中它的相似,只是没有多少个字符(例如:LJKLGIQ999,IGII999999,JMQJGLL999)。
以下是我所看到的截图:
我谷歌搜索了我所知道的一切。我已经下载了不同的程序,尝试将数据拉入Crystal Reports,试图以不同的方式对其进行编码(不确定我是否做到了这一点),试图弄清楚如何解密它(这段旅程是短暂的,因为它是所以在我的头上),一般都是把头发拉过来好几个星期。我不知道该怎么办,因为我甚至不知道从哪里开始。我只是在黑暗中刺伤。
我 THINK 这个文件是在某些版本的FoxPro中创建的,但我可能错了。当我在我们的软件中查看信息时,它们都显示正常。零件编号和价格看起来像可读的人物角色。
我们软件中的数据示例:
我没有想法。我需要知道我在做什么,所以我可以努力弄清楚如何“修复它”。这是一个FoxPro文件吗?它是以我需要改变的方式编码的吗?它是否在这两个字段中加密了数据?我对所有事情都不感兴趣吗?
理想情况下,我很乐意将这些数据导入Crystal Reports并使用数据进行报告。甚至Excel也可能正常工作。尽管如此,我不能用一堆奇怪的字符和9来做很多报道。
对此的任何帮助将不胜感激。
Schema的屏幕截图,每个评论部分:
答案 0 :(得分:1)
是,在标题的第一个字节中是0x03,它是一个Foxbase表。正如cHao已经指出的那样,作者决定用每个字符的一些字节移位来创建那些列(我不会称之为加密,对于任何程序员来说都太容易解决 - 或者有一些模式发现的非程序员)。
现在问题是如何在不损坏原始数据的情况下利用这些数据。一个想法是复制,更改其中的数据并使用该副本。当你是程序员时,使用某种计算机语言这样做很容易,但你说你不是。接下来是问题,您可以在计算机上轻松获取和编译哪种语言代码。
嗯我想把它当作自己的技能测试并想出一些C#代码。在任何Windows机器上编写和编译都非常容易(所以我想,自从多年前我就这么做了)。我错了,我不知道为什么也没有调查的意愿,但是使用命令行编译器创建的可执行文件(任何窗口都已经存在)被我的防病毒软件阻止了!我签了它但没有改变。我很快就放弃了。
幸运的是,我认为还有另一种选择。去< g>使用Go编写和编译 - 来自Google的精彩语言。如果你想最多花10-15分钟,我会给你代码以及如何将它编译成你计算机上的exe。首先是代码本身:
package main
import (
"fmt"
"log"
"path/filepath"
"strings"
"os"
"io"
"time"
"github.com/jmoiron/sqlx"
_ "github.com/mattn/go-adodb"
)
func main() {
if len(os.Args) != 2 {
log.Fatal("You need to supply an input filename.")
}
source := os.Args[1]
if _, err := os.Stat(source); os.IsNotExist(err) {
log.Fatal(fmt.Sprintf("File [%s] doesn't exist.", source))
}
log.Println(fmt.Sprintf("Converting [%s]...", source))
saveAs := GetSaveAsName(source)
log.Println(fmt.Sprintf("Started conversion on copy [%s]", saveAs))
ConvertData(saveAs)
log.Println("Conversion complete.")
}
func ConvertData(filename string) {
srcBytes := make([]byte, 127-32-1)
dstBytes := make([]byte, 127-32-1)
for i := 32; i < 34;i++ {
srcBytes[i-32]=byte(i+25)
dstBytes[i-32]=byte(i)
}
for i := 35; i < 127; i++ {
srcBytes[i-33] = byte(i+25)
dstBytes[i-33] = byte(i)
}
src := string(srcBytes) + string(byte('"')+25)
dst := string(dstBytes)
dbPath, dbName := filepath.Split(filename)
db, err := sqlx.Open("adodb", `Provider=VFPOLEDB;Data Source=` + dbPath)
e(err)
defer db.Close()
stmt := fmt.Sprintf(`update ('%s') set
p_part_num = chrtran(p_part_num, "%s", "%s"+'"'),
p_price = chrtran(p_price, "%s", "%s"+'"')`,
dbName, src, dst, src, dst)
_, err = db.Exec(stmt)
e(err)
}
func GetSaveAsName(source string) string {
fp, err := filepath.Abs(source)
e(err)
dir, fn := filepath.Split(fp)
targetFileName := filepath.Join(dir,
fmt.Sprintf("%s_copy%d.dbf",
strings.Replace(strings.ToLower(fn), ".dbf", "", 1),
time.Now().Unix()))
e(err)
in, err := os.Open(source)
e(err)
defer in.Close()
out, err := os.Create(targetFileName)
e(err)
defer out.Close()
_, err = io.Copy(out, in)
e(err)
err = out.Close()
e(err)
return targetFileName
}
func e(err error) {
if err != nil {
log.Fatal(err)
}
}
以下是从中创建可执行文件的步骤(并将Go作为计算机上的语言以满足其他需求:)
打开命令提示符。类型:
转到版本[enter]
- 您应该看到已安装的Go版本(截至目前为1.10)。
型
Go env [enter]
并检查GOPATH,它指向go项目的基本文件夹。转到该文件夹并创建4个名为:
的文件夹bin,pkg,src和vendor
默认情况下,GOPATH在您的主文件夹下是“Go”,如下所示:
C:\用户\名为myUsername \转到
创建文件夹后,您将拥有:
c:\users\myUserName\Go
c:\users\myUserName\Go\bin
c:\users\myUserName\Go\pkg
c:\users\myUserName\Go\src
c:\users\myUserName\Go\vendor
使用任何文本编辑器(例如Notepad.exe)copy&amp;将代码粘贴并保存为“MyCustomConverter.go”到src文件夹中。
代码有2个外部库需要获取。将目录更改为您的GOPATH(至少不是必需的,但至少是我的习惯)并将这些库输入:
cd %GOPATH%
go get -v github.com/jmoiron/sqlx
go get -v github.com/mattn/go-adodb
您已准备好编译代码。
cd src
set GOARCH=386
go build MyCustomConverter.go
这将创建可用于转换的MyCustomConverter.exe。
在这种特殊情况下需要设置GOARCH = 386,因为VFP OLEDB驱动程序是32位驱动程序。
哦,我忘了告诉它,它使用VFPOLEDB驱动程序,您可以download from here并安装。
您可以使用这样的可执行文件:
MyCustomConverter.exe“c:\ My Folder \ parts.dbf”
它会创建一个名为:
的修改版本“c:\ My Folder \ parts_copyXXXXXXXXXX.dbf”
其中XXXXXXXXXXX将是一个时间戳值(因此,无论何时运行,您创建另一个副本,它都不会覆盖可能存在的副本。)
您可以将MyCustomConverter.exe文件复制到桌面并拖放,而不是每次都进入命令提示符并键入部件表的完整路径。将您的parts.dbf从Windows资源管理器中删除到该exe文件。
(对我的Go编码来说这是一个很好的练习 - 会有批评者,比如为什么我没有使用参数,但我真的有充分的理由,驱动程序和Go库支持即:)
答案 1 :(得分:0)
我认为这个文件是在某些版本的FoxPro中创建的
虽然这些DBF数据表是由Foxpro创建的,但它们是由一个可能已经或可能没有用Foxpro编写的应用程序所占据的。
是的,您不需要担心CDX文件,除非您希望通过其中一个索引组织(排序)数据,或者为了处理目的在多个数据表之间建立关系。但是,除非你使用Foxpro / Visual Foxpro本身做到这一点,否则无论如何都不会对你有用。
从您收到的评论中,看起来将将字段值写入DBF数据表的APPLICATION的开发人员可能已经加密了数据。而且似乎您可能已经找到了如何使用上述建议解密它。
我很遗憾没有程序员
如果是这种情况,那么在您引入比您想要的更多问题之前,我建议您立即停止。盲目地&#39; mucking&#39;围绕数据可能会让事情变得更糟。
如果此项目业务关键,那么您应聘请熟悉Foxpro / Visual Foxpro的软件顾问来完成工作 - 之后您可以做任何您想做的事情。请记住,如果某些事情业务关键,则值得花费$$$$
祝你好运