标题: [其他] ascode 的 encode/decode 算法2 [打印本页]
作者: CrLf 时间: 2013-1-20 05:58 标题: ascode 的 encode/decode 算法2
本帖最后由 CrLf 于 2013-1-21 14:27 编辑
实际上是的ascode 的 encode/decode 算法一贴的改良,改良后不需要在原程序中计算代码段偏移量,但代价是解码部分胖了一半,考虑到有不同需求(新算法通用,旧算法简短),所以保留原贴另辟战场。
闲话不说,来看下效果:- @echo off
- @(echo RQPUWP]UZV_BBBB5``PY(E.(E3^)E5^)E:(E^>^)EFSX3CH^<P}pE^< ~r%%ooQRY2AY0@G uG0EGB?
- echo KO00O0KNX01K91200JMJKN2OLN9J8NNKO0001KNp01K93030JMJKN2OLKN0001_]XYZN9N810
- echo;K409KJ0901LM21LM204242S2N4241T484O4M452N4N45T2043r4Lf24
- )>"BATHOME.com"
- ::这个 bat 是生成 "BATHOME.com" 的模板,使用时可以直接复制
-
- BATHOME.com
- ::运行后正常显示
-
- pause
复制代码
BATHOME.com 的原始代码为- MOV AH,09
- MOV DX,0109
- INT 21
- INT 20
- DB 'BBS.BATHOME.NET CrLf'
复制代码
其中的 mov dx,109 在旧算法里需要为解码部分预留 0x60 字节,应写成 mov dx,169,但新算法中不需要作任何修改就能正确执行。
顺便说一句,经测试,对同一个 com 反复 encode 也能正确执行,对运行效率的影响可以忽略不计,当然前提是生成的 com 长度不能超过 0x6060 字节。
作者: CrLf 时间: 2013-1-20 06:11
本帖最后由 CrLf 于 2013-1-20 21:22 编辑
encode 代码,和之前的版本一样,也是拖动原始的 .com 文件到 encode.bat 图标上执行
代码如下:- @echo off&setlocal enabledelayedexpansion
- set compress=true
- ::设置是否压缩
-
- if "%~1"=="" echo 无文件&pause&exit/b
- set "s1=%~s1"
-
- set list=0123456789JKLMNO
- for %%a in (0 1 2 3 4 5 6 7 8 9 A B C D E F) do (
- set hb=!list:~0x%%a,1!
- for %%b in (0 1 2 3 4 5 6 7 8 9 A B C D E F) do (
- set lb=!list:~0x%%b,1!
- set "hex%%a%%b=!hb!!lb!"
- if %compress%==true (
- if 0x%%a%%b geq 0x50 if 0x%%a%%b leq 0x7e set "hex%%a%%b="
- for %%c in (5E 7C) do if %%a%%b==%%c set "hex%%a%%b=!hb!!lb!"
- )
- )
- )
- ::获取 hex 表
-
- for %%a in ("%~1") do cmd/c exit/b %%~za
- if !errorlevel! gtr 0x3030 (
- echo 文件太长
- pause&exit/b
- )
- ::判断文件长度
-
- set cx=!=exitcode:~-4!
- echo d100l!cx!^&echo q|debug !s1! >"%~n1.bat"
- ::获取文件 hex
-
- set m=0
- (for /f %%a in ('find /n /v ""^<"%~n1.bat"') do (
- set "var="&set /p "var="
- if "!var::=!" neq "!var!" (
- set "var=!var:-= !"
- set "str=!var:~61!"
- set "var=!var:~11,48!"
- for %%b in (!var!) do (
- if defined hex%%b (set "com=!com!!hex%%b!") else set "com=!com!!str:~,1!"
- set "str=!str:~1!"
-
- if "!com:~77!" neq "" (
- set /a m+=1
- set "com!m!=!com!"
- set "com="
- )
- )
- )
- ))<%~n1.bat"
-
- if defined com set /a "m+=1"&set "com!m!=!com!"
-
- (echo @echo off
- echo @(echo RQPUWP]UZV_BBBB5``PY(E.(E3^^^)E5^^^)E:(E^^^>^^^)EFSX3CH^^^<P}pE^^^< ~r%%%%ooQRY2AY0@G uG0EGB?
- echo echo KO00O0KNX01K91200JMJKN2OLN9J8NNKO0001KNp01K93030JMJKN2OLKN0001_]XYZN9N810
- for /l %%a in (1 1 !m!) do echo echo;!com%%a!
- echo ^)^>"%~n1.com"
- echo ::这个 bat 是生成 "%~n1.com" 的模板,使用时可以直接复制
- echo pause)>"%~n1.bat"
-
- start notepad "%~n1.bat"
复制代码
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |