Board logo

标题: [其他] ascode 的 encode/decode 算法2 [打印本页]

作者: CrLf    时间: 2013-1-20 05:58     标题: ascode 的 encode/decode 算法2

本帖最后由 CrLf 于 2013-1-21 14:27 编辑

实际上是的ascode 的 encode/decode 算法一贴的改良,改良后不需要在原程序中计算代码段偏移量,但代价是解码部分胖了一半,考虑到有不同需求(新算法通用,旧算法简短),所以保留原贴另辟战场。

闲话不说,来看下效果:
  1. @echo off
  2. @(echo RQPUWP]UZV_BBBB5``PY(E.(E3^)E5^)E:(E^>^)EFSX3CH^<P}pE^< ~r%%ooQRY2AY0@G uG0EGB?
  3. echo KO00O0KNX01K91200JMJKN2OLN9J8NNKO0001KNp01K93030JMJKN2OLKN0001_]XYZN9N810
  4. echo;K409KJ0901LM21LM204242S2N4241T484O4M452N4N45T2043r4Lf24
  5. )>"BATHOME.com"
  6. ::这个 bat 是生成 "BATHOME.com" 的模板,使用时可以直接复制
  7. BATHOME.com
  8. ::运行后正常显示
  9. pause
复制代码
BATHOME.com 的原始代码为
  1. MOV     AH,09
  2. MOV     DX,0109
  3. INT     21
  4. INT     20
  5. 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 图标上执行
代码如下:
  1. @echo off&setlocal enabledelayedexpansion
  2. set compress=true
  3. ::设置是否压缩
  4. if "%~1"=="" echo 无文件&pause&exit/b
  5. set "s1=%~s1"
  6. set list=0123456789JKLMNO
  7. for %%a in (0 1 2 3 4 5 6 7 8 9 A B C D E F) do (
  8. set hb=!list:~0x%%a,1!
  9. for %%b in (0 1 2 3 4 5 6 7 8 9 A B C D E F) do (
  10. set lb=!list:~0x%%b,1!
  11. set "hex%%a%%b=!hb!!lb!"
  12. if %compress%==true (
  13. if 0x%%a%%b geq 0x50 if 0x%%a%%b leq 0x7e set "hex%%a%%b="
  14. for %%c in (5E 7C) do if %%a%%b==%%c set "hex%%a%%b=!hb!!lb!"
  15. )
  16. )
  17. )
  18. ::获取 hex 表
  19. for %%a in ("%~1") do cmd/c exit/b %%~za
  20. if !errorlevel! gtr 0x3030 (
  21. echo 文件太长
  22. pause&exit/b
  23. )
  24. ::判断文件长度
  25. set cx=!=exitcode:~-4!
  26. echo d100l!cx!^&echo q|debug !s1! >"%~n1.bat"
  27. ::获取文件 hex
  28. set m=0
  29. (for /f %%a in ('find /n /v ""^<"%~n1.bat"') do (
  30. set "var="&set /p "var="
  31. if "!var::=!" neq "!var!" (
  32. set "var=!var:-= !"
  33. set "str=!var:~61!"
  34. set "var=!var:~11,48!"
  35. for %%b in (!var!) do (
  36. if defined hex%%b (set "com=!com!!hex%%b!") else set "com=!com!!str:~,1!"
  37. set "str=!str:~1!"
  38. if "!com:~77!" neq "" (
  39. set /a m+=1
  40. set "com!m!=!com!"
  41. set "com="
  42. )
  43. )
  44. )
  45. ))<%~n1.bat"
  46. if defined com set /a "m+=1"&set "com!m!=!com!"
  47. (echo @echo off
  48. echo @(echo RQPUWP]UZV_BBBB5``PY(E.(E3^^^)E5^^^)E:(E^^^>^^^)EFSX3CH^^^<P}pE^^^< ~r%%%%ooQRY2AY0@G uG0EGB?
  49. echo echo KO00O0KNX01K91200JMJKN2OLN9J8NNKO0001KNp01K93030JMJKN2OLKN0001_]XYZN9N810
  50. for /l %%a in (1 1 !m!) do echo echo;!com%%a!
  51. echo ^)^>"%~n1.com"
  52. echo ::这个 bat 是生成 "%~n1.com" 的模板,使用时可以直接复制
  53. echo pause)>"%~n1.bat"
  54. start notepad "%~n1.bat"
复制代码





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