批处理之家's Archiver

namejm 发表于 2007-12-27 22:41

批处理版chm文件反编译器V1.3[20100409]

[color=red]
____________________________版主提醒____________________________

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

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

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

  不过,hh.exe要成为我们手里的反编译利器,光靠一条简陋的命令是不够的,它还需要各位的反复测试、耐心打磨。现奉上本人草就的代码,只做了一些主要的功能,尚未做界面的美化,请各位测试。[code]::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: chm文件反编译器 V1.3
:: code by namejm 2007.12.27~2010.4.9 bbs.bathome.net CMD@XP
::
:: 功能:
::   单个/批量反编译chm文件,并保持资源的原始结构。
:: 使用方式有两种:
::     ① 把单个或多个文件直接拖放到本程序。
::     ② 直接双击运行。此时处理的是当前目录下所有以.chm为后缀的文件
:: 执行过程及处理效果:
::   因为 hh -decompile 语句不能使用引号,所以,先把原始资源释放到
:: 短文件名格式的文件夹中,释放完毕后再改名;
::   两种执行方式都有简单的容错处理;反编译后的资源放在单独的文件夹
:: 中,此文件夹位于当前目录,并以chm文件名命名。
::  无法识别不以.chm为后缀名的chm文件,但是可以识别以.chm为后缀名
::的其他文件(貌似有点拗口^_^)
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
@echo off
set TT=chm文件反编译器 1.3
echo.&echo.&echo     正在反编译CHM文件,请稍候...
cd /d "%~dp0"
:: 以拖动文件到批处理文件上的方式运行批处理时,%cd% 的值将会强制转换为
:: %homepath%,因此,上一条语句非常关键!
set "destination=chm文件反编译结果"
for /f "delims=" %%i in ("%destination%") do set "destination_short=%%~sfi"
md "%destination%" 2>nul
del /a /f "%destination%\伪chm文件列表.txt" 2>nul
if "%~1"=="" goto All

:Some
set str=%*
set "str=%str:"=%"
set "str= %str%"
call set "str=%%str: %~d1=" "%~d1%%"
for %%i in ("%str%") do (
    if not %%i=="" (
        title %TT%-正在处理"%%~nxi"
        if /i not "%%~xi"==".chm" (
            echo.&echo     "%%~nxi"不是chm文件
            echo.&echo     请按任意键继续...
            pause>nul
            cls
            echo.&echo.&echo     正在反编译CHM文件,请稍候...
        ) else (
            rd /q /s "%%~ni" 2>nul
            hh -decompile %destination_short%\%%~sni %%~sfi
            if not exist "%destination%\%%~sni" (
                echo "%%~nxi">>"%destination%\伪chm文件列表.txt"
            ) else (
                ren "%destination%\%%~sni" "%%~ni" 2>nul
            )
        )
    )
)
exit

:All
for /f "delims=" %%i in ('dir /a-d /b *.chm 2^>nul') do (
    title %TT%-正在处理"%%~nxi"
    rd /q /s "%destination%\%%~ni" 2>nul
    hh -decompile %destination_short%\%%~sni %%~sfi
    if not exist "%destination%\%%~sni" (
        echo "%%~nxi">>"%destination%\伪chm文件列表.txt"
    ) else (
        ren "%destination%\%%~sni" "%%~ni" 2>nul
    )
)[/code]更新历史:[code]2010.4.9
  把反编译后的资源统一存放在指定的目录下,不再与cmd文件位于同一
目录下;
  修改了几处错误:
  1、当把文件拖曳到cmd窗口时,能兼容绝大多数特殊情况,比如等号、
分号、&;唯有两种情况无法处理:当路径中带&而没有任何空格时;当路径
中存在^符号时;但是,双击运行时不受任何特殊字符的影响;
  2、当拖曳过来的文件与cmd文件不在同一目录下时也能正确处理;
  此为1.3版;
2008.3.13
  生成的文件夹与CHM文件名保持一致,无须对特殊字符再做任何替换;
感谢 随风 的提醒;此为1.2版;
2008.1.27
  增添了反编译多个指定CHM文件的功能;修正了不兼容文件名中带^的
错误;修改了部分提示信息;此为1.1版;
2008.1.8
  不再把文件名中的&强制改为&,但是,文件名中的空格仍然没法不去掉
2007.12.27
  初始版本1.0发布[/code]

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

大开眼界!!

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

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





....

[[i] 本帖最后由 随风 于 2008-3-13 01:20 编辑 [/i]]

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

[quote]原帖由 [i]terse[/i] 于 2008-4-9 00:52 发表 [url=http://bbs.bathome.net/redirect.php?goto=findpost&pid=3641&ptid=413][img]http://bbs.bathome.net/images/common/back.gif[/img][/url]
处理文件名为  DOS h^e&lp.chm 时 生成 “伪chm文件列表.txt”  内容 :"DOS h^e&lp.chm"
如文件改为DOS、 h^e&lp.chm可以拖进处理  改为DOSh^e&lp,chm提示"DOShe"不是chm文件
REM:我是拖进去的   直接运行处理没 ... [/quote]

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

[quote]原帖由 [i]sunbuchen[/i] 于 2008-4-25 00:47 发表 [url=http://bbs.bathome.net/redirect.php?goto=findpost&pid=4168&ptid=413][img]http://bbs.bathome.net/images/common/back.gif[/img][/url]
不行,提示
"-decompile"不是chm文件

 请按任意键继续...

"LINUXS~3"不是chm文件

 请按任意键继续... [/quote]
  很明显,你所列的两个文件都不是chm文件,批处理不报错反倒不正常。不过,如果文件名以负号开始,也会出现伪chm文件的报错信息,很是奇怪。

coffechicken 发表于 2008-4-29 14:12

[quote]原帖由 [i]heiing[/i] 于 2008-2-16 14:29 发表 [url=http://bbs.bathome.net/redirect.php?goto=findpost&pid=2346&ptid=413][img]http://bbs.bathome.net/images/common/back.gif[/img][/url]
大开眼界!!

[/quote]

真的是大开眼界..呵呵。.

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

[quote]原帖由 [i]sunbuchen[/i] 于 2008-4-25 00:47 发表 [url=http://bbs.bathome.net/redirect.php?goto=findpost&pid=4168&ptid=413][img]http://bbs.bathome.net/images/common/back.gif[/img][/url]
不行,提示
"-decompile"不是chm文件

 请按任意键继续...

"LINUXS~3"不是chm文件

 请按任意键继续... [/quote]

估计这位仁兄是把这个批处理命名为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

[quote]原帖由 [i]kfccmd[/i] 于 2008-7-27 09:02 PM 发表 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=5985&ptid=413][img]http://www.bathome.net/images/common/back.gif[/img][/url]
如果尝试把此代码存储为 hh.cmd 或 hh.bat
你会发现运行不了 汗!

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

批处理就是对现有命令的应用吗。
整个批处理还是cmd事先运行的呢。

页: [1] 2 3

Powered by Discuz! Archiver 7.2  © 2001-2009 Comsenz Inc.