Board logo

标题: [文件管理] 批处理版chm文件反编译器V1.3[20100409] [打印本页]

作者: namejm    时间: 2007-12-27 22:41     标题: 批处理版chm文件反编译器V1.3[20100409]


____________________________版主提醒____________________________

  为了避免影响技术讨论、提高看帖的舒适性,请大家不要在此帖下跟
无实质内容的口水帖,特别是纯顶、纯支持、纯感谢、路过之类的帖子,
管理人员将不定期清理此类回帖,请大家多参与讨论少灌水,与人方便,
终将给自己带来方便,谢谢合作。
________________________________________________________________


  你手头是否有几本chm格式的电子书?你是否有过满世界搜索反编译chm软件的痛苦经历?你是否抱怨过这些软件有这样或那样的限制?然而,你是否意识到,就在你的系统里,微软已经为你准备好了小巧而强悍的反编译程序?

  没错,微软已经为各位准备好了这样的软件,它就是各位双击chm文件时系统默认调用的hh.exe!我没有开玩笑,hh.exe这个毫不起眼的家伙,除了是个默默无闻的chm文件阅览器之外,还是个现成的chm文件反编译器!只是这个反编译器的调用参数一直未见微软公布,网上偶尔见到只言片语,也未引起大家的足够重视,因此它一直是大隐隐于市。

  不过,hh.exe要成为我们手里的反编译利器,光靠一条简陋的命令是不够的,它还需要各位的反复测试、耐心打磨。现奉上本人草就的代码,只做了一些主要的功能,尚未做界面的美化,请各位测试。
  1. ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  2. :: chm文件反编译器 V1.3
  3. :: code by namejm 2007.12.27~2010.4.9 bbs.bathome.net CMD@XP
  4. ::
  5. :: 功能:
  6. ::   单个/批量反编译chm文件,并保持资源的原始结构。
  7. :: 使用方式有两种:
  8. ::     ① 把单个或多个文件直接拖放到本程序。
  9. ::     ② 直接双击运行。此时处理的是当前目录下所有以.chm为后缀的文件
  10. :: 执行过程及处理效果:
  11. ::   因为 hh -decompile 语句不能使用引号,所以,先把原始资源释放到
  12. :: 短文件名格式的文件夹中,释放完毕后再改名;
  13. ::   两种执行方式都有简单的容错处理;反编译后的资源放在单独的文件夹
  14. :: 中,此文件夹位于当前目录,并以chm文件名命名。
  15. ::  无法识别不以.chm为后缀名的chm文件,但是可以识别以.chm为后缀名
  16. ::的其他文件(貌似有点拗口^_^)
  17. ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  18. @echo off
  19. set TT=chm文件反编译器 1.3
  20. echo.&echo.&echo     正在反编译CHM文件,请稍候...
  21. cd /d "%~dp0"
  22. :: 以拖动文件到批处理文件上的方式运行批处理时,%cd% 的值将会强制转换为
  23. :: %homepath%,因此,上一条语句非常关键!
  24. set "destination=chm文件反编译结果"
  25. for /f "delims=" %%i in ("%destination%") do set "destination_short=%%~sfi"
  26. md "%destination%" 2>nul
  27. del /a /f "%destination%\伪chm文件列表.txt" 2>nul
  28. if "%~1"=="" goto All
  29. :Some
  30. set str=%*
  31. set "str=%str:"=%"
  32. set "str= %str%"
  33. call set "str=%%str: %~d1=" "%~d1%%"
  34. for %%i in ("%str%") do (
  35.     if not %%i=="" (
  36.         title %TT%-正在处理"%%~nxi"
  37.         if /i not "%%~xi"==".chm" (
  38.             echo.&echo     "%%~nxi"不是chm文件
  39.             echo.&echo     请按任意键继续...
  40.             pause>nul
  41.             cls
  42.             echo.&echo.&echo     正在反编译CHM文件,请稍候...
  43.         ) else (
  44.             rd /q /s "%%~ni" 2>nul
  45.             hh -decompile %destination_short%\%%~sni %%~sfi
  46.             if not exist "%destination%\%%~sni" (
  47.                 echo "%%~nxi">>"%destination%\伪chm文件列表.txt"
  48.             ) else (
  49.                 ren "%destination%\%%~sni" "%%~ni" 2>nul
  50.             )
  51.         )
  52.     )
  53. )
  54. exit
  55. :All
  56. for /f "delims=" %%i in ('dir /a-d /b *.chm 2^>nul') do (
  57.     title %TT%-正在处理"%%~nxi"
  58.     rd /q /s "%destination%\%%~ni" 2>nul
  59.     hh -decompile %destination_short%\%%~sni %%~sfi
  60.     if not exist "%destination%\%%~sni" (
  61.         echo "%%~nxi">>"%destination%\伪chm文件列表.txt"
  62.     ) else (
  63.         ren "%destination%\%%~sni" "%%~ni" 2>nul
  64.     )
  65. )
