- 论坛徽章:
- 18
|
本帖最后由 bikkuri 于 2014-09-25 14:21 编辑
进一步测试发现最新的awk版本(无进度条版本)在Linux下可以正常运行,但是在busybox下执行的结果还是不正确。
我对您的代码做了以下修改以适应密文文件的数据结构:- **************************************************************
- #!/bin/sh
- # HCT Fast Awk Version (2014-09-20)
- file=$1
- #file=NJS-2A72-01_20120516-1650.dmp
- #file information as below:
- #00000000-0000012F: Padding
- #00000130-00000133: key0 (initial decore_key=xor(key0,0xdeadbeef))
- #00000134-000001FF: Padding
- #00000200- : Encrypted contents
- #last 4 bytes: Length of the encrypted file
- ord="3:2:1:4"
- #decore_key=$(hexdump -ve "4/1 \"%d \" \"\n\"" $file|sed -n 77p|awk -vl=$length 'BEGIN{x=x+0}{for(i=1;i<=l;i++)k[i]=$i*256+k[i-1]}END{printf "%08X",xor(k[4],strtonum("0xdeadbeef")}')
- decore_key=$(hexdump -ve "4/1 \"%d \" \"\n\"" $file|sed -n 77p|awk '{for(i=1;i<=4;i++)k[i]=k[i-1]*256+$i}END{t=xor(k[4],strtonum("0xdeadbeef"));for(i=1;i<6;i++){r[i]=t%256;t=int(t/256)};printf"00";for(i=1;i<6;i++)printf ":%02X",r[6-i]}')
- file_length=$(hexdump -ve "4/1 \"%d \" \"\n\"" $file|tail -n 1|awk '{for(i=1;i<=4;i++)k[i]=k[i-1]*256+$i}END{print k[4]}')
- length=4
- encore(){
- local out=0;
- for char in $(awk -v ord="$ord" -v key="$1" -v l=$length -v ka="0x41C64E6D" -v kb="0x3039" -v kc="0x80000000" 'function mod(p){return (p%256)}function div(p){return int(p/256)}function str_val(str,ret,chars,n,i,k,c){if(str ~ /^0[0-7]*$/){n=length(str);ret=0;for(i=1;i<=n;i++){c=substr(str,i,1);if((k=index("01234567",c))>0)k--;ret=ret*8+k}}else if(str ~ /^0[xX][[:xdigit:]]+/){str=substr(str,3);n=length(str);ret=0;for(i=1;i<=n;i++){c=substr(str,i,1);c=tolower(c);if((k=index("0123456789",c))>0)k--;else if((k=index("abcdef",c))>0) k+=9;ret=ret*16+k}}else if(str ~ /^[-+]?([0-9]+([.][0-9]*([Ee][0-9]+)?)?|([.][0-9]+([Ee][-+]?[0-9]+)?))$/){ret=str+0}else ret="NOT-A-NUMBER";return ret}function hex_ary(p,ary){p=str_val(p);ary="";while(p>0){ary=sprintf("%s:%d",ary,mod(p));p=div(p)}ary=substr(ary,2);return ary}function b_mul(a,b,c,i,j,m,n){m=length(a);n=length(b);for(i=1;i<=m;i++) for(j=1;j<=n;j++){c[i+j-1]+=a[i]*b[j];c[i+j]+=div(c[i+j-1]);c[i+j-1]=mod(c[i+j-1])}for(i=length(c);c[i]<1&&i>1;i--) delete c[i]}BEGIN{split(key,ks,":");split(ord,o,":");for(i=1;i<=l;i++) k[i]=str_val(sprintf("%s%s","0x",ks[length(ks)+1-o[i]]));split(hex_ary(ka),a,":");split(hex_ary(kb),b,":");split(hex_ary(kc),c,":");h=l;la=length(a);lb=length(b);lc=length(c);h=(h<la)?la:h;h=(h<lb)?lb:h;h=(h<lc)?lc:h;ta=str_val(ka);tb=str_val(kb);tc=str_val(kc)}{for(i=1;i<=NF;i++) printf "%02X ",xor(k[i],$i);if(NF<l) exit;tk=0;for(i=l;i>0;i--) tk=tk*256+k[o[i]];delete t;delete d;for(i=1;i<=2*h;i++) t[i]=(i>lb)?0:b[i];for(i=1;i<=l;i++) d[i]=k[o[i]];b_mul(d,a,t);delete p;tp=int((tk*ta+tb)/tc);i=1;while(tp>0){p[i++]=mod(tp);tp=div(tp)};delete q;b_mul(p,c,q);m=length(q);for(i=1;i<=m;i++){t[i]-=q[i];t[i+1]-=(t[i]<0);t[i]=mod(t[i]+256)}for(i=length(t);t[i]<1&&i>1;i--) delete t[i];for(i=1;i<=l;i++) k[o[i]]=t[i];}'); do if [ $out -lt $file_length ]; then printf "\\x$char";let out+=1; else break;fi; done
- }
- hexdump -ve "$length/1 \"%d \" \"\n\"" $file|sed '1,128d;$d'|encore $decore_key > $file.gz
- gzip -cd $file.gz > $file.txt
- **************************************************************
复制代码 然后分别在标准Linux和Busybox上对同一个668K大小的密文文件进行解码:
首先出场的是身手矫健的标准Linux,他仅仅花了50秒就完成解码,并从解码出来的gz文件中解压出了正确的txt原始明文文件。- [box@cloud1:hct]$ date;./hct3.sh N7M3-E-902_ess.ts1;date
- Thu Sep 25 14:01:14 CST 2014
- Thu Sep 25 14:02:04 CST 2014
- [box@cloud1:hct]$ ls -l N7M3-E-902_ess.ts1*
- -rw-r--r-- 1 box cloud1 668592 Jun 19 2013 N7M3-E-902_ess.ts1
- -rw-r--r-- 1 box cloud1 668076 Sep 25 14:02 N7M3-E-902_ess.ts1.gz
- -rw-r--r-- 1 box cloud1 8075252 Sep 25 14:02 N7M3-E-902_ess.ts1.txt
复制代码 然后登场的是身材娇小的Busybox,她面对区区600多K的密文文件竟显得一筹莫展,足足花了10分47秒才完成解码,但是解码的结果是错误的,从解码出来的gz文件无法解压出正确的txt原始明文文件。- root@kbox:/tmp/test# date;./hct3.sh N7M3-E-902_ess.ts1 ;date
- Thu Sep 25 13:48:18 UTC 2014
- Thu Sep 25 13:59:05 UTC 2014
- root@kbox:/tmp/test#
- root@kbox:/tmp/test# l
- -rw-r--r-- 1 root root 668592 Sep 25 13:47 N7M3-E-902_ess.ts1
- -rw-r--r-- 1 root root 668076 Sep 25 13:59 N7M3-E-902_ess.ts1.gz
- -rw-r--r-- 1 root root 0 Sep 25 13:59 N7M3-E-902_ess.ts1.txt
- -rwxr-xr-x 1 root root 2884 Sep 25 13:47 hct3.sh
- root@kbox:/tmp/test#
复制代码 然后我们来对比一下解码出来的gz文件的内容:- [box@cloud1:~]$ head -10 busybox.dump
- 00000000 ad 06 46 5a 68 1e 6f 1d 74 f4 90 2d 70 37 de 5e |..FZh.o.t..-p7.^|
- 00000010 3c ce 04 64 fd b3 4b fb 0f eb 48 3b 8f f9 e5 62 |<..d..K...H;...b|
- 00000020 39 ff e1 3a 76 c3 11 bc 67 26 e0 0e cb 32 1d 28 |9..:v...g&...2.(|
- 00000030 38 a1 e4 40 69 39 49 b4 d6 13 3f 9e 4c 19 94 2d |8..@i9I...?.L..-|
- 00000040 08 f6 45 6a 8a e0 60 1b 38 83 39 7f 01 2a 4d 0a |..Ej..`.8.9..*M.|
- 00000050 45 9c ac 19 fc 70 b2 43 45 23 15 56 05 b2 df bf |E....p.CE#.V....|
- 00000060 4c c8 d9 fe 75 d3 41 93 4f 74 dc 14 74 70 85 6e |L...u.A.Ot..tp.n|
- 00000070 a6 7e 9a fb a9 89 4e db ee 5d 51 84 37 b0 cb 7a |.~....N..]Q.7..z|
- 00000080 45 fe ea 14 4f de ac dc ce 33 fb b7 b2 6e 61 e8 |E...O....3...na.|
- 00000090 94 f0 d5 90 b0 bf b2 7a 92 23 47 6a 06 a2 7a c0 |.......z.#Gj..z.|
- [box@cloud1:~]$ head -10 linux.dump
- 00000000 1f 8b 08 00 00 00 00 00 00 03 ec 5a 6d 6f db 38 |...........Zmo.8|
- 00000010 12 fe 5e 20 ff 81 c0 a1 d7 e4 20 5b af 96 64 01 |..^ ...... [..d.|
- 00000020 b7 07 c7 2f a9 af 76 ec b5 9c f4 0e 28 b0 a0 25 |.../..v.....(..%|
- 00000030 da d1 56 16 05 51 4a ec fd 70 bf fd 86 94 2d 4b |..V..QJ..p....-K|
- 00000040 8a 13 bb 7b c9 61 3f 2c 9b b4 95 38 7c 66 38 7c |...{.a?,...8|f8||
- 00000050 66 f8 a6 61 b4 a4 c9 1a a7 01 8d 10 66 88 2e d1 |f..a........f...|
- 00000060 d7 7e 0f fd f3 ee 16 a9 6d a4 98 4e ab e5 a8 3a |.~......m..N...:|
- 00000070 d2 14 f8 eb 6e de bd f8 70 f1 e1 b5 7a e7 e2 43 |....n...p...z..C|
- 00000080 77 34 44 5d ba 5e e3 c8 77 d0 27 b2 09 52 84 c3 |w4D].^..w.'..R..|
- 00000090 f0 13 6f f9 83 6d d9 03 7d 42 8f 24 61 60 1b b4 |..o..m..}B.$a`..|
复制代码 我们可以看到busybox错得很离谱。从第一个字节就错掉了而且几乎没有一个字节是对的。
是不是有哪个awk的内建函数在busybox上不支持所以导致了这样的结果呢?
回复 55# damcool
|
|