DBF文件具有不可读的字段。它们是加密的,编码很奇怪还是别的什么?

时间:2018-03-16 20:34:24

标签: database encryption encoding visual-foxpro dbf

我有一个程序,每月将更新的数据库安装到我们使用的特殊软件中。我得到一个.exe,运行它,.exe“安装”一堆DBF / CDX文件到一个文件夹,然后以某种方式将数据库信息“挂钩”到我们的软件中。

以下是每月“安装”输出文件夹的样子:

Here is what the output folder looks like every month:

我打开了DBF,我最感兴趣的是从(parts.dbf)提取信息(我相信至少有4个不同的软件)并浏览数据。大多数领域看起来很好,可读,一切都很好。但是,我需要的2个字段(价格和部件号)是不可读的。在“部件”列中,所有字段显示10或12个字符,后跟一堆9个(示例:< \ MFMIFJHMFll999999999999999999,KI9e ^ Z] pbk ^ 999999999999999999,JIFIPKMFL999999999999999999999)。在Price栏中它的相似,只是没有多少个字符(例如:LJKLGIQ999,IGII999999,JMQJGLL999)。

以下是我所看到的截图:

Here is a screenshot of what I'm seeing exactly:

我谷歌搜索了我所知道的一切。我已经下载了不同的程序,尝试将数据拉入Crystal Reports,试图以不同的方式对其进行编码(不确定我是否做到了这一点),试图弄清楚如何解密它(这段旅程是短暂的,因为它是所以在我的头上),一般都是把头发拉过来好几个星期。我不知道该怎么办,因为我甚至不知道从哪里开始。我只是在黑暗中刺伤。

THINK 这个文件是在某些版本的FoxPro中创建的,但我可能错了。当我在我们的软件中查看信息时,它们都显示正常。零件编号和价格看起来像可读的人物角色。

我们软件中的数据示例:

Example of data in our software:

我没有想法。我需要知道我在做什么,所以我可以努力弄清楚如何“修复它”。这是一个FoxPro文件吗?它是以我需要改变的方式编码的吗?它是否在这两个字段中加密了数据?我对所有事情都不感兴趣吗?

理想情况下,我很乐意将这些数据导入Crystal Reports并使用数据进行报告。甚至Excel也可能正常工作。尽管如此,我不能用一堆奇怪的字符和9来做很多报道。

对此的任何帮助将不胜感激。

Schema的屏幕截图,每个评论部分:

enter image description here

2 个答案:

答案 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作为计算机上的语言以满足其他需求:)

  • 从Google下载Go language并进行安装。它的安装程序使用简单,只需几秒钟即可完成。
  • 打开命令提示符。类型:

    转到版本[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的软件顾问来完成工作 - 之后您可以做任何您想做的事情。请记住,如果某些事情业务关键,则值得花费$$$$

祝你好运