首页
社区
课程
招聘
[原创]灵格斯词典格式逆向
发表于: 2016-4-12 08:44 7127

[原创]灵格斯词典格式逆向

2016-4-12 08:44
7127




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>


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 3
支持
分享
最新回复 (1)
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
我十分十分十分好奇你这个是怎么弄出来的?这些结构体,以及其中的字段所代表的意义,怎么弄清楚的,我感觉好不可思议。
2017-8-31 01:17
0
游客
登录 | 注册 方可回帖
返回
//