复制代码
更新历史:
  1. 2010.4.9
  2.   把反编译后的资源统一存放在指定的目录下,不再与cmd文件位于同一
  3. 目录下;
  4.   修改了几处错误:
  5.   1、当把文件拖曳到cmd窗口时,能兼容绝大多数特殊情况,比如等号、
  6. 分号、&;唯有两种情况无法处理:当路径中带&而没有任何空格时;当路径
  7. 中存在^符号时;但是,双击运行时不受任何特殊字符的影响;
  8.   2、当拖曳过来的文件与cmd文件不在同一目录下时也能正确处理;
  9.   此为1.3版;
  10. 2008.3.13
  11.   生成的文件夹与CHM文件名保持一致,无须对特殊字符再做任何替换;
  12. 感谢 随风 的提醒;此为1.2版;
  13. 2008.1.27
  14.   增添了反编译多个指定CHM文件的功能;修正了不兼容文件名中带^的
  15. 错误;修改了部分提示信息;此为1.1版;
  16. 2008.1.8
  17.   不再把文件名中的&强制改为&,但是,文件名中的空格仍然没法不去掉
  18. 2007.12.27
  19.   初始版本1.0发布
复制代码

作者: foxJL    时间: 2007-12-27 23:32

厉害呀..又是一个新发现.
作者: youxi01    时间: 2007-12-29 17:20

说心理话,对hh.exe没研究过...
作者: foxJL    时间: 2007-12-29 18:34

hh d:
可以打开相应的盘,又发现了一种打开磁盘的方法,呵呵..
作者: youxi01    时间: 2008-1-1 18:29

好帖顶起来!!
想读大学那阵,还到处找破解软件,原来幸福就在身边,哈哈
作者: Frank    时间: 2008-1-5 15:41

好强 ...     HH.exe也可以这么用..
作者: mayu2004    时间: 2008-1-15 23:36

强~~~~········
作者: heiing    时间: 2008-2-16 14:29

大开眼界!!

hh d:
可以打开相应的盘,又发现了一种打开磁盘的方法,呵呵..

作者: fmlyht    时间: 2008-2-22 11:02

试了下
十分佩服阁下的才学,不禁要注册进来回个帖顶下
bb另外要向你好好学习,望不伶赐教
作者: 3355827    时间: 2008-2-28 21:58

好东西````哈哈``HH.EXE也可以这样用``太强了``
作者: ahsxgrl    时间: 2008-3-3 12:48

为什么要反编译呢   反编译后有什么效果呢
作者: namejm    时间: 2008-3-12 23:25

  反编译是为了提取其中有用的资源,或是修改其中的错误而重新制作成chm文件。

  反编译后的效果我在代码里已经说明了:单个/批量反编译chm文件,并保持资源的原始结构。
作者: 随风    时间: 2008-3-13 00:05

不懂,反编译就是把chm文件改为txt文件吗?
作者: namejm    时间: 2008-3-13 00:12

  chm文件其实是把各种格式的文件打包而成的,主要是网页文件,打包的过程有点像用WinRAR压缩文件的过程,是把一大堆文件打包成一个文件;而反编译的过程类似WinRAR的解压,反编译的过程并不是更改文件格式的过程,而是把"壳"去掉,从中释放出原始资源。
作者: 随风    时间: 2008-3-13 01:14

原来如此,
但我测试可以使用短文件名啊?!!!

测试方法:
@echo off
for %%a in (*.chm) do (
hh -decompile %%~sna %%~snxa
)
pause





....

[ 本帖最后由 随风 于 2008-3-13 01:20 编辑 ]
作者: namejm    时间: 2008-3-13 13:35

  确实可以用短文件名,是我的代码和表述出了问题。

  我的原意是想让 hh.exe 反编译出来的原始资源放到一个以chm文件名为名的文件夹中。以前尝试了很多次,发现始终不能解决chm文件名中同时带空格、^和&的情况。

  终于想到一个办法,可以顺利解决文件名带特殊字符的情况,居然是那么的简单。现在没时间修改,晚上再发出来。
作者: namejm    时间: 2008-3-13 18:48

  新版本已经发出来,请各位测试。
作者: 学者    时间: 2008-3-21 09:16

怎么把它改成.TXT格式?手机看着方便些
作者: terse    时间: 2008-4-9 00:52

处理文件名为  DOS h^e&lp.chm 时 生成 “伪chm文件列表.txt”  内容 :"DOS h^e&lp.chm"
如文件改为DOS、 h^e&lp.chm可以拖进处理  改为DOSh^e&lp,chm提示"DOShe"不是chm文件
REM:我是拖进去的   直接运行处理没问题
作者: breakan    时间: 2008-4-21 11:18

厉害呀!呵呵!!!!!!!!
作者: sunbuchen    时间: 2008-4-25 00:47

不行,提示
"-decompile"不是chm文件

 请按任意键继续...

"LINUXS~3"不是chm文件

 请按任意键继续...
作者: namejm    时间: 2008-4-25 21:52

原帖由 terse 于 2008-4-9 00:52 发表
处理文件名为  DOS h^e&lp.chm 时 生成 “伪chm文件列表.txt”  内容 :"DOS h^e&lp.chm"
如文件改为DOS、 h^e&lp.chm可以拖进处理  改为DOSh^e&lp,chm提示"DOShe"不是chm文件
REM:我是拖进去的   直接运行处理没 ...


  你的这个问题比较奇怪,更奇怪的是,当我把文件名改成 DOS &.chm 的时候,拖进批处理,居然直接报错退出。看来用参数来接收传入的文件名的时候,是有些问题的,暂时还没有找到解决办法,只能建议文件名尽量不带 & 符号。

原帖由 sunbuchen 于 2008-4-25 00:47 发表
不行,提示
"-decompile"不是chm文件

 请按任意键继续...

"LINUXS~3"不是chm文件

 请按任意键继续...

  很明显,你所列的两个文件都不是chm文件,批处理不报错反倒不正常。不过,如果文件名以负号开始,也会出现伪chm文件的报错信息,很是奇怪。
作者: coffechicken    时间: 2008-4-29 14:12

原帖由 heiing 于 2008-2-16 14:29 发表
大开眼界!!


真的是大开眼界..呵呵。.
作者: wooyan    时间: 2008-5-16 21:35

这么好 的 帖子  ,,怎么我现在才发现
作者: gavincwb    时间: 2008-5-21 04:27

谢谢了

正需要这个呢
作者: kfccmd    时间: 2008-7-27 21:02     标题: 奇怪啊

如果尝试把此代码存储为 hh.cmd 或 hh.bat
你会发现运行不了 汗!

仔细看下原来核心功能来自 hh.exe, 还以为这个批处理真有那么强大,原来就是一个GUI而已 哎!!
作者: kfccmd    时间: 2008-7-27 21:05

原帖由 sunbuchen 于 2008-4-25 00:47 发表
不行,提示
"-decompile"不是chm文件

 请按任意键继续...

"LINUXS~3"不是chm文件

 请按任意键继续...


估计这位仁兄是把这个批处理命名为hh.bat 或者是 hh.cmd 了 哈哈。。。。
作者: 落落的瓶子    时间: 2008-8-5 00:52

感谢LZ写的代码,正好用得上~~
作者: Clark2505    时间: 2008-8-6 10:35

echo.&set /p=    请按任意键继续...

为什么不用 pause ??
作者: Clark2505    时间: 2008-8-6 10:39

原帖由 kfccmd 于 2008-7-27 09:02 PM 发表
如果尝试把此代码存储为 hh.cmd 或 hh.bat
你会发现运行不了 汗!

仔细看下原来核心功能来自 hh.exe, 还以为这个批处理真有那么强大,原来就是一个GUI而已 哎!!


批处理就是对现有命令的应用吗。
整个批处理还是cmd事先运行的呢。
作者: kennywang    时间: 2008-8-9 16:28

呵呵。先看下。不看还得学习下。
作者: jipinshangren    时间: 2008-8-17 17:44

谢谢,很好!能够这样用,也不用以后自己去找了!
作者: jmz573515    时间: 2008-8-31 13:31

好东西,                 收藏了!
作者: jiayiming    时间: 2008-9-12 14:56

学习原理了
作者: youaiwuzhui    时间: 2008-10-2 14:35

楼主细心,值得学习呵
作者: vangur    时间: 2008-10-12 15:20

高手啊`!~!~!~
作者: matlan    时间: 2008-11-3 18:57

hh http://www.baidu.com 打开网页
作者: wanxibing    时间: 2008-12-1 00:52     标题: 真是奇呀,我以前没见过,大开眼界了

希望有好的东东继续让我们见识下
作者: cvwert    时间: 2008-12-13 23:27

其实楼主配上几幅图片那就更有说服力
作者: sppt894    时间: 2008-12-29 15:02

强 就一个字,太另人佩服了
作者: hlzj88    时间: 2009-2-10 20:09

保存为bat,怎么用不了啊,是拖入的
难道我的chm有问题
作者: zhbi001    时间: 2009-3-14 00:54

好多都看不懂,不知道从那里学起,看了很多的新手入门,记了很多的笔记还是有一些看不懂,楼主给一点方向吧。
作者: 52mn998    时间: 2009-3-27 17:41

来看下学习下,好多还是有点不懂
作者: myzwd    时间: 2009-3-31 00:30     标题: 回复 1楼 的帖子

顶。我用的是visual chm挺好用的。不过是盗版的。
我以前还没注意你说的那个文件hh.exe.
没想到系统还自带得有这个东西。我得试试了。系统自带多方变啊。chm可能是微软的新帮助文件格式吧。原来是.hlp,chm让一堆网页文件打包,给人一种整洁的感觉。

    我用了一下比visual chm快。而且反编译很好用。ok

[ 本帖最后由 myzwd 于 2009-3-31 00:42 编辑 ]
作者: hjh700913    时间: 2009-5-8 11:03

 反编译是为了提取其中有用的资源,或是修改其中的错误而重新制作成chm文件。
作者: 5566ljlj    时间: 2009-11-10 17:58

确实挺强悍的。。
作者: libowu    时间: 2009-11-30 00:49

谢谢楼主!
能不能把修改后的资源重新打包回chm文件?
作者: wolfan    时间: 2010-4-6 19:00

怎么源码不全呢?
作者: xiaosheng594    时间: 2010-4-8 09:33

谢谢老师分享,辛苦了
作者: Skybat    时间: 2010-7-1 14:26

好强 学习中····
作者: lifenjoiner    时间: 2010-9-25 23:01     标题: 回复 1楼 的帖子

凑个热闹!
我的很简单:
Dumpchm.bat
  1. @echo off
  2. cd /d "%~dp1"
  3. if "h"%~1=="h" goto hlp
  4. if not exist "%~f1" goto hlp
  5. if exist "%~n1_chm" goto alrt
  6. :dcd
  7. cls
  8. color 09
  9. set cmdstr=%~n1_chm %~nx1
  10. hh -decompile %cmdstr%
  11. echo.
  12. color 02
  13. goto ed
  14. :alrt
  15. echo %~n1_chm   已经存在!
  16. color 0c
  17. echo.
  18. set /p p= [将删除%~n1_chm,请备份您的资料后。。。按Enter]
  19. echo.
  20. color 0d
  21. rd /s /q "%~n1_chm"
  22. goto dcd
  23. :hlp
  24. color 20
  25. echo 用法:
  26. echo [1] 把要提取的文件拖到这个脚本上
  27. echo.
  28. goto ed
  29. :ed
  30. echo 完成~
  31. pause
复制代码
还有,修改后重新打包的hhp文件通用模板:
工程模板.hhp
  1. ;本文件与整理好的.hhc, .hhk文件配套使用
  2. ;*处根据实际情况填写
  3. [Options]
  4. Compatibility = 1.1 Or later
  5. Display compile notes=Yes
  6. Display compile progress=Yes
  7. Default Font = 宋体, 9, 1
  8. Language=0x804 中文(中国)
  9. Title= *
  10. Compiled file= *.chm
  11. Index File = *.hhk
  12. Contents File= *.hhc
  13. Default Topic = *.htm
  14. [Files]
  15. ;dir /b /s *.htm*
复制代码


用法参考http://lifenjoiner.blog.163.com/blog/static/5922714120108248241260/

[ 本帖最后由 lifenjoiner 于 2010-9-25 23:07 编辑 ]
作者: lifenjoiner    时间: 2010-9-25 23:09     标题: 回复 46楼 的帖子

重新打包需要hhc.exe, hha.dll v4.74.8702.0, MS 的,也是命令行。
作者: acaigg    时间: 2011-1-14 19:50

谢谢楼主分享。谢谢 谢谢.
作者: zxb096    时间: 2011-12-14 16:40

原来如此呀,找了好长时间
作者: zxxpt    时间: 2012-4-19 12:30

确实高手,谢谢共享
作者: virus_bat    时间: 2012-9-30 09:02

来瞧一瞧,顶一下
作者: famersoft    时间: 2012-12-21 12:31

收集,正是想要的
作者: zhy    时间: 2013-5-25 00:34

原来hh.exe还可以这样用啊。
作者: 飛雪    时间: 2015-2-27 07:50

幫助文件...

看起來可以把部分英文漢化了
作者: 4378264    时间: 2015-4-26 20:44

微软内置的软件真多
作者: ligyste    时间: 2015-7-13 09:33

牛人,学习了
作者: iibooks    时间: 2015-7-24 07:28

比较精彩!!!!!!!!!!
作者: re168    时间: 2016-7-2 00:17

非常感谢楼主的分享!支持...
作者: eech    时间: 2018-9-2 00:23

搜索了一下我的WIN10,竟然也有HH.EXE!!!




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2