掌上百科 - PDAWIKI

 找回密码
 免费注册

QQ登录

只需一步,快速开始

查看: 3733|回复: 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 编辑
    + c. w; n* G( Q8 D3 Y& `& H" x8 H* h8 O& o. z
    OALD这个词典真是很好用,我一直想找个能在欧路里面用的电子版,目前在手机上用的是第八版。, o4 M3 x. W* i/ @4 p

    7 l* J  c! N8 W# O- J1 m我看过 zhuode 兄发的此贴 8 H! O. ]& Q& n+ f
    3 f0 i0 @1 i' z1 e0 c8 ~9 e
    COD9完美mdx化的一些个人探索、启发与实践( m- p; ?# n8 n1 P/ p# z
    https://www.pdawiki.com/forum/forum.php?mod=viewthread&tid=32390
    3 `1 {" w% w" K% o( \6 s& @$ w+ @7 p' |# {' v+ e! r. \: f" k
    , ~4 Z# _. ?$ `, h6 c
    基本是靠软件本身提供的打印功能输出 PDF,需要进一步处理。
    # N1 z( t6 [4 y/ e' P' p! y# |0 _4 s8 c5 I% M! j* Y2 N
    我这个周末试着去从第九版的光盘软件里提取词典内容。
    ( _, }/ m2 b' x软件似乎有保护,需要用 Alcohol 120% 加载光盘镜像,但加载好后其实不需要安装软件,直接找到光盘里面的OALD9.exe 运行就可以了。
    4 ]" d* G" f' c" X打开后软件界面是这样的:
    : l' m$ D4 ~) e+ H# e
    1 m; L7 P6 \8 }: Z& R. i' d
    # H8 S4 C# H  S, \% _* ^9 u# s2 @4 \
    确实也是可以复制词条和打印,但我想试着换一个思路。
    " [/ e3 L; ~0 d3 ~1 K/ M: G6 s& D  m+ N8 m5 l  O
    • 运行 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 region2 I; s$ ^/ n% q! t( u
    ! K( x  C9 ?- {

    + `9 D- z6 h( v2 N/ k
    2 n) M9 |0 S$ I% V# |: ~. e9 }( G. h" i4 h$ C( g
    HTML 的部分内容截取如下:
    * s8 Q) {( `- k2 o; k: K* \* R% P4 O( V; p, d) _
    <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$ s5 [5 u6 c" G( k5 b1 e
    $ m+ m0 j: I8 F
    4 E3 S9 u: B5 E% A! ?' a- w
    直接保存为 HTML 文件 ,显示当然是不正确的,但至少内容是完整的,也许可以根据这部分内容的格式做进一步的处理(比如去掉无用的tag),也不知道这个办法是否可行。; ^2 E/ G7 t" X  {9 [( F# b- r

    ) f; m$ S+ c6 M& B! w# D9 }, o0 h2 S! `: p
    4 x$ F- v5 ^9 m4 I1 W' B2 Z- ~

    本帖子中包含更多资源

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

    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的每日心情
    慵懒
    9 小时前
  • 签到天数: 2170 天

    [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:356 ^& O  M0 r1 d
    这个应该比直接打印pdf再转html更准确一些

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

    [LV.3]偶尔看看II

     楼主| 发表于 2019-4-1 09:57:32 | 显示全部楼层
    本帖最后由 wadu 于 2019-4-1 10:31 编辑 3 @5 D$ i& Q, g
    drongh 发表于 2019-4-1 08:45+ B* Z6 C: f: N" W0 @6 Y. }
    字典文件的装载不是一下读进内存的,只是读取用到的此掉,所以无法一下转储。楼主可以测试一下,看看内存 ...
    ) l6 H7 a, Z( r
    是这样的没错,每次只会加载十几个词的样子,而且内存占用随着查看的词的数量的增加而增加,比如按住滚动条一直向下滚动,软件不断加载,内存使用也持续增加,即使中途停下来内存也没有被释放,继续滚动到一定程度软件会直接崩溃。
    / F% N1 F& s$ C+ k) Z; ]/ s! R3 z- b; ~$ u* {- I7 T4 q
    如果有高手应该可以直接反汇编或者跟一下软件读取 wbx 后缀文件的代码,然后写一个直接读光盘文件提取内容的工具。可惜小弟水平不够,也许只能通过 Cheat Engine 注入代码把软件加载的 HTML 文本写入文件了。% z$ s* v) _; E6 u' v

    " U( Z# _" e1 K8 `, s: |7 \5 |第一步:在 Cheat Engine 的 memory view 区域随便选一个字符(比如 English 的 E 字符)右键添加内存写入断点(Data breakpoint->Break on write,被写入时中断的意思),运气好的话软件可能会在跳转到新的词的时候更新这个区域。1 d* V0 B0 Q5 H3 s* _6 o

    ! Y3 v4 s( t* v. I5 i1 A  C+ g; ~, S: V4 B- U
    第二步:在软件查词界面滚动鼠标,软件果然写入在同一个内存,在 Cheat Engine 右下角的堆栈上双击最顶端的地址,去看看有没有线索" d  F0 v* D8 u1 {
    , C0 F5 H( \: ?4 E

    : e3 {2 y  I* C9 R: `. h这时候可以把之前的内存写入断点删除了,在字母 E 上右键选择 Delete breakpoint4 z  q! ?; i/ z  v$ G; t, w

    / T" \% Z( ]/ j0 a+ _" V1 d在下面这个 call OALD9.exe+274B0 的位置右键选 Toggle breakpoint 设置断点,继续运行软件,再次回到查词界面滚动,之后会发现执行到这里的时候寄存器 EAX 其实就是文本在内存的首地址。% t7 W! q. s& _# B' x) ~
    " v3 a# F5 m: g7 @, \0 l9 r
    8 W  C6 p7 T6 j. f7 r. M: u' D
    7 t! d3 T/ M* C

    $ W% a0 n+ |9 ~6 n/ ]: W每次在 call 指令上停下来的时候,在右侧的 registers 区域找到 EAX 寄存器,在上面右键,选择 Show in hexview- h! i# F  D: o- _
    - D# j  h$ j& `+ y; O
    ( ?9 O, K  X5 ?/ ]1 L( E

    0 z- Z7 ~( ^( W0 r然后按 F8 单步执行(或者主菜单 Debug->Step over),停到了下一行代码上,观察下方的内存区域,发现内容果然更新了。
    / Z' E6 I9 ]& u+ u6 u4 ?7 j6 W8 E  K* j
    第三步:接下来应该可以在这里注入代码,自动把 eax 指向的内存转储到一个比如 output.html。" G/ P2 F/ K, F( R
    这一步比较复杂,需要使用 Auto Assembler  r7 O) t4 L3 }

    本帖子中包含更多资源

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

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

    [LV.3]偶尔看看II

     楼主| 发表于 2019-4-1 10:21:39 | 显示全部楼层
    Helios-X 发表于 2019-4-1 03:00
    $ O/ V8 z3 {8 x可以麻烦写一篇稍微详细一点的介绍吗
    & W+ G$ g6 g7 T. R' L; H
    已经更新了,其实步骤很简单的
  • 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+ _1 G0 Y5 x7 l9 n2 r6 r6 F+ {9 `
    是这样的没错,每次只会加载十几个词的样子,而且内存占用随着查看的词的数量的增加而增加,比如按住滚动 ...

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

    [LV.3]偶尔看看II

     楼主| 发表于 2019-4-1 13:14:27 | 显示全部楼层
    belleyeah 发表于 2019-4-1 11:522 n& [& Q% Y8 j
    厉害。这个方法能能否把 Oxford Learner's Dictionary of Academic English 的数据搞出来? ...

    , g) |5 a8 L* U5 R7 `3 ^! k3 f& Q我手头没这个词典,我已经尽量把过程完整详细地写出来了,可以说图文并茂,或许你可以自己尝试一下
  • 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 编辑 & \& I* n/ T% \6 K
    henices 发表于 2019-4-1 17:32
    1 f6 S! k) W! \1 [) p. w) C" C2 v; V0 e应该使用  DLL 注入技术。

      \3 K( y1 S, o8 W感觉如果只是为了把 HTML 提取到文件的话直接用 Cheat Engine 打补丁就好了,只是这个词典不释放内存,不知道是否有意的,滚动多了就崩溃退出了。
    1 w3 @0 z( V4 d, U1 i; r) k+ w0 o1 t) J+ i3 p
    我自己在 Cheat Engine 用它的 Auto Assemble 工具直接用下面的代码就可以提取内容了,接下来用 AutoHotkey 模拟滚动就行了。只是程序会崩溃真是比较麻烦(再次强调是程序自己原本在没有任何修改时不断滚动就会崩溃),需要自己过一段时间检查看看程序是不是挂掉了,然后手动重新运行程序,还要手动查看最后一个提取文件中最后一个词条的单词,回到软件上搜索到该词条,重新开 Cheat Engine 打开进程,继续重复步骤。
    9 m; e& X% V9 b$ A2 h- i2 a( d
    % F. f6 \4 |. R7 T. B4 A/ @, u这个附件 txt 重命名为 .CT 文件然后在 Cheat Engine 里点左上角的第二个文件夹按钮 Open a cheat table 打开这个 .CT 文件,然后在下方把列表的第一个 Auto Assemble script 前面的框打勾就可以使用 script 自动把 HTML 的内容保存到 C:\OALD9_Out\ 文件夹下了。
    + ]; f( h/ t. a5 l6 ?
    " v8 U: J' V5 U; p& P4 m; B4 j* p2 S) |
    $ _% d) ?$ q9 J3 z% |

    % b* h& O8 X- m( }( t2 |' M) L; L8 C) G

    + r" f% [# Y: N) B+ Mdefine(FILE_APPEND_DATA,4)
    6 N$ D# y1 |# R) odefine(OPEN_ALWAYS,4)
    5 u& x7 d6 n- Y2 k, S9 y" |define(FILE_ATTRIBUTE_NORMAL,0x00000080)3 A  ?1 Z& [' Q& N4 ]0 M$ y
    define(FILE_END,2)
    + ~: a$ C: x# q" v( e$ Y4 b6 M$ a
    4 e% e* n  \: f& tglobalalloc(html_str, 4)
    7 \* x6 S8 h& F. P3 Wglobalalloc(html_len, 4)
      A6 S& L" Y3 Aglobalalloc(html_cnt, 4)
    ; }& X8 g0 N  X6 \2 |globalalloc(file_bytes, 4)
    & m! X; v( k1 o, _& Cglobalalloc(html_filedir, 255)2 {; H, Q3 W, `# z
    globalalloc(html_filepath, 255)
    : R% X" t, E- Fglobalalloc(html_pathnumaddr, 4)
    7 o" E! @; K9 \  P2 ^globalalloc(html_pathnumformat, 20)! ~# q+ b8 p& `, j" l

    ( \7 y) P7 O# F  ~7 _5 v$ Chtml_str:1 Z6 r& X1 u, s
    dd 0
    # V$ u% F" f: Z8 y- b8 ?: V) C, V; ]
    html_len:6 ]& }* F4 k) ^) f; I
    dd 0
    - n; b" N5 _  K$ J6 o7 A/ ]+ A3 M, G' d
    html_cnt:$ \' W3 i, Z" D: @6 P' P3 j5 g4 o
    dd 08 ~5 i7 A3 F2 A6 R
    9 X. `9 M, @- s! e! Q
    html_filedir:/ f5 i7 R) K/ h+ Q
    db 'C:\OALD9_Out\') F3 k7 h) D0 O0 H0 R- ~
    + _+ \; o8 |3 H
    html_filepath:# e2 v7 Q3 J( ^- T
    db 0
    ' o, _- ^/ ^5 ]
    ' Y( R8 d  r" d2 Nhtml_pathnumaddr:
    4 C) r$ l0 L; udd 06 }5 G- P! ^2 f# u! _8 z0 v' R* f% X

    ' d' J9 C" T  ^7 \0 bhtml_pathnumformat:9 A5 B# N/ B3 l1 m( ]
    db '%06d.html', 04 e  E5 d. B& B2 a  C" K+ `

    1 C" n) x4 G! Q6 l$ v7 k5 Q/*- y: l6 b0 t5 W
    // lua is slow, so this is not used for now
      G  h' U& H% e{$lua}8 K/ Z1 ?) W8 S, A
    function myfunction(straddr)# ^* d; y+ ^& x$ r: U# g2 N
      --showMessage('html: '..straddr)
    ; E& N% ]7 S% w  len = readInteger('html_len'), a, Y  _% Y; @! q6 I6 M7 g
      --showMessage('len: '..len)
    7 R9 Y& L/ i- `# V. B  --str = readString(straddr, len), G8 H# J# @! b
      --showMessage('str: '..str)
    ) r. F7 U$ R. }" G1 P5 x( o# T: y  --showMessage('len of str is: '..string.len(str))' B$ a* _/ E( y/ I5 }! s
      cnt = readInteger('html_cnt')
    3 K, B8 l. T$ z9 Z' V  cnt = cnt + 1
    3 U& F5 `# R7 F( q/ M  writeInteger('html_cnt', cnt)% }( I, A' F( D7 R6 ~0 T' y  x
      filePath = string.format("C:\\OALD\\%d.html", cnt)
    - A% o2 |8 S, @% I3 {  writeRegionToFile(filePath, straddr, len)
    ! d4 g% b& [; d- `, i8 e* ^% Wend) y$ s* D1 M8 C5 a4 l
    {$asm}$ x: }" R& T0 n
    , l5 T. H. J2 W
    loadlibrary(luaclient-i386.dll)! W: N" p# ?* r" s' b) h3 L
    luacall(openLuaServer('CELUASERVER'))
    7 b+ g, R2 t7 K- M$ l& [3 K5 L
    # M/ X7 H( r- x+ LCELUA_ServerName:% ]4 b7 C* u) O3 W
    db 'CELUASERVER',0
    ! U* W, l  b" E  a: c! J* x7 S: `" {/ b, F3 H2 J4 Z  q
    alloc(str_myfunction,32)
      D" d3 f' {1 G6 B2 ^# G1 ^4 _( z# N. Nalloc(functionid,4)8 N1 R3 h$ s2 H! X

    ' Z6 Y( T2 s2 t. R" L. [1 hstr_myfunction:
    ( d5 q7 }( c1 y$ j4 mdb 'return myfunction(parameter)',0% I  y& T) a' R* j
    */# k8 d3 ^$ C/ q' X5 Z3 l
    " x  Y' G3 |  b% O0 o; B! p! s
    [ENABLE]+ g3 m6 g4 L0 P4 q4 }" i
    //code from here to '[DISABLE]' will be used to enable the cheat
    6 G9 _3 g) ]% Aalloc(newmem,2048)0 c( E9 u6 {& J
    alloc(hFile,4)
    ; x1 k+ E0 r/ a9 o4 S# ~label(IncNumFileCheck)" u3 b5 \+ f: j9 u( L0 a
    label(IncNumWriteFile)
    " ~4 p  ^9 q# c4 `label(DoWriteFile)# |4 i; ]: z3 y/ e8 G5 _# I
    label(Cleanup)# a* I7 B  x# d
    label(returnhere)
    . Z; r0 |1 w4 E) g: g8 g% hlabel(originalcode)& {# z8 ~/ [3 v  k& U9 W* s
    label(exit)* t# B9 S; }3 u9 \5 o- p
    7 i& m" v1 h, u! M) l9 i, n
    newmem: //this is allocated memory, you have read,write,execute access5 l  j8 z$ r! }
    //place your code here6 g8 o4 ~0 X/ e. D$ A  o
    mov [html_str],esp
    ; B7 u' M$ E7 ?push edx+ `, j2 l6 Q3 J( E  J; h, o0 k
    push ecx' S+ f* c8 c) C6 M
    push eax
    1 m; A( g2 W- A  g
    5 J' r. h& g! ]) Umov edx, [html_str]/ o" {% H! ^: M7 z4 J( I
    sub edx, 28
    4 q0 j/ s' J0 w+ M' Omov edx, [edx]/ z2 Z( u/ r9 [( g  g% W3 F3 c
    mov [html_str],edx
    & H4 s5 M  q& p2 P4 I- apush [html_str]5 z2 @6 U/ {4 P! D
    call kernel32.lstrlenA // stdcall, no cleanup' j2 @( g* _6 O; w& o4 J
    mov [html_len], eax
    3 r5 x. j" E; o( x3 x  K
    ( f. B% d, \9 N" m- h' O// check if this is the first time
    8 |$ N- Z3 L: X6 T) i, G" r; Qcmp [html_cnt], 0, {0 {8 z! j+ t; w: W, s
    jne IncNumWriteFile
    0 c6 ?" E; f$ S
    / c9 p9 D9 h! m/ T0 M; _push html_filedir0 K, W; a9 f$ _1 ~2 J
    push html_filepath
    4 `( L5 o. ^% M4 ~call kernel32.lstrcpyA! o* x% e9 h1 [6 r8 l

    : R& Q( U( c% Y! D, }push 05 ], X; r! E( M' u' w. d: h* g
    push html_filepath: I$ K& x; ^% L( ?0 C
    call kernel32.CreateDirectoryA
    & M8 s# s; x; i3 `
    6 h. W6 @1 t& j/ n! R2 Qpush html_filepath
    5 T/ c# {0 B, ^9 ?call kernel32.lstrlenA2 a- L+ J* x; p" N1 _
    " n. F( K4 a; d7 i+ f: A  J
    lea edx,[html_filepath]' R2 c4 U/ L7 ^; w+ u5 ]
    add edx,eax
    " F; `2 B9 G- P; v. pmov [html_pathnumaddr], edx# b! ?" R# i8 J, O8 ^

    7 i8 |) S$ F, ~9 O* i+ b// find the next available number) N1 T; P! q$ n$ Z& l0 Y+ ^
    mov [html_cnt], 1
    $ x: F9 w. J( U9 ]5 ]* m$ L* Q2 z8 L
    IncNumFileCheck:
    & A' ^: q# B* j3 r; @push [html_cnt]3 g9 t# [6 H( j& O
    push html_pathnumformat5 @2 {- |6 o4 `) x/ |( }$ c! O
    push [html_pathnumaddr]
    . W/ y# r. R# o9 I# jcall user32.wsprintfA9 z# t/ n. V5 R& t! @$ j0 K
    ( h% Y+ \$ N6 R) {9 y$ y5 i
    push html_filepath
    9 ^! X- b. m8 {# J/ ~call kernel32.GetFileAttributesA/ \* Z  q: d4 e9 ^
    cmp eax, 0xFFFFFFFF% z) L/ M7 g1 G2 i. M
    je DoWriteFile) c$ s, C' Z0 @/ p$ d9 |* J
    mov eax, [html_cnt]
    5 J" ?: |; z- f( S" C0 M, pinc eax
    ( w6 R: O. ?: r- Imov [html_cnt], eax9 _' i6 o. I3 {6 [) |9 Y
    jmp IncNumFileCheck
    1 T2 E& s& O5 J- ~1 F
    ( v! k8 P% f( GIncNumWriteFile:
    ( w2 J8 D9 y& k! @( ]mov eax, [html_cnt]
    " R. x9 R0 z' |# g, U: minc eax
    " z% r" r  S  p. b( a' {mov [html_cnt], eax1 d, a/ a1 Q- Z1 ]; _
    $ a7 C' D& L5 u& {. ]
    push [html_cnt]* @4 |% v) j" c/ c9 f. |) g! y, p
    push html_pathnumformat
    2 w3 a+ _/ D; m+ b5 I- }+ S6 V; ~push [html_pathnumaddr]
    - {4 L. ^7 z5 Y( C$ m% d& y& I3 n7 fcall user32.wsprintfA
    + \; _: |) s5 E5 I2 u" l* m; S) U- ]6 _
    DoWriteFile:$ o! j+ p" o8 D) H  R
    //push [html_str]
    1 Q( N/ d; K# N2 O* Y//push str_myfunction
    ; I, L0 `: z5 }//call CELUA_ExecuteFunction1 \; T  ^. `8 U# [8 `  w- d) m$ `, B& ?
    push 0
    , I9 g' i. q0 ]+ Spush FILE_ATTRIBUTE_NORMAL1 M, i: h; c( q6 |
    push OPEN_ALWAYS
    9 V" {1 R# j( w7 h/ cpush 0
    1 F- y, @# L" o7 t' Tpush 0/ C# s) M+ N* @: M) k
    push FILE_APPEND_DATA
    1 ?. t! v% e- A* H8 B6 i) P$ r( ppush html_filepath
    / z2 ~1 s" d" y, wcall kernel32.CreateFileA5 b$ X' ^+ P% r8 i$ o/ m. h3 J
    test eax, eax7 R# g4 @: N! r% v' f
    je Cleanup
    $ C4 R1 G; z9 ]. P$ E0 X3 ^
    3 [4 j9 ], O& Y2 O8 [) ?# Pmov [hFile], eax
    " i9 c/ O5 J$ ?/ r$ x7 y( W5 }# _, V! w* Q8 N4 G+ M, T) @/ X
    push FILE_END% H  n; i" r8 R+ o( c% B
    push 09 d4 a9 t! ]/ Z# {5 v, g2 o" U; A
    push 0
    : S9 r2 I8 R, w4 s+ P& ipush [hFile]
    9 k4 f. y3 E+ _9 d  Vcall kernel32.SetFilePointer) P" C& _" p8 a8 s
    7 C# O- K1 ~- U3 A
    push 0
    $ b) i, ~0 x2 Dpush file_bytes3 n0 j7 Q: w; ~& \5 r8 ?
    push [html_len]
      A" l: E5 K! Opush [html_str]
    # v- W- L* z1 m! a  Z( npush [hFile]
    ) `1 y8 s0 w& [; J6 v: _+ h1 Zcall kernel32.WriteFile% n/ g% X0 M3 b' {" v

    9 B$ S2 t# y) J  V0 ?+ Q- R' }push [hFile]
    * I1 J; v& j8 B1 [call kernel32.CloseHandle
    4 J! g! a! {2 Q7 u$ r) @* {
    ' S7 x6 `5 a0 l5 Y  t$ M! ~9 ^6 O
    ( r2 b+ e5 A, ?( }: kCleanup:' `1 f* R/ y4 V9 U
    pop eax9 b$ i3 M- n: X
    pop ecx
    3 q3 R( ^( v' Ipop edx
    " S6 f+ y) K9 m/ {9 a/ G! u) h; u; C+ V" d/ Q% |& I- ?& Z( B5 g
    originalcode:
    / @) y% o9 Y8 L' Mmov [ebp-04],eax
    1 G3 f: Y/ q" r) `push 00
    8 r5 m9 D* n) W; j* d" Q3 H# }' R' v7 Q& y
    exit:
    ( [% n' s) l' \jmp returnhere& t6 q: K* J0 ~2 ]; o) H& S
    - U" q* n6 Y2 P( [$ v
    "OALD9.exe"+32127:
      W9 C. W+ s- F' y$ Z* Rjmp newmem/ {6 g6 H( \3 \( b2 ~! T# I% h1 R6 d
    returnhere:
      j) s* @3 i7 c1 @" w0 |8 C+ Q# B2 n  S5 @3 H. r# z
    8 X6 r- `5 i& z

    ( m' h6 W5 Q1 ^: b4 a( s
    9 {& n% b' Q7 t% c[DISABLE]/ W8 @: W4 C/ ?  |% r2 \9 @
    //code from here till the end of the code will be used to disable the cheat5 Q+ Q: \% E4 p& b  d
    dealloc(newmem)
    2 ?8 D. \! d+ x" u( h6 H"OALD9.exe"+32127:
    * O5 J" r) [$ ?. d$ D( M" l/ emov [ebp-04],eax
    " w% O9 p3 B. v. x$ Hpush 00
    ) o1 m, X/ ?5 ]. w//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, {9 N% r/ u- d( X# b7 m4 C2 ~
    好了,既然现在证明基本可行(虽然过程有点繁琐,程序崩溃需要手动恢复进度),那么接下来的问题是:那些 H ...

    6 x+ E7 {1 |/ u我愿意搞这个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 编辑 4 H( w5 R9 j8 l4 S0 s* }( v
    ogrishman 发表于 2019-4-2 18:47
    " F* C; [3 e9 p2 r6 Q我愿意搞这个HTML转换,我最近在做Macmillan词典,刚好有一些代码可以通用处理HTML转换的。另外楼主从哪 ...
    + M0 l+ y. q- K8 v  Y, p
    太棒了!
    + z% e- L2 t8 V# s1 F5 ]我感觉软件用的这个更像是 XML,但却又好像含有一些不符合普通 XML 语法的标签。
    2 n; V. V& \  B# n, U0 u
      N; [" \  f# L. c! |下载可以试试看这里:
    - d1 K' [/ k9 F, Chttps://getintopc.com/softwares/ ... tion-free-download/
    0 ]% [. r1 X5 u# A  Z4 V' ^& v- R, {% {" c/ Z" i! O
    这个似乎也是:1 W8 u& ^4 k7 |3 d9 s; {
    https://archive.org/download/OALD9# a( N5 i9 ]* P- c
    : G) w! F4 {7 M  a% i/ B( |
    / @/ S8 F, u9 }5 C
    至于内存使用则感觉很随缘,几百M就崩溃也是常见。. l2 H' e' M4 S( L& z
    2 X3 }- [+ Q; H) I7 I7 B

    该用户从未签到

    发表于 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
    # P0 w5 R* L8 K( x5 |楼主你看一下这个主程序是c++还是c#写的,如果是C#写的,很容易反编译。直接提取读取函数。然后自己写个程 ...

    ; V% J1 D6 \1 {3 d用了 msvcp_win.dll (MS C Runtime),明显是C++写的,程序是32bit,从看到的代码来看也没有.NET程序的特征。
    , p0 h1 E: _3 D- n( ~$ w( ?7 y
    ( q9 \: v1 D% V如果可以直接反推出读数据的算法可以脱离程序独立提取那当然好,可惜小弟能力有限,即使有 IDA 的帮助也还是难度很大,所以注入修改代码是目前较好的办法了。

    该用户从未签到

    发表于 2019-4-10 11:08:23 | 显示全部楼层
    其实我倒是有个方法,楼主可以参考一下。
    ) h$ X" T: b# z$ ], t; J0 h. P" T
    2 W! M+ u! L3 E/ k( k7 j8 R& \1. 首先找到程序中进行单词查询的函数+ v3 m( D2 s+ R# J
    2. 注入一个 DLL
    % Y% S8 |/ Q3 V7 |& d. f3. 在 DLL 加载时读取一个单词列表,循环调用单词查询函数
    + {9 Z/ l9 Y. I  _4. 将调用单词查询函数返回的 xml 保存/ @8 ]+ B) X0 t7 U' _
    9 v' V5 U' `, G/ @* y
    完全是一个假想,楼主不用当真。
    您需要登录后才可以回帖 登录 | 免费注册

    本版积分规则

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

    GMT+8, 2025-5-8 22:55 , Processed in 0.029226 second(s), 29 queries .

    Powered by Discuz! X3.4

    © 2001-2023 Discuz! Team.

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