掌上百科 - PDAWIKI

 找回密码
 免费注册

QQ登录

只需一步,快速开始

查看: 3715|回复: 24

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

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

    [LV.3]偶尔看看II

    发表于 2019-4-1 00:31:03 | 显示全部楼层 |阅读模式
    本帖最后由 wadu 于 2019-4-1 07:52 编辑 / h# L0 E. [3 u$ k1 y

    $ v6 u4 Z5 w" GOALD这个词典真是很好用,我一直想找个能在欧路里面用的电子版,目前在手机上用的是第八版。
    , k( M" j- V; x4 j
    6 a9 [+ i6 G. m7 d5 e0 k我看过 zhuode 兄发的此贴 9 V- |# z8 v/ S5 n, v
    ) i- P, \* S- S$ u9 ], s' |& j. l
    COD9完美mdx化的一些个人探索、启发与实践5 B7 X- E7 _  n. m
    https://www.pdawiki.com/forum/forum.php?mod=viewthread&tid=32390
    4 D, w* C, `" \/ e2 w
    $ h5 W* d# b9 i. ?8 N/ P' D' p; ~
    . p! v% c: u2 c, x/ u- c基本是靠软件本身提供的打印功能输出 PDF,需要进一步处理。
    % r, v. G( R$ K( I! C- }& S4 z& V
    ' \; A5 R8 h4 ?, `我这个周末试着去从第九版的光盘软件里提取词典内容。5 |2 y0 A: m1 t9 E6 ~: t" `# j
    软件似乎有保护,需要用 Alcohol 120% 加载光盘镜像,但加载好后其实不需要安装软件,直接找到光盘里面的OALD9.exe 运行就可以了。7 Q# Q' b, A' F
    打开后软件界面是这样的:
    $ p4 I, @; M; ~2 P" w
    % S' P) p( ]6 o8 V2 D6 Q. r* c; T9 X; [& w! }
    6 U* p3 o: ^  s: H/ I
    确实也是可以复制词条和打印,但我想试着换一个思路。. L2 z% M' H4 R2 ]& g" d5 [

    - l1 b- ?" \7 Z/ i! n& n+ k
    • 运行 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
      ' ^# _! o; v' b/ L: H, J
    ) w* I& l" n, W% s- \  T
    ( m8 u% Y1 m0 ~5 n3 e# n& B1 K

    ! K* M6 Y* A0 P) O
    # A2 X# K# O! l+ sHTML 的部分内容截取如下:
    % Q4 H( ]8 x+ v4 Q7 t6 O9 Y- M+ W
    <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
    ; i. r8 i9 ]& |4 C- s* e1 v: E7 i; D! L4 M' A

    ! I  l& e$ |6 B( A7 j9 E! P$ S9 x直接保存为 HTML 文件 ,显示当然是不正确的,但至少内容是完整的,也许可以根据这部分内容的格式做进一步的处理(比如去掉无用的tag),也不知道这个办法是否可行。9 d, g* R: D$ y( H3 V
    9 i. _6 |( C7 |* v

    3 _. v3 n9 f# e1 z
    % t$ u+ \! `6 x( ~6 ?, @2 I

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?免费注册

    x

    评分

    4

    查看全部评分

    本帖被以下淘专辑推荐:

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

    [LV.6]常住居民II

    发表于 2019-4-1 08:59:15 | 显示全部楼层
    这个词典确实好用
  • TA的每日心情
    奋斗
    2022-6-1 19:02
  • 签到天数: 377 天

    [LV.9]以坛为家II

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

    [LV.7]常住居民III

    发表于 2019-4-1 03:00:24 | 显示全部楼层
    可以麻烦写一篇稍微详细一点的介绍吗

    该用户从未签到

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

    该用户从未签到

    发表于 2019-4-1 06:44:26 | 显示全部楼层
    当然靠打印成pdf也可以,可以用自动化小软件都打印出来,然后把pdf转换成html
  • TA的每日心情
    慵懒
    2 小时前
  • 签到天数: 2169 天

    [LV.Master]伴坛终老

    发表于 2019-4-1 08:23:36 | 显示全部楼层
    不错,值得借鉴,相信还有进一步挖掘的空间
  • TA的每日心情
    擦汗
    2025-2-20 14:02
  • 签到天数: 706 天

    [LV.9]以坛为家II

    发表于 2019-4-1 08:35:04 | 显示全部楼层
    这个应该比直接打印pdf再转html更准确一些

    该用户从未签到

    发表于 2019-4-1 08:45:20 | 显示全部楼层
    shadowfiend 发表于 2019-4-1 08:35
    & f  c/ k; t) Z, D7 @这个应该比直接打印pdf再转html更准确一些

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

    [LV.3]偶尔看看II

     楼主| 发表于 2019-4-1 09:57:32 | 显示全部楼层
    本帖最后由 wadu 于 2019-4-1 10:31 编辑 & Q/ Q; {3 P/ K+ f3 y, c% \2 @
    drongh 发表于 2019-4-1 08:451 l/ |- Z5 \: z- j9 b. o; l
    字典文件的装载不是一下读进内存的,只是读取用到的此掉,所以无法一下转储。楼主可以测试一下,看看内存 ...
    8 J0 [" ^9 o# O3 W; B! V
    是这样的没错,每次只会加载十几个词的样子,而且内存占用随着查看的词的数量的增加而增加,比如按住滚动条一直向下滚动,软件不断加载,内存使用也持续增加,即使中途停下来内存也没有被释放,继续滚动到一定程度软件会直接崩溃。
    4 y1 l' b0 s) `) c8 T7 {3 N' ]# B# K: V4 H7 S) x
    如果有高手应该可以直接反汇编或者跟一下软件读取 wbx 后缀文件的代码,然后写一个直接读光盘文件提取内容的工具。可惜小弟水平不够,也许只能通过 Cheat Engine 注入代码把软件加载的 HTML 文本写入文件了。$ R* p  X, x$ L  y1 D
    ' O) z" u3 S1 n9 B+ d/ i
    第一步:在 Cheat Engine 的 memory view 区域随便选一个字符(比如 English 的 E 字符)右键添加内存写入断点(Data breakpoint->Break on write,被写入时中断的意思),运气好的话软件可能会在跳转到新的词的时候更新这个区域。
    " m9 q5 D( v! ~# T7 Z# O& ~; ~1 O0 G. p7 H4 H
      O) s& m: N' b( V- r" [
    第二步:在软件查词界面滚动鼠标,软件果然写入在同一个内存,在 Cheat Engine 右下角的堆栈上双击最顶端的地址,去看看有没有线索: T1 ~: _, [. d0 Q

    1 ]3 t& r' }/ N' ]( \0 r
    # \0 Q4 K  k  e% z, T0 ~2 B这时候可以把之前的内存写入断点删除了,在字母 E 上右键选择 Delete breakpoint
    % m6 m" t7 D7 V, V& k4 A) F0 a/ z; l0 |+ p5 J+ @. a. y
    在下面这个 call OALD9.exe+274B0 的位置右键选 Toggle breakpoint 设置断点,继续运行软件,再次回到查词界面滚动,之后会发现执行到这里的时候寄存器 EAX 其实就是文本在内存的首地址。: [3 i; Y4 d! M. ?( L3 }

    + _3 R7 V" P5 D" b) U
    * O; N6 c! g; N& T2 |7 C4 G, m4 a: J3 P+ x+ G" f+ i4 F

    # b  s* {2 d/ r( H! u; G+ O# y每次在 call 指令上停下来的时候,在右侧的 registers 区域找到 EAX 寄存器,在上面右键,选择 Show in hexview! Y3 a- |$ W& V+ @6 o7 z

    & P- O, }2 X$ ~
    0 n5 V! Y# X( m# I9 t4 u* b* k; {! t7 `3 `7 J
    然后按 F8 单步执行(或者主菜单 Debug->Step over),停到了下一行代码上,观察下方的内存区域,发现内容果然更新了。
    5 |) R. g$ V# _+ F1 I! q4 r4 \4 [, {1 M& E8 _. J! ^  |
    第三步:接下来应该可以在这里注入代码,自动把 eax 指向的内存转储到一个比如 output.html。
    ) S6 I; u- Q7 f7 E8 R7 }这一步比较复杂,需要使用 Auto Assembler' ^% b1 E* a5 V

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?免费注册

    x
  • TA的每日心情
    开心
    2018-8-6 15:15
  • 签到天数: 10 天

    [LV.3]偶尔看看II

     楼主| 发表于 2019-4-1 10:21:39 | 显示全部楼层
    Helios-X 发表于 2019-4-1 03:00
    , g' {* I2 E" N) }8 r1 g可以麻烦写一篇稍微详细一点的介绍吗

    ( ?8 q0 w0 H& m' y7 f已经更新了,其实步骤很简单的
  • TA的每日心情
    奋斗
    2021-3-15 08:06
  • 签到天数: 585 天

    [LV.9]以坛为家II

    发表于 2019-4-1 10:29:05 | 显示全部楼层
    这个思路确实巧妙。

    该用户从未签到

    发表于 2019-4-1 11:52:08 | 显示全部楼层
    厉害。这个方法能能否把 Oxford Learner's Dictionary of Academic English 的数据搞出来?

    该用户从未签到

    发表于 2019-4-1 12:39:10 | 显示全部楼层
    wadu 发表于 2019-4-1 09:57& e8 ~  {9 K6 O
    是这样的没错,每次只会加载十几个词的样子,而且内存占用随着查看的词的数量的增加而增加,比如按住滚动 ...

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

    [LV.3]偶尔看看II

     楼主| 发表于 2019-4-1 13:14:27 | 显示全部楼层
    belleyeah 发表于 2019-4-1 11:52
    8 o7 s1 y/ C  ]4 Q1 A0 y% E6 P4 H$ O厉害。这个方法能能否把 Oxford Learner's Dictionary of Academic English 的数据搞出来? ...
    & ]/ F$ b' v; d# p$ H  d
    我手头没这个词典,我已经尽量把过程完整详细地写出来了,可以说图文并茂,或许你可以自己尝试一下
  • TA的每日心情

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

    [LV.5]常住居民I

    发表于 2019-4-1 16:17:38 | 显示全部楼层
    牛津高阶双解已经出了第九版了,为什么还是没有人出面制作呢

    该用户从未签到

    发表于 2019-4-1 17:32:09 | 显示全部楼层
    应该使用  DLL 注入技术。
  • TA的每日心情
    擦汗
    2024-2-8 08:54
  • 签到天数: 902 天

    [LV.10]以坛为家III

    发表于 2019-4-1 20:17:13 | 显示全部楼层
    看技术牛人在这里谈论,真是羡慕。
  • TA的每日心情
    开心
    2018-8-6 15:15
  • 签到天数: 10 天

    [LV.3]偶尔看看II

     楼主| 发表于 2019-4-2 00:35:41 | 显示全部楼层
    本帖最后由 wadu 于 2019-4-2 00:46 编辑 ! P) z. |2 n9 L- F# c
    henices 发表于 2019-4-1 17:321 L# n; T0 L6 d
    应该使用  DLL 注入技术。
    0 O) @# E3 O) M+ o# D# q
    感觉如果只是为了把 HTML 提取到文件的话直接用 Cheat Engine 打补丁就好了,只是这个词典不释放内存,不知道是否有意的,滚动多了就崩溃退出了。3 x; j; \) E/ g$ V. U
    7 I6 O) r6 h3 p. J
    我自己在 Cheat Engine 用它的 Auto Assemble 工具直接用下面的代码就可以提取内容了,接下来用 AutoHotkey 模拟滚动就行了。只是程序会崩溃真是比较麻烦(再次强调是程序自己原本在没有任何修改时不断滚动就会崩溃),需要自己过一段时间检查看看程序是不是挂掉了,然后手动重新运行程序,还要手动查看最后一个提取文件中最后一个词条的单词,回到软件上搜索到该词条,重新开 Cheat Engine 打开进程,继续重复步骤。+ H6 j  [+ S: R5 k2 q- A8 t4 b
    " d3 Q; T# ^( O1 X6 v
    这个附件 txt 重命名为 .CT 文件然后在 Cheat Engine 里点左上角的第二个文件夹按钮 Open a cheat table 打开这个 .CT 文件,然后在下方把列表的第一个 Auto Assemble script 前面的框打勾就可以使用 script 自动把 HTML 的内容保存到 C:\OALD9_Out\ 文件夹下了。9 P* K3 C+ O8 f* e7 j$ s4 _
    * G  R' R4 v( B2 N, }1 B3 D
    1 ?# p9 ^1 y, {( D$ d& Y

    - g, l2 Q, |6 [3 b- }1 X  `$ D9 \) [5 d

    4 T7 L' h. `0 i8 v/ i. @
    6 m' l, H1 y3 Pdefine(FILE_APPEND_DATA,4)8 J" x$ k$ ]( x. i6 V. G$ w; \
    define(OPEN_ALWAYS,4)
    1 e/ ^% O5 c8 r  _define(FILE_ATTRIBUTE_NORMAL,0x00000080)
    6 I6 ?: C) V  P: x1 ]. R6 z5 M" w* Bdefine(FILE_END,2)- s. L! ~6 |9 |& E) I0 a1 T6 O

    - I8 e& o/ t5 E, F) G# _globalalloc(html_str, 4). N# N. F4 {$ ]7 M2 M8 {) U! o% ~
    globalalloc(html_len, 4)$ U  d& ]1 b" x- P4 [2 g- k9 V
    globalalloc(html_cnt, 4)2 [# c: I% V5 s
    globalalloc(file_bytes, 4): D8 S1 x7 Y! E( l
    globalalloc(html_filedir, 255)6 G" g* X2 n" Z) n5 G+ u$ w  m
    globalalloc(html_filepath, 255)! a/ V" a) t3 h, w6 p1 s' B- F  I: ]
    globalalloc(html_pathnumaddr, 4)6 l' X1 K3 m4 W$ h
    globalalloc(html_pathnumformat, 20)
    4 Q0 e8 C9 Q( y1 U6 P
    . b# o3 f5 \1 c  n& `3 Bhtml_str:
    3 ]( v& B3 [6 f% jdd 0
    $ z( U6 C; d* b9 s8 e$ n+ L5 V3 D3 n, x
    html_len:
    ! E. J( z2 U/ H0 I6 ndd 0
    " V+ r; R5 {/ P9 `3 M; ~" ]4 `# B+ p; \- J; _9 c2 v
    html_cnt:/ h2 S4 l) Y2 W# l
    dd 0
    / Y9 p! U4 [5 ^6 O: `
    3 Z9 v( w+ F8 h& rhtml_filedir:
      D. g* y+ _) M/ Ydb 'C:\OALD9_Out\'8 T) p# a6 [% |

    & `; p! i8 [- k9 @4 ?2 r" a8 Hhtml_filepath:' ]  p* B* q& f" Q+ R  y+ ?
    db 0; G. Z6 C; d+ h8 h# c9 R. n

    ( X3 z: u  b& V7 K9 t% l3 phtml_pathnumaddr:
    . R" Q$ s& E# J3 ^( V. Vdd 0
    9 t" _+ F9 L6 g8 E0 c8 I4 O6 i- @0 Q% E) _# E: W
    html_pathnumformat:4 C1 R' ^& ^% Z, ~8 T8 b
    db '%06d.html', 0
    + Q* }2 ?6 P4 [: B5 `2 Z+ r2 U
    /*+ h6 a/ |/ B% I
    // lua is slow, so this is not used for now
    / d  {0 J% E$ B+ Z6 D! l{$lua}( `" k( V6 |4 \. s+ x4 H
    function myfunction(straddr)
    2 f' r9 E- M4 M; A- ^  --showMessage('html: '..straddr)
    / D4 s# u; F0 G: W  len = readInteger('html_len'), h4 g2 s* m* R  D( s* Z5 j
      --showMessage('len: '..len)
    " ~/ Y5 Q2 H9 N$ [/ K* z& U  --str = readString(straddr, len)
    9 I/ W: p1 B/ j$ l7 e0 p" h8 g  --showMessage('str: '..str)
    9 v; e: E( n" M  --showMessage('len of str is: '..string.len(str))" ^+ m0 Z$ E3 r$ @
      cnt = readInteger('html_cnt')
    9 ]7 u1 V7 Y7 I: e, e3 M5 `  cnt = cnt + 1
    & R& L. h" v/ p4 t' S" p4 C  writeInteger('html_cnt', cnt)
    / k" S1 u0 ~/ J9 u+ c  filePath = string.format("C:\\OALD\\%d.html", cnt)
    % m" O9 z. A4 c5 x! G  writeRegionToFile(filePath, straddr, len)
    1 m$ T4 L- [3 L! Nend2 t6 [" j# ?; a6 \7 u
    {$asm}1 F7 `/ D2 P6 B2 y% C

    ; c" y' O9 n0 n9 k) }- K8 gloadlibrary(luaclient-i386.dll). P7 e7 T9 t' L
    luacall(openLuaServer('CELUASERVER'))
      K* h& h7 I4 n1 S+ c/ k: y( P5 |. }7 ]% b4 @
    CELUA_ServerName:, U% z5 ~: n( _- R
    db 'CELUASERVER',0
    8 g: O8 T* C+ y$ R3 W1 u0 G
    & Z4 G6 G& u" f' o( aalloc(str_myfunction,32)
    $ a2 G8 |" y, n1 a9 }* R7 jalloc(functionid,4): t" v/ f" [& X" w% w4 X+ v/ d

    6 @* D2 G2 |6 P2 w% istr_myfunction:% R* v/ r6 S1 ^" y- [* [% K+ F
    db 'return myfunction(parameter)',0. w& Q' @# E3 {! w& ~
    */2 s5 I9 s6 G2 h0 a& c' `3 U
    : Q  B! z' D1 ]8 _
    [ENABLE]
    ; G( `* ]0 ^9 P- F' }//code from here to '[DISABLE]' will be used to enable the cheat
    + l) x. i9 d: p7 S6 n, }alloc(newmem,2048)
    " x1 r+ y; c- Lalloc(hFile,4)) R# `2 X8 T* q' a: s3 G
    label(IncNumFileCheck)
    2 a4 M* X) @; Nlabel(IncNumWriteFile)
    ; m0 U' P$ `/ t! b0 E/ Dlabel(DoWriteFile)0 q3 ^9 l  m, B9 C; i
    label(Cleanup)
    6 S5 s2 F2 `5 v$ Tlabel(returnhere)- g6 a+ _2 g# F8 u. v- A
    label(originalcode)
    " n( {# Y% z7 y' a. U8 K& X1 F6 llabel(exit)
    4 E* A* N2 ?  N/ V2 G2 g* q" I7 Z  z
    newmem: //this is allocated memory, you have read,write,execute access
    $ r8 }) U. e* r; ]$ M  `. N//place your code here: e- P2 y9 _5 g1 C$ A
    mov [html_str],esp
    3 E, Q# E7 f8 [push edx
    : T2 Z/ P( |* d+ A. ^: ~& V; Ppush ecx) w9 @/ L1 X: P0 t; ^( h4 `
    push eax% S3 k3 q* s8 s* K) k9 ]* v& n
    8 Y, Q3 M6 B, v, t% {
    mov edx, [html_str]
    9 f1 G1 E9 E0 b; T2 w* \- _& fsub edx, 286 i& x0 L1 i$ m5 I" t$ @
    mov edx, [edx]
    - ^+ Z1 D& X- ^$ cmov [html_str],edx
    , C" J: ^0 m: Epush [html_str]) Z' |9 z- n8 V* p5 H/ a1 w7 r7 F
    call kernel32.lstrlenA // stdcall, no cleanup
    ! o% P0 T( z5 O) o& {- c/ Imov [html_len], eax" j2 t: O7 L, T% U6 t" ~1 o4 w; t
    + a9 V+ ]) Q4 E
    // check if this is the first time
    5 S* s" D, \- ^3 y% z& v3 zcmp [html_cnt], 03 T( w$ w/ X$ V3 O0 ]3 _' e
    jne IncNumWriteFile
    : S/ r3 o; p6 W! S" |# o0 B7 l& Q. Y. F( O7 H. f7 X
    push html_filedir
    8 s5 K0 {4 A( s9 xpush html_filepath: h! W/ h8 R% k$ u  k# e
    call kernel32.lstrcpyA4 l2 |: ?0 ~" n! _
    ) d" {& I9 d$ o% G+ `) j6 m
    push 0. `1 c) e; ]" N9 p0 C# ~
    push html_filepath& X& y! }/ L9 S
    call kernel32.CreateDirectoryA
    2 z0 J: t# X' G" U) ~
    % F  s6 F9 J7 [, G+ X: A0 `0 \push html_filepath
    $ U2 U9 o) W" ~3 Ncall kernel32.lstrlenA3 _# f/ c' R  Z! r  [
    ) \& C/ {1 u6 ]0 W- \$ P% z+ R1 Q
    lea edx,[html_filepath]
    0 M+ ~5 p  k9 dadd edx,eax
    % K/ o8 a" ]6 ]mov [html_pathnumaddr], edx" k" t" ]( Q3 `, L

    8 f5 `/ `0 J  l- J' P// find the next available number' }% X% J  R2 b/ g
    mov [html_cnt], 1
    ! o3 ?/ |9 d, y, n9 k" Y+ v" |9 d/ R1 `7 S
    IncNumFileCheck:
    , L/ ]8 c0 L% ~) Xpush [html_cnt], e; r( d  S  }
    push html_pathnumformat
    ' k& W7 u  b# M: vpush [html_pathnumaddr]0 }! m2 k  e" W' I0 \2 d: F; _) \: w$ h
    call user32.wsprintfA) ~4 Y! j8 k" g; a+ h' ^) O8 S; N

    ) P; K7 a# ~6 `push html_filepath
    ! N$ P, C, H: X/ h2 Ocall kernel32.GetFileAttributesA
    ! n" ~% ^7 O( ~cmp eax, 0xFFFFFFFF
    ) a/ x- v* b/ R# g  Dje DoWriteFile/ [/ _7 `3 {3 b- U6 A5 S$ D2 @; H2 B
    mov eax, [html_cnt]6 g8 \0 w6 F0 T! ~* M
    inc eax& k6 _0 U8 [9 b1 F) J2 M
    mov [html_cnt], eax
    + Y/ t' {3 [/ W8 Rjmp IncNumFileCheck. S- d. f6 G/ {0 D' m9 t+ }( A3 B  W1 K
    " h, _% }4 ?0 f, J
    IncNumWriteFile:
    8 X+ E. Z: |$ B  L/ \mov eax, [html_cnt]# Y4 E$ @- {1 f$ p7 }5 X
    inc eax# P: M' e1 A3 Z$ [/ d( ]/ {. p
    mov [html_cnt], eax2 p0 v8 ]8 l7 B" J" ]6 Q

    * u* W+ g: `$ J) a4 V7 f4 Apush [html_cnt]
    ; G) d& b: u" G" Bpush html_pathnumformat! n/ Z) p$ a. R) g5 w
    push [html_pathnumaddr]
    : X, }: F; V1 E3 vcall user32.wsprintfA7 g+ t$ }) L9 G! r: M" ]
    : {, Y6 l% d; s, q2 C
    DoWriteFile:( e: H4 g, l$ \, \
    //push [html_str]' f! Y- [4 \, R
    //push str_myfunction
    0 @5 C& K( @6 `$ N; \( H( \//call CELUA_ExecuteFunction
    0 q& F- O# D$ ?push 03 \8 Q  h- }. S; A- b! q
    push FILE_ATTRIBUTE_NORMAL
    - q8 r  y( g1 npush OPEN_ALWAYS  D; F) J  U' x1 r2 b1 A1 G3 M
    push 0  t3 z3 l2 |  b& `- T+ ~
    push 0
    0 t5 J, |# U7 c7 L$ w* M% |: D- qpush FILE_APPEND_DATA
    2 K1 S1 D, G  F; l6 ]1 L# a6 Hpush html_filepath5 k( Y3 t$ S* h
    call kernel32.CreateFileA
    - L6 d( ?0 ?" L; ztest eax, eax
    1 \, _- c: Q( Q6 `je Cleanup# o, M" W+ x1 ^* z7 K) g% C

    8 m4 ~( a5 v: p+ _4 I0 @mov [hFile], eax
    + w/ u% r& x" U! h: }& z) V1 x
    ( j  H# e% N) B1 bpush FILE_END' b* c; G# x9 X- W0 E! o+ `
    push 0
    ' t* S5 a( D9 c& x' f2 X3 apush 06 Q+ F8 P$ u. F3 a( F
    push [hFile]* Z! `7 h  V4 j% @
    call kernel32.SetFilePointer+ S7 K  n0 \( c# g; J" t

    ! s/ i) p$ B/ W8 Cpush 0+ u6 t7 S2 V4 M; n& X4 k$ U
    push file_bytes$ L" p: H* ?6 X
    push [html_len]
    8 a+ ~5 ^; H0 P% l, b( K! ~7 P- J5 upush [html_str]. \" l, e! H( m2 ^4 \, M
    push [hFile]# p2 j7 n. q, E3 e" B. g
    call kernel32.WriteFile
    . i2 ~3 q" I) H/ S0 ~# _$ Z) A, H
    3 A% m. N9 e% \8 `8 u- Rpush [hFile]8 d! ^3 ?, k% g' o+ E0 T0 E
    call kernel32.CloseHandle
    6 @! J1 T+ S! \0 q* W
    5 z; y6 o4 P& j8 q: O+ G+ Q* m8 g/ p; R: `
    Cleanup:7 o7 ?0 s4 H5 W' @+ c" }
    pop eax1 s" C1 x$ L+ {! j: _2 W. E5 t
    pop ecx
    8 b: l0 |9 X7 Q6 D4 x1 D2 [) xpop edx+ d  S- R) o& }) g$ k; e# Y0 Y2 e

    + Q# F, P# a: Q! koriginalcode:
    5 C% {" R+ t+ t  m) Z1 a) `. \mov [ebp-04],eax
    3 j- g0 S: W9 g. {$ \8 U. Z, g  `push 00; w0 [0 p& W8 {  e5 |0 V
    / ?1 q( H' u0 ]2 j- D) v/ d
    exit:2 L7 I1 I. h  o
    jmp returnhere
    + ?' \0 X0 {% d' q8 @5 \
    6 P1 L" h* l; O3 `, y! a. p"OALD9.exe"+32127:
    ) x% a5 V2 s+ ]: ]" ~jmp newmem5 |; V' J2 z- }$ I2 d" [; S5 r& H
    returnhere:6 l( M- G% ~2 K; U
    ' I( j' I( ]4 E7 i; w
    0 v3 Y" S7 C: m, H. L# A

    8 i8 w+ F* f4 h- w
    ; W5 j+ c) x1 _0 _- K- L[DISABLE]
    - a! H8 `& F3 n//code from here till the end of the code will be used to disable the cheat% j' y1 l5 j0 E& H! t, M1 ^
    dealloc(newmem)
    : q' [" K; g2 g: ^7 z"OALD9.exe"+32127:
    % y  y$ U# G7 O2 X% amov [ebp-04],eax
    ! S1 T  U  K9 N% ipush 00+ q( P' ~3 S; z6 n( z4 L" M; ^
    //Alt: db 89 45 FC 6A 00

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?免费注册

    x
  • TA的每日心情
    开心
    2018-8-6 15:15
  • 签到天数: 10 天

    [LV.3]偶尔看看II

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

    [LV.4]偶尔看看III

    发表于 2019-4-2 18:47:35 | 显示全部楼层
    wadu 发表于 2019-4-2 00:48
    ) f& D: ?8 h" f) K7 [好了,既然现在证明基本可行(虽然过程有点繁琐,程序崩溃需要手动恢复进度),那么接下来的问题是:那些 H ...
    ( _/ X, R& n  a+ n2 y
    我愿意搞这个HTML转换,我最近在做Macmillan词典,刚好有一些代码可以通用处理HTML转换的。另外楼主从哪里能下载到这个词典,我也想试试,我计算机128G的内存,根本不害怕内存溢出什么的。
  • TA的每日心情
    开心
    2018-8-6 15:15
  • 签到天数: 10 天

    [LV.3]偶尔看看II

     楼主| 发表于 2019-4-2 23:02:10 | 显示全部楼层
    本帖最后由 wadu 于 2019-4-2 23:04 编辑 0 N# r5 o6 J1 ]5 M
    ogrishman 发表于 2019-4-2 18:47
    . ~9 q/ V% i5 I' X/ O我愿意搞这个HTML转换,我最近在做Macmillan词典,刚好有一些代码可以通用处理HTML转换的。另外楼主从哪 ...

    : z+ d0 n5 Z& U0 G7 ]$ w3 \太棒了!3 {; W, i; F3 T8 f! B
    我感觉软件用的这个更像是 XML,但却又好像含有一些不符合普通 XML 语法的标签。
    $ l' g8 q& y2 e, F( T2 ]
    ! q% L. d  @, g0 E下载可以试试看这里:
    & K& k9 p+ r, H: Ohttps://getintopc.com/softwares/ ... tion-free-download/
    3 m4 j  [1 n; g; Q: C, K( d) `" \8 M- F/ \8 u
    这个似乎也是:
    5 T# S3 I9 d6 Y5 ^https://archive.org/download/OALD9
    9 ^+ v* A$ `3 @1 q4 M' Q) Q2 M: f$ w) P+ i

    ( P$ k- Q" l2 i! u: Y至于内存使用则感觉很随缘,几百M就崩溃也是常见。7 i3 z! x4 h% w& K& a
    3 K8 a3 F$ |8 m

    该用户从未签到

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

    [LV.3]偶尔看看II

     楼主| 发表于 2019-4-3 08:53:42 | 显示全部楼层
    drongh 发表于 2019-4-3 06:44
    " @5 b+ [2 k/ A; v0 t4 @# v楼主你看一下这个主程序是c++还是c#写的,如果是C#写的,很容易反编译。直接提取读取函数。然后自己写个程 ...

    2 M. |) W) P0 B# B0 [6 e9 v用了 msvcp_win.dll (MS C Runtime),明显是C++写的,程序是32bit,从看到的代码来看也没有.NET程序的特征。
    + u# G7 L5 k4 t2 a( R
    + H+ l0 Y* x3 N/ G如果可以直接反推出读数据的算法可以脱离程序独立提取那当然好,可惜小弟能力有限,即使有 IDA 的帮助也还是难度很大,所以注入修改代码是目前较好的办法了。

    该用户从未签到

    发表于 2019-4-10 11:08:23 | 显示全部楼层
    其实我倒是有个方法,楼主可以参考一下。
    ( M' Y0 y# m. [
    . c2 J5 \+ L! j! S1 Y3 I( f1. 首先找到程序中进行单词查询的函数
    / Q# H4 M$ F8 ^$ n2. 注入一个 DLL
    0 v& A5 I$ i4 N. Q( l) O- X3. 在 DLL 加载时读取一个单词列表,循环调用单词查询函数
    5 a2 H! n$ `5 z' i# U4. 将调用单词查询函数返回的 xml 保存
    : v% U8 O1 P/ ^% R# N
    5 K% X! t6 T- y. P7 W1 a- ?; X" l( U完全是一个假想,楼主不用当真。
    您需要登录后才可以回帖 登录 | 免费注册

    本版积分规则

    小黑屋|手机版|Archiver|PDAWIKI |网站地图

    GMT+8, 2025-5-7 18:20 , Processed in 0.026329 second(s), 26 queries .

    Powered by Discuz! X3.4

    © 2001-2023 Discuz! Team.

    快速回复 返回顶部 返回列表