-
-
[原创]灵格斯词典格式逆向
-
发表于:
2016-4-12 08:44
7128
-
LD2,LDF格式分析&LD2生成方法
enum DICTTYPE
{
DICTTYPE_LOCAL = 0x1, //本地词典
DICTTYPE_ONLINE = 0x2, //网络词典
DICTTYPE_INSTANTTRANS = 0x3, //即时翻译
DICTTYPE_TEXTTRANS = 0x4, //全文翻译
};
struct LDXHEADER
{
int szMagic; //ld2:?LDF ldx:?LDX
char szCheckMD5[16]; //ld2:文件剩余部分的MD5 ldx:未使用
DWORD dwOrder; //字节顺序:"4321":BE "1234":LE
__int16 wMajorVer; //词典版本
__int16 wMinorVer;
BYTE szDictID[16]; //词典ID,但未知加密方式,
DICTTYPE type;
DWORD dwFlags; //8:网络词典 10:可为索引组 20:可为取词组 一般为B1
BYTE DictInfoHash[16]; //加/解密词典信息用
WORD wPublisherID; //通常为1
char cReserved[18]; //总为0
};
struct LDXHDR
{
#define LDX_INFO 1
#define LDX_GLS 3
#define LDX_RES 4
#define LDX_KEYFILTER 5
int prop;
int size;
}
struct LocalDictEncryptHeader
{
int dwSizeDecrypt; //解密后的大小
int dwSctLen; //每dwSceLen字节加密,通常为4000h
};
Info(词典信息):
解密后为xml数据
Gls(Global Setting?,单词和解释): 路径:dict://key.词典ID/单词
struct LocalDictGlsHeader
{
DWORD dwOffsetToEncryptInfo; //LocalDictEncryptHeader的偏移,4*index_count
DWORD dwKeyPos; //Key的位置(解密后),sizeof(GlsCellInfo)*(count+1)
DWORD dwKeySize; //Key的大小
DWORD dwDataSize; //Data的大小
DWORD cbSizeEncrypt; //sizeof(LocalDictEncryptHeader)+zlib加密后的大小
};
#pragma pack(push,1)
struct GlsCellInfo
{
int dwKeyOffset;
int dwDataOffset;
char flag; //灵格斯使用二分法查词,em(0) Em(1) 'em(2) 被视为相同
char nDstIndex;
};
#pragma pack(pop)
LocalDictGlsHeader Header;
int KeyIndex[indexcount]; //单词索引表
LocalDictEncryptHeader EncryptHeader;
Data...(zlib加密)
解密后的数据:
GlsCellInfo[count+1]
Key...(Key需要正向排序ucd.db)
Data...
Res(Resource,资源) 路径:dict://res
struct LocalDictResHeader //看LocalDictGlsHeader
{
DWORD dwKeyPos;
DWORD dwKeySize;
DWORD dwDataSize;
DWORD cbSizeEncrypt;
};
struct ResCellInfo
{
DWORD dwKeyOffset, dwDataOffset;
};
LocalDictResHeade Header;
LocalDictEncryptHeader EncryptHeader;
Data...(zlib加密)
解密后的数据:
ResCellInfo[count+1]
Key...(Key需要正向排序)
Data...
Gls:Data(简化)
<C><F><H/><I><N>解释</N></I></F></C>
<C><F><H><L>单词</L></H><I><N>解释</N></I></F></C>
拼写:M <C><F><H/><M>skwɜrm /skwɜːm</M><I><N>解释</N></I></F></C>
词性:U n.,v.
1.解释1 2.解释2<<I><N><P><Q>解释1</Q><Q>解释2</Q>...</N></I>
音频:<ð I=$align B=$title M=src>
Swf:<Ì G=width H=height I=align B=title M=src R=FlashVars>
打开文件:<Ê W=name B=title N=src>
多行文本:b
水平线:<u K=Color>
n=br
g:bold
h:Italic
i:Underline
j:StrikeOut
m:sub
Y:词条链接
<x K=Color L=Face>
显示图片:<Ë G=$width H=$height I=$align B=$title M="dict://res/i-7438-0.png>
显示图片2:<J C=src D=text>
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!