查看: 2539|回复: 24
打印 上一主题 下一主题

[讨论] OALD9 从PC光盘版提取的简单尝试

[复制链接]
  • TA的每日心情
    开心
    2018-8-6 15:15
  • 签到天数: 10 天

    [LV.3]偶尔看看II

    2

    主题

    39

    回帖

    1347

    积分

    解元

    Rank: 5Rank: 5

    积分
    1347
    跳转到指定楼层
    1
    发表于 2019-4-1 00:31:03 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 wadu 于 2019-4-1 07:52 编辑

    OALD这个词典真是很好用,我一直想找个能在欧路里面用的电子版,目前在手机上用的是第八版。

    我看过 zhuode 兄发的此贴

    COD9完美mdx化的一些个人探索、启发与实践
    https://www.pdawiki.com/forum/forum.php?mod=viewthread&tid=32390


    基本是靠软件本身提供的打印功能输出 PDF,需要进一步处理。

    我这个周末试着去从第九版的光盘软件里提取词典内容。
    软件似乎有保护,需要用 Alcohol 120% 加载光盘镜像,但加载好后其实不需要安装软件,直接找到光盘里面的OALD9.exe 运行就可以了。
    打开后软件界面是这样的:



    确实也是可以复制词条和打印,但我想试着换一个思路。

    • 运行 Cheat Engine
    • 菜单 File -> Open Process (或者直接按左上角的按钮“Select a process to open”),打开 OALD9.exe 的进程
    • 先把 Value Type 改为 String,再在 Text 编辑框内输入词条内显示的文本,比如 the first letter of the English alphabet,按上方的 First Scan 按钮
    • 出现几条结果,随便看几条的内容。比如选择第一条,在上面按右键,在菜单上选 Browse this memory region




    HTML 的部分内容截取如下:

    <lg:block num="0" lgstyle="" lgblock="yes"><link rel='stylesheet' type='text/css' href='main_css'></link><entry><h-g eid="a_hg_1"><top-g eid="a_topg_1"><x/><h eid="a_h_1">A </h><pos-g eid="a_posg_2"><pos eid="a_pos_1" pos="n" lang="4">noun</pos></pos-g> <pron-gs block="y" eid="a_prongs_1" careful="y" wd="a" source="ald8" psg="ald8_a_prongs_1" resource="phonetics" href="a_prongs_1"><pron-g eid="a_prong_1" geo="br" trans="ald8"><blue>BrE</blue> <phon eid="a_phon_1">/e\u026A/</phon><aref><lg:sound sound_auto="0"><lg:sound_file>wbx://oup_en-dic/a#_gb_1</lg:sound_file></lg:sound> <img href="ldic:///action?action=SoundPlay&soundURL=wbx://oup_en-dic/a#_gb_1" src="skin:///uk_spkr" transparent="true" valign="bottom"></img></aref></pron-g>; <pron-g eid="a_prong_2" geo="n_am" trans="ald8"><red>NAmE</red> <phon eid="a_phon_2">/e\u026A/</phon><aref><lg:sound sound_auto="1"><lg:sound_file>wbx://oup_en-dic/a#_us_1</lg:sound_file></lg:sound> <img href="ldic:///action?action=SoundPlay&soundURL=wbx://oup_en-dic/a#_us_1" src="skin:///us_spkr" transparent="true" valign="bottom"></img></aref></pron-g></pron-gs> <v-gs eid="a_vgs_1" type="vs">(also <v-g eid="a_vg_1"><v eid="a_v_1">a</v></v-g>)</v-gs> <if-gs eid="a_ifgs_1">(<if-g eid="a_ifg_1" form="pl">plural <if eid="a_if_1">As</if></if-g>, <if-g eid="a_ifg_2"><if eid="a_if_2">A\sis</if></if-g>, <if-g eid="a_ifg_3"><if eid="a_if_3">a\sis</if> <pron-gs eid="a_prongs_2" careful="y" wd="a's" source="ald8" psg="ald8_a_prongs_2" resource="phonetics" href="a_prongs_2"><pron-g eid="a_prong_3" geo="br" trans="ald8"><blue>BrE</blue> <phon eid="a_phon_3">/e\u026Az/</phon><aref><lg:sound sound_auto="0"><lg:sound_file>wbx://oup_en-dic/a_s#1_gb_1</lg:sound_file></lg:sound> <img href="ldic:///action?action=SoundPlay&soundURL=wbx://oup_en-dic/a_s#1_gb_1" src="skin:///uk_spkr" transparent="true" valign="bottom"></img></aref></pron-g>; <pron-g eid="a_prong_4" geo="n_am" trans="ald8"><red>NAmE</red> <phon eid="a_phon_4">/e\u026Az/</phon><aref><lg:sound sound_auto="1"><lg:sound_file>wbx://oup_en-dic/a_s#1_us_1</lg:sound_file></lg:sound> <img href="ldic:///action?action=SoundPlay&soundURL=wbx://oup_en-dic/a_s#1_us_1" src="skin:///us_spkr" transparent="true" valign="bottom"></img></aref></pron-g></pron-gs></if-g>)</if-gs><pracpron> <pron-gs eid="pp_a_prongs_1" careful="y" wd="a" source="ald8" psg="ald8_a_prongs_1" resource="phonetics" href="a_prongs_1"><wd>A</wd><pron-g eid="pp_a_prong_1" geo="br" trans="ald8"><blue>BrE</blue> <phon eid="pp_a_phon_1">/e\u026A/</phon><aref><lg:sound sound_auto="0"><lg:sound_file>wbx://oup_en-dic/a#_gb_1</lg:sound_file></lg:sound> <img href="ldic:///action?action=SoundPlay&soundURL=wbx://oup_en-dic/a#_gb_1" src="skin:///uk_spkr" transparent="true" valign="bottom"></img></aref></pron-g>; <pron-g eid="pp_a_prong_2" geo="n_am" trans="ald8"><red>NAmE</red> <phon eid="pp_a_phon_2">/e\u026A/</phon><aref><lg:sound sound_auto="1"><lg:sound_file>wbx://oup_en-dic/a#_us_1</lg:sound_file></lg:sound> <img href="ldic:///action?action=SoundPlay&soundURL=wbx://oup_en-dic/a#_us_1" src="skin:///us_spkr" transparent="true" valign="bottom"></img></aref></pron-g></pron-gs> <pron-gs eid="pp_a_prongs_2" careful="y" wd="a's" source="ald8" psg="ald8_a_prongs_2" resource="phonetics" href="a_prongs_2"><wd>a\sis</wd><pron-g eid="pp_a_prong_3" geo="br" trans="ald8"><blue>BrE</blue> <phon eid="pp_a_phon_3">/e\u026Az/</phon><aref><lg:sound sound_auto="0"><lg:sound_file>wbx://oup_en-dic/a_s#1_gb_1</lg:sound_file></lg:sound> <img href="ldic:///action?action=SoundPlay&soundURL=wbx://oup_en-dic/a_s#1_gb_1" src="skin:///uk_spkr" transparent="true" valign="bottom"></img></aref></pron-g>; <pron-g eid="pp_a_prong_4" geo="n_am" trans="ald8"><red>NAmE</red> <phon eid="pp_a_phon_4">/e\u026Az/</phon><aref><lg:sound sound_auto="1"><lg:sound_file>wbx://oup_en-dic/a_s#1_us_1</lg:sound_file></lg:sound> <img href="ldic:///action?action=SoundPlay&soundURL=wbx://oup_en-dic/a_s#1_us_1" src="skin:///us_spkr" transparent="true" valign="bottom"></img></aref></pron-g></pron-gs></pracpron></top-g><sn-gs eid="a_sngs_1"><sn-g eid="a_sng_1">1<cset eid="a_cset_1" cset="letters"></cset> <gram-g eid="a_gramg_1">[<gram eid="a_gram_1" gram="c">countable</gram>, <gram eid="a_gram_2" gram="u">uncountable</gram>]</gram-g> <def eid="a_def_1" display="inline">the first letter of the English alphabet</def><x-gs eid="a_xgs_1"><x-g eid="a_xg_1"><img src="skin:///xseps"></img> <x eid="a_x_1">\shApple\si begins with (an) A/\shA\si.</x></x-g></x-gs></sn-g><sn-g eid="a_sng_2">2<cset eid="a_cset_2" cset="musnotes"></cset> <v-gs eid="a_vgs_2" type="alt"><v-g eid="a_vg_2"><v eid="a_v_2">A</v></v-g></v-gs> <gram-g eid="a_gramg_2">[<gram eid="a_gram_3" gram="c">countable</gram>, <gram eid="a_gram_4" gram="u">uncountable</gram>]</gram-g> <label-g eid="a_labelg_1">(<subj eid="a_subj_1


    直接保存为 HTML 文件 A.txt (76.86 KB, 下载次数: 2) ,显示当然是不正确的,但至少内容是完整的,也许可以根据这部分内容的格式做进一步的处理(比如去掉无用的tag),也不知道这个办法是否可行。



    评分

    4

    查看全部评分

    本帖被以下淘专辑推荐:

  • TA的每日心情
    擦汗
    2021-2-23 22:06
  • 签到天数: 114 天

    [LV.6]常住居民II

    2

    主题

    228

    回帖

    5707

    积分

    会元

    Rank: 7Rank: 7Rank: 7

    积分
    5707
    推荐
    发表于 2019-4-1 08:59:15 | 只看该作者
    这个词典确实好用
  • TA的每日心情
    奋斗
    2022-6-1 19:02
  • 签到天数: 377 天

    [LV.9]以坛为家II

    27

    主题

    556

    回帖

    15万

    积分

    状元

    喜欢折腾,但能力有限

    Rank: 9Rank: 9Rank: 9

    积分
    150901

    灌水大神章笑傲江湖章管理组专用章

    2
    发表于 2019-4-1 01:04:28 | 只看该作者
    你这个办法如果能拿到格式设置的部分,并且能自动化操作起来的话, 应该比那个办法还要好,可以完全重现原样式且不用再校对内容了,只要把相关tag转换一下,样式改写成css。
  • TA的每日心情
    无聊
    2019-2-25 21:49
  • 签到天数: 218 天

    [LV.7]常住居民III

    40

    主题

    328

    回帖

    1万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    12598

    灌水大神章笑傲江湖章

    3
    发表于 2019-4-1 03:00:24 | 只看该作者
    可以麻烦写一篇稍微详细一点的介绍吗

    该用户从未签到

    37

    主题

    861

    回帖

    1万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    18406
    4
    发表于 2019-4-1 06:41:54 | 只看该作者
    这个方法牛逼,可以内存转储成txt,不过它的内容都是一条一条,或多条读取,但绝不是一下读取的,这个就有点麻烦了。不过提供了很好的思路。有机会我试试。

    该用户从未签到

    37

    主题

    861

    回帖

    1万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    18406
    5
    发表于 2019-4-1 06:44:26 | 只看该作者
    当然靠打印成pdf也可以,可以用自动化小软件都打印出来,然后把pdf转换成html
  • TA的每日心情
    慵懒
    2 小时前
  • 签到天数: 1593 天

    [LV.Master]伴坛终老

    2

    主题

    1733

    回帖

    16万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    168862
    6
    发表于 2019-4-1 08:23:36 | 只看该作者
    不错,值得借鉴,相信还有进一步挖掘的空间
  • TA的每日心情
    擦汗
    2023-2-23 07:42
  • 签到天数: 462 天

    [LV.9]以坛为家II

    2

    主题

    1153

    回帖

    1万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    18133

    灌水大神章QQ 章

    7
    发表于 2019-4-1 08:35:04 | 只看该作者
    这个应该比直接打印pdf再转html更准确一些

    该用户从未签到

    37

    主题

    861

    回帖

    1万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    18406
    8
    发表于 2019-4-1 08:45:20 | 只看该作者
    shadowfiend 发表于 2019-4-1 08:35
    这个应该比直接打印pdf再转html更准确一些

    字典文件的装载不是一下读进内存的,只是读取用到的此掉,所以无法一下转储。楼主可以测试一下,看看内存中有没有未激活词条的内容。
  • TA的每日心情
    开心
    2018-8-6 15:15
  • 签到天数: 10 天

    [LV.3]偶尔看看II

    2

    主题

    39

    回帖

    1347

    积分

    解元

    Rank: 5Rank: 5

    积分
    1347
    10
     楼主| 发表于 2019-4-1 09:57:32 | 只看该作者
    本帖最后由 wadu 于 2019-4-1 10:31 编辑
    drongh 发表于 2019-4-1 08:45
    字典文件的装载不是一下读进内存的,只是读取用到的此掉,所以无法一下转储。楼主可以测试一下,看看内存 ...

    是这样的没错,每次只会加载十几个词的样子,而且内存占用随着查看的词的数量的增加而增加,比如按住滚动条一直向下滚动,软件不断加载,内存使用也持续增加,即使中途停下来内存也没有被释放,继续滚动到一定程度软件会直接崩溃。

    如果有高手应该可以直接反汇编或者跟一下软件读取 wbx 后缀文件的代码,然后写一个直接读光盘文件提取内容的工具。可惜小弟水平不够,也许只能通过 Cheat Engine 注入代码把软件加载的 HTML 文本写入文件了。

    第一步:在 Cheat Engine 的 memory view 区域随便选一个字符(比如 English 的 E 字符)右键添加内存写入断点(Data breakpoint->Break on write,被写入时中断的意思),运气好的话软件可能会在跳转到新的词的时候更新这个区域。


    第二步:在软件查词界面滚动鼠标,软件果然写入在同一个内存,在 Cheat Engine 右下角的堆栈上双击最顶端的地址,去看看有没有线索


    这时候可以把之前的内存写入断点删除了,在字母 E 上右键选择 Delete breakpoint

    在下面这个 call OALD9.exe+274B0 的位置右键选 Toggle breakpoint 设置断点,继续运行软件,再次回到查词界面滚动,之后会发现执行到这里的时候寄存器 EAX 其实就是文本在内存的首地址。




    每次在 call 指令上停下来的时候,在右侧的 registers 区域找到 EAX 寄存器,在上面右键,选择 Show in hexview



    然后按 F8 单步执行(或者主菜单 Debug->Step over),停到了下一行代码上,观察下方的内存区域,发现内容果然更新了。

    第三步:接下来应该可以在这里注入代码,自动把 eax 指向的内存转储到一个比如 output.html。
    这一步比较复杂,需要使用 Auto Assembler
  • TA的每日心情
    开心
    2018-8-6 15:15
  • 签到天数: 10 天

    [LV.3]偶尔看看II

    2

    主题

    39

    回帖

    1347

    积分

    解元

    Rank: 5Rank: 5

    积分
    1347
    11
     楼主| 发表于 2019-4-1 10:21:39 | 只看该作者
    Helios-X 发表于 2019-4-1 03:00
    可以麻烦写一篇稍微详细一点的介绍吗

    已经更新了,其实步骤很简单的
  • TA的每日心情
    奋斗
    2021-3-15 08:06
  • 签到天数: 585 天

    [LV.9]以坛为家II

    5

    主题

    967

    回帖

    6428

    积分

    禁止发言

    积分
    6428
    12
    发表于 2019-4-1 10:29:05 | 只看该作者
    这个思路确实巧妙。

    该用户从未签到

    42

    主题

    1737

    回帖

    2万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    20641

    灌水大神章小蜜蜂章笑傲江湖章

    13
    发表于 2019-4-1 11:52:08 | 只看该作者
    厉害。这个方法能能否把 Oxford Learner's Dictionary of Academic English 的数据搞出来?

    该用户从未签到

    37

    主题

    861

    回帖

    1万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    18406
    14
    发表于 2019-4-1 12:39:10 | 只看该作者
    wadu 发表于 2019-4-1 09:57
    是这样的没错,每次只会加载十几个词的样子,而且内存占用随着查看的词的数量的增加而增加,比如按住滚动 ...

    楼主可以用 ida pro 反汇编,把读取的代码提取出来,用这个代码读取数据。
  • TA的每日心情
    开心
    2018-8-6 15:15
  • 签到天数: 10 天

    [LV.3]偶尔看看II

    2

    主题

    39

    回帖

    1347

    积分

    解元

    Rank: 5Rank: 5

    积分
    1347
    15
     楼主| 发表于 2019-4-1 13:14:27 | 只看该作者
    belleyeah 发表于 2019-4-1 11:52
    厉害。这个方法能能否把 Oxford Learner's Dictionary of Academic English 的数据搞出来? ...

    我手头没这个词典,我已经尽量把过程完整详细地写出来了,可以说图文并茂,或许你可以自己尝试一下
  • TA的每日心情

    2019-5-4 11:17
  • 签到天数: 36 天

    [LV.5]常住居民I

    0

    主题

    184

    回帖

    1387

    积分

    禁止发言

    积分
    1387
    QQ
    16
    发表于 2019-4-1 16:17:38 | 只看该作者
    牛津高阶双解已经出了第九版了,为什么还是没有人出面制作呢

    该用户从未签到

    95

    主题

    554

    回帖

    2万

    积分

    翰林院编修

    终身学习者

    Rank: 11Rank: 11Rank: 11Rank: 11

    积分
    24557

    翰林院专用章灌水大神章笑傲江湖章小蜜蜂章管理组专用章

    17
    发表于 2019-4-1 17:32:09 | 只看该作者
    应该使用  DLL 注入技术。
  • TA的每日心情
    擦汗
    前天 16:06
  • 签到天数: 885 天

    [LV.10]以坛为家III

    7

    主题

    2845

    回帖

    2万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    24806
    18
    发表于 2019-4-1 20:17:13 | 只看该作者
    看技术牛人在这里谈论,真是羡慕。
  • TA的每日心情
    开心
    2018-8-6 15:15
  • 签到天数: 10 天

    [LV.3]偶尔看看II

    2

    主题

    39

    回帖

    1347

    积分

    解元

    Rank: 5Rank: 5

    积分
    1347
    19
     楼主| 发表于 2019-4-2 00:35:41 | 只看该作者
    本帖最后由 wadu 于 2019-4-2 00:46 编辑
    henices 发表于 2019-4-1 17:32
    应该使用  DLL 注入技术。

    感觉如果只是为了把 HTML 提取到文件的话直接用 Cheat Engine 打补丁就好了,只是这个词典不释放内存,不知道是否有意的,滚动多了就崩溃退出了。

    我自己在 Cheat Engine 用它的 Auto Assemble 工具直接用下面的代码就可以提取内容了,接下来用 AutoHotkey 模拟滚动就行了。只是程序会崩溃真是比较麻烦(再次强调是程序自己原本在没有任何修改时不断滚动就会崩溃),需要自己过一段时间检查看看程序是不是挂掉了,然后手动重新运行程序,还要手动查看最后一个提取文件中最后一个词条的单词,回到软件上搜索到该词条,重新开 Cheat Engine 打开进程,继续重复步骤。

    这个附件 txt 重命名为 .CT 文件然后在 Cheat Engine 里点左上角的第二个文件夹按钮 Open a cheat table 打开这个 .CT 文件,然后在下方把列表的第一个 Auto Assemble script 前面的框打勾就可以使用 script 自动把 HTML 的内容保存到 C:\OALD9_Out\ 文件夹下了。




    OALD9.CT.removethis.txt (5.38 KB, 下载次数: 4)

    define(FILE_APPEND_DATA,4)
    define(OPEN_ALWAYS,4)
    define(FILE_ATTRIBUTE_NORMAL,0x00000080)
    define(FILE_END,2)

    globalalloc(html_str, 4)
    globalalloc(html_len, 4)
    globalalloc(html_cnt, 4)
    globalalloc(file_bytes, 4)
    globalalloc(html_filedir, 255)
    globalalloc(html_filepath, 255)
    globalalloc(html_pathnumaddr, 4)
    globalalloc(html_pathnumformat, 20)

    html_str:
    dd 0

    html_len:
    dd 0

    html_cnt:
    dd 0

    html_filedir:
    db 'C:\OALD9_Out\'

    html_filepath:
    db 0

    html_pathnumaddr:
    dd 0

    html_pathnumformat:
    db '%06d.html', 0

    /*
    // lua is slow, so this is not used for now
    {$lua}
    function myfunction(straddr)
      --showMessage('html: '..straddr)
      len = readInteger('html_len')
      --showMessage('len: '..len)
      --str = readString(straddr, len)
      --showMessage('str: '..str)
      --showMessage('len of str is: '..string.len(str))
      cnt = readInteger('html_cnt')
      cnt = cnt + 1
      writeInteger('html_cnt', cnt)
      filePath = string.format("C:\\OALD\\%d.html", cnt)
      writeRegionToFile(filePath, straddr, len)
    end
    {$asm}

    loadlibrary(luaclient-i386.dll)
    luacall(openLuaServer('CELUASERVER'))

    CELUA_ServerName:
    db 'CELUASERVER',0

    alloc(str_myfunction,32)
    alloc(functionid,4)

    str_myfunction:
    db 'return myfunction(parameter)',0
    */

    [ENABLE]
    //code from here to '[DISABLE]' will be used to enable the cheat
    alloc(newmem,2048)
    alloc(hFile,4)
    label(IncNumFileCheck)
    label(IncNumWriteFile)
    label(DoWriteFile)
    label(Cleanup)
    label(returnhere)
    label(originalcode)
    label(exit)

    newmem: //this is allocated memory, you have read,write,execute access
    //place your code here
    mov [html_str],esp
    push edx
    push ecx
    push eax

    mov edx, [html_str]
    sub edx, 28
    mov edx, [edx]
    mov [html_str],edx
    push [html_str]
    call kernel32.lstrlenA // stdcall, no cleanup
    mov [html_len], eax

    // check if this is the first time
    cmp [html_cnt], 0
    jne IncNumWriteFile

    push html_filedir
    push html_filepath
    call kernel32.lstrcpyA

    push 0
    push html_filepath
    call kernel32.CreateDirectoryA

    push html_filepath
    call kernel32.lstrlenA

    lea edx,[html_filepath]
    add edx,eax
    mov [html_pathnumaddr], edx

    // find the next available number
    mov [html_cnt], 1

    IncNumFileCheck:
    push [html_cnt]
    push html_pathnumformat
    push [html_pathnumaddr]
    call user32.wsprintfA

    push html_filepath
    call kernel32.GetFileAttributesA
    cmp eax, 0xFFFFFFFF
    je DoWriteFile
    mov eax, [html_cnt]
    inc eax
    mov [html_cnt], eax
    jmp IncNumFileCheck

    IncNumWriteFile:
    mov eax, [html_cnt]
    inc eax
    mov [html_cnt], eax

    push [html_cnt]
    push html_pathnumformat
    push [html_pathnumaddr]
    call user32.wsprintfA

    DoWriteFile:
    //push [html_str]
    //push str_myfunction
    //call CELUA_ExecuteFunction
    push 0
    push FILE_ATTRIBUTE_NORMAL
    push OPEN_ALWAYS
    push 0
    push 0
    push FILE_APPEND_DATA
    push html_filepath
    call kernel32.CreateFileA
    test eax, eax
    je Cleanup

    mov [hFile], eax

    push FILE_END
    push 0
    push 0
    push [hFile]
    call kernel32.SetFilePointer

    push 0
    push file_bytes
    push [html_len]
    push [html_str]
    push [hFile]
    call kernel32.WriteFile

    push [hFile]
    call kernel32.CloseHandle


    Cleanup:
    pop eax
    pop ecx
    pop edx

    originalcode:
    mov [ebp-04],eax
    push 00

    exit:
    jmp returnhere

    "OALD9.exe"+32127:
    jmp newmem
    returnhere:




    [DISABLE]
    //code from here till the end of the code will be used to disable the cheat
    dealloc(newmem)
    "OALD9.exe"+32127:
    mov [ebp-04],eax
    push 00
    //Alt: db 89 45 FC 6A 00
  • TA的每日心情
    开心
    2018-8-6 15:15
  • 签到天数: 10 天

    [LV.3]偶尔看看II

    2

    主题

    39

    回帖

    1347

    积分

    解元

    Rank: 5Rank: 5

    积分
    1347
    20
     楼主| 发表于 2019-4-2 00:48:50 | 只看该作者
    好了,既然现在证明基本可行(虽然过程有点繁琐,程序崩溃需要手动恢复进度),那么接下来的问题是:那些 HTML 到底能不能方便地转换?不知道有没有大侠愿意搞这个转换。
  • TA的每日心情
    开心
    2019-6-23 00:02
  • 签到天数: 18 天

    [LV.4]偶尔看看III

    43

    主题

    391

    回帖

    5万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    54723
    21
    发表于 2019-4-2 18:47:35 | 只看该作者
    wadu 发表于 2019-4-2 00:48
    好了,既然现在证明基本可行(虽然过程有点繁琐,程序崩溃需要手动恢复进度),那么接下来的问题是:那些 H ...

    我愿意搞这个HTML转换,我最近在做Macmillan词典,刚好有一些代码可以通用处理HTML转换的。另外楼主从哪里能下载到这个词典,我也想试试,我计算机128G的内存,根本不害怕内存溢出什么的。
  • TA的每日心情
    开心
    2018-8-6 15:15
  • 签到天数: 10 天

    [LV.3]偶尔看看II

    2

    主题

    39

    回帖

    1347

    积分

    解元

    Rank: 5Rank: 5

    积分
    1347
    22
     楼主| 发表于 2019-4-2 23:02:10 | 只看该作者
    本帖最后由 wadu 于 2019-4-2 23:04 编辑
    ogrishman 发表于 2019-4-2 18:47
    我愿意搞这个HTML转换,我最近在做Macmillan词典,刚好有一些代码可以通用处理HTML转换的。另外楼主从哪 ...

    太棒了!
    我感觉软件用的这个更像是 XML,但却又好像含有一些不符合普通 XML 语法的标签。

    下载可以试试看这里:
    https://getintopc.com/softwares/ ... tion-free-download/

    这个似乎也是:
    https://archive.org/download/OALD9


    至于内存使用则感觉很随缘,几百M就崩溃也是常见。

    该用户从未签到

    37

    主题

    861

    回帖

    1万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    18406
    23
    发表于 2019-4-3 06:44:07 | 只看该作者
    楼主你看一下这个主程序是c++还是c#写的,如果是C#写的,很容易反编译。直接提取读取函数。然后自己写个程序导出来。
  • TA的每日心情
    开心
    2018-8-6 15:15
  • 签到天数: 10 天

    [LV.3]偶尔看看II

    2

    主题

    39

    回帖

    1347

    积分

    解元

    Rank: 5Rank: 5

    积分
    1347
    24
     楼主| 发表于 2019-4-3 08:53:42 | 只看该作者
    drongh 发表于 2019-4-3 06:44
    楼主你看一下这个主程序是c++还是c#写的,如果是C#写的,很容易反编译。直接提取读取函数。然后自己写个程 ...

    用了 msvcp_win.dll (MS C Runtime),明显是C++写的,程序是32bit,从看到的代码来看也没有.NET程序的特征。

    如果可以直接反推出读数据的算法可以脱离程序独立提取那当然好,可惜小弟能力有限,即使有 IDA 的帮助也还是难度很大,所以注入修改代码是目前较好的办法了。

    该用户从未签到

    95

    主题

    554

    回帖

    2万

    积分

    翰林院编修

    终身学习者

    Rank: 11Rank: 11Rank: 11Rank: 11

    积分
    24557

    翰林院专用章灌水大神章笑傲江湖章小蜜蜂章管理组专用章

    25
    发表于 2019-4-10 11:08:23 | 只看该作者
    其实我倒是有个方法,楼主可以参考一下。

    1. 首先找到程序中进行单词查询的函数
    2. 注入一个 DLL
    3. 在 DLL 加载时读取一个单词列表,循环调用单词查询函数
    4. 将调用单词查询函数返回的 xml 保存

    完全是一个假想,楼主不用当真。