作者:冰狐浪子 来自:http://www.icyfoxlovelace.com/
: t* J I! k+ X$ g9 a/ s3 Z" Z一网友给我一加密网页“太乙奇門六壬排盤程式”,其中脚本采用微软工具进行了加[VBScript.Encode],说是用解密软件不能解密,我看后发现页面编码是UTF-8,改为ANSI后,使用scrdec顺利解密,看来编码问题有的时候满有用的,对于解密失败的朋友可以尝试看下编码格式,因为现在的解码工具好像是针对ANSI编码的!
) b( w- k/ T1 X" E& O: y附scrdec1.3源代码[c代码]:
2 G& p# _; A9 u3 @) I& l# x/**********************************************************************/ /* scrdec.c - Decoder for Microsoft Script Encoder */ /* Version 1.3 */ /* */+ w2 c: S. D2 G /* COPYRIGHT: */ /* (c)2000/2001 MrBrownstone, _blank>mrbrownstone@virtualconspiracy.com */ /* Some changes by Joe Steele to correct minor stuff */ /* */6 b$ J% R' v9 ~5 E1 M9 a* c) h /* DISCLAIMER: */9 M( q8 ~% D- T% o- A /* This program is for demonstrative and educational purposes only. */ /* Use of this program is at your own risk. The author cannot be held */0 v# l- @; b, v. ^: u" I /* responsible if any laws are broken by use of this program. */ /* */ /* If you use or distribute this code, this message should be held */; g% j! E6 m+ {7 G# W$ o /* intact. Also, any program based upon this code should display the */0 _5 S) J0 ^ m( i/ \ /* copyright message and the disclaimer. */ T% p2 B" l/ ?/ P1 n6 i1 d /**********************************************************************/
#include ! Q4 k1 s- ?) v$ [& R' [ #include 3 L% ~# E _9 K5 G' q0 Z #include
#define LEN_OUTBUF 64 #define LEN_INBUF 1024
#define STATE_INIT_COPY 100( h5 d& Q e$ U9 ?: R, p #define STATE_COPY_INPUT 101( q0 k! N5 Y+ B, d0 M4 p #define STATE_SKIP_ML 102 #define STATE_CHECKSUM 103 #define STATE_READLEN 104 #define STATE_DECODE 105 #define STATE_UNESCAPE 1067 S4 ~$ w% o2 h% q# D. J5 B #define STATE_FLUSHING 107 #define STATE_DBCS 108 #define STATE_INIT_READLEN 109
. s4 K5 e& ]# u: J$ D7 u+ A3 Wunsigned char rawData[292] = { 0x64,0x37,0x69, 0x50,0x7E,0x2C, 0x22,0x5A,0x65, 0x4A,0x45,0x72, 0x61,0x3A,0x5B, 0x5E,0x79,0x66, 0x5D,0x59,0x75, 0x5B,0x27,0x4C, + X9 X2 G/ B# a$ i 0x42,0x76,0x45, 0x60,0x63,0x76, 0x23,0x62,0x2A, 0x65,0x4D,0x43, 0x5F,0x51,0x33, 0x7E,0x53,0x42, 0x4F,0x52,0x20, 0x52,0x20,0x63, 0x7A,0x26,0x4A, 0x21,0x54,0x5A, 0x46,0x71,0x38, 0x20,0x2B,0x79, : i8 W3 A) o- F' c, t2 L0 i 0x26,0x66,0x32, 0x63,0x2A,0x57, 0x2A,0x58,0x6C, 0x76,0x7F,0x2B, 0x47,0x7B,0x46, 0x25,0x30,0x52, 0x2C,0x31,0x4F, 0x29,0x6C,0x3D, ! Z2 R* O9 e- A0 F2 O2 |1 j 0x69,0x49,0x70, 0x3F,0x3F,0x3F, 0x27,0x78,0x7B, 0x3F,0x3F,0x3F, * M& A+ D6 k% ]* `" z 0x67,0x5F,0x51, 0x3F,0x3F,0x3F, 0x62,0x29,0x7A, 0x41,0x24,0x7E, 0x5A,0x2F,0x3B, 0x66,0x39,0x47, 0x32,0x33,0x41, 0x73,0x6F,0x77, 0x4D,0x21,0x56, 0x43,0x75,0x5F, 0x71,0x28,0x26, 0x39,0x42,0x78, 0x7C,0x46,0x6E, 0x53,0x4A,0x64, 0x48,0x5C,0x74, 0x31,0x48,0x67, 8 l$ |; H; @1 T1 E! U- Z4 w 0x72,0x36,0x7D, 0x6E,0x4B,0x68, 0x70,0x7D,0x35, 0x49,0x5D,0x22, 0x3F,0x6A,0x55, 0x4B,0x50,0x3A, 0x6A,0x69,0x60, 0x2E,0x23,0x6A, 2 a( R: t5 B( T: J3 f 0x7F,0x09,0x71, 0x28,0x70,0x6F, 0x35,0x65,0x49, 0x7D,0x74,0x5C, ' M0 f z' _9 |2 `, Q 0x24,0x2C,0x5D, 0x2D,0x77,0x27, 0x54,0x44,0x59, 0x37,0x3F,0x25, 2 d/ p( J' [/ f3 y/ | 0x7B,0x6D,0x7C, 0x3D,0x7C,0x23, 0x6C,0x43,0x6D, 0x34,0x38,0x28, * `# E2 X: W5 F0 s6 E- |% I 0x6D,0x5E,0x31, 0x4E,0x5B,0x39, 0x2B,0x6E,0x7F, 0x30,0x57,0x36, ; |" M+ n `( _4 w" i% X 0x6F,0x4C,0x54, 0x74,0x34,0x34, 0x6B,0x72,0x62, 0x4C,0x25,0x4E, 0x33,0x56,0x30, 0x56,0x73,0x5E, 0x3A,0x68,0x73, 0x78,0x55,0x09, 0x57,0x47,0x4B, 0x77,0x32,0x61, 0x3B,0x35,0x24, 0x44,0x2E,0x4D, 0x2F,0x64,0x6B, 0x59,0x4F,0x44, 0x45,0x3B,0x21, 0x5C,0x2D,0x37, 0x68,0x41,0x53, 0x36,0x61,0x58, 0x58,0x7A,0x48, 0x79,0x22,0x2E, $ b- I& C1 s ]9 x( b$ c 0x09,0x60,0x50, 0x75,0x6B,0x2D, 0x38,0x4E,0x29, 0x55,0x3D,0x3F,) L, q( \5 d- u2 q 0x51,0x67,0x2f( u% g2 Z( M$ f0 K/ }# j } ;
% U7 |% N9 h8 pconst unsigned char pick_encoding[64] = { " m, F% @/ _2 a* J 1, 2, 0, 1, 2, 0, 2, 0, 0, 2, 0, 2, 1, 0, 2, 0, 1, 0, 2, 0, 1, 1, 2, 0, 0, 2, 1, 0, 2, 0, 0, 2, ) T) y+ U5 O" K 1, 1, 0, 2, 0, 2, 0, 1, 0, 1, 1, 2, 0, 1, 0, 2, 1, 0, 2, 0, 1, 1, 2, 0, 0, 1, 1, 2, 0, 1, 0, 2, h+ t: X0 ?' I" _; V };
, G9 S% ?# `5 N, c0 runsigned char transformed[3][128];: y6 C5 C$ V: b- ]) g/ X int digits[0x7b];
6 a3 O4 ^$ f Junsigned char unescape (unsigned char c)/ Z8 b- i& a1 l7 ]! c { * Y* H( x. Z+ D: p, J* }; ^" S static unsigned char escapes[] = "#&!*$";3 p- H) H S# t5 v) L; J+ I# {. t static unsigned char escaped[] = "\r\n<>@"; int i=0;
2 r1 v) u; v/ P( qif (c > 127)9 H( _ j4 D: Z- @. A' L return c; while (escapes)! @9 ]1 d' ` |/ U { if (escapes == c)1 D' d2 L. [: H0 u5 B( q return escaped;3 Q6 E! J9 v. r* u2 `* D" W i++; } return '?';- o& N% t6 w+ [0 e2 X1 y: K. u7 R }
void maketrans (void) { : t2 q) g+ q1 E& t6 l! Z int i, j;
for (i=31; i<=127; i++) for (j=0; j<3; j++) % u0 @2 s6 G: T/ y" V6 a0 c5 |* X transformed[j][rawData[(i-31)*3 + j]] = (i==31) ? 9 : i;' _+ j, d3 d5 U' o }
void makedigits (void)9 e6 i! }7 x! I4 {1 E+ \- Q1 ^ { & e8 \7 R$ @6 |8 n. M H int i;
for (i=0; i<26; i++)1 F$ i( T0 n' \9 u, a1 j& ]* ? { digits['A'+i] = i; digits['a'+i] = i+26; } for (i=0; i<10; i++)- z9 D. U1 k% }* Y5 c6 x7 { digits['0'+i] = i+52; digits[0x2b] = 62; digits[0x2f] = 63; }
unsigned long int decodeBase64 (unsigned char *p) { : ^/ z1 V8 F1 h1 y' ^* T9 T unsigned long int val = 0;
val += (digits[p[0]] << 2);, }( h" V# @2 F9 Y val += (digits[p[1]] >> 4); val += (digits[p[1]] & 0xf) << 12;$ e/ B: U! ^/ Y8 b val += ((digits[p[2]] >> 2) << 8); val += ((digits[p[2]] & 0x3) << 22);# w/ k4 c' |7 O5 m( ^3 r- s! \ L val += (digits[p[3]] << 16); val += ((digits[p[4]] << 2) << 24);$ J6 `; A$ P; N val += ((digits[p[5]] >> 4) << 24);
/* 543210 543210 543210 543210 543210 543210
765432 # h6 G q9 v: l H2 [ 10 ba98 fedc 76 543210 fedcba 98---- |- LSB -||- -||- -| |- MSB -| */5 Y3 B' Y8 a' d% O& Z: o1 E return val; }
int isLeadByte (unsigned int cp, unsigned char ucByte) { 1 z9 K* h/ r& {5 |4 A: H% { /* Code page 932 - Japanese Shift-JIS - 0x81-0x9f $ m9 z7 \6 u3 c, G: L 0xe0-0xfc % e0 B! S- e Q4 n4 A0 } 936 - Simplified Chinese GBK - 0xa1-0xfe s& e8 w; z% n4 y- ? x 949 - Korean Wansung - 0x81-0xfe 950 - Traditional Chinese Big5 - 0x81-0xfe % {3 j# x- ~! c( ?8 F 1361 - Korean Johab - 0x84-0xd3 0xd9-0xde( o! Q$ T5 @1 X! W: K6 [ U5 B 0xe0-0xf9 */0 T5 N. `1 Y& f% I" R switch (cp): u/ ?2 v5 [4 m& @8 K { case 932: if ((ucByte > 0x80) && (ucByte < 0xa0)) return 1;1 m" \2 }" p" K( s if ((ucByte > 0xdf) && (ucByte < 0xfd)) return 1;, W' b" Q/ S9 \% ~; l2 ~! w else return 0;5 o" t6 Y# q' {9 B8 p. H' F; R case 936: if ((ucByte > 0xa0) && (ucByte < 0xff)) return 1; else return 0;: `( W" P( u- z: U4 p b case 949: case 950: if ((ucByte > 0x80) && (ucByte < 0xff)) return 1;3 q6 n" H6 T9 a else return 0; case 1361: if ((ucByte > 0x83) && (ucByte < 0xd4)) return 1;3 o3 d1 Y1 ?2 l1 d1 ? ] if ((ucByte > 0xd8) && (ucByte < 0xdf)) return 1;" k2 w9 p- M5 [ `% ~) F3 {0 A P% u if ((ucByte > 0xdf) && (ucByte < 0xfa)) return 1; else return 0; default: return 0;" ]# q% _+ Q" J# m* X }
}
' ], u' m" f6 q: \# }9 ^ int ScriptDecoder (unsigned char *inname, unsigned char *outname, unsigned int cp) { unsigned char inbuf[LEN_INBUF+1]; unsigned char outbuf[LEN_OUTBUF+1];% ^4 }3 n) o& _5 F5 A- }9 C* i unsigned char c, lenbuf[7], csbuf[7]; unsigned char marker[] = "#@~^"; int nextstate, state = 0; int i, j, k, m, ml = 0; unsigned long int csum = 0, len = 0; FILE *infile, *outfile;
infile = fopen (inname, "rb"); outfile = fopen (outname, "wb"); if (!infile || !outfile) { printf ("Error opening file!\n"); return 10; } 2 j! `$ G! R& m" e) i4 `% @" ? maketrans();! G8 j2 ?* k6 |/ b$ q" M/ A7 t makedigits();3 h, Z/ v$ y8 W+ X) F j+ k& _ memset (inbuf, 0, sizeof (inbuf)); memset (outbuf, 0, sizeof (outbuf)); memset (lenbuf, 0, sizeof (lenbuf));. E& ]1 \$ |# H . D! d; V/ i" \& q3 g- f) K state = STATE_INIT_COPY; i = 0;, j! M7 h; C, s7 U H1 r! o j = 0;
while (state) { 8 x! F& T' }' k7 b2 A) x+ y% \ if (inbuf == 0) { $ T. u4 h- s: I: W if (feof (infile)) break;
memset (inbuf, 0, sizeof (inbuf));# `* E8 V, l' |* o6 x fgets (inbuf, LEN_INBUF, infile);* A- q! p1 I6 K* ?6 k$ p i = 0;2 |* h* `" V* {( O continue;* W; U ^ h- e }
if (j == LEN_OUTBUF)5 N% S" N1 G& n. L" [/ d9 H, o { 5 E3 A3 @8 ^# [6 Z( C& L) r" U fwrite (outbuf, sizeof(char), j, outfile); j = 0; }
switch (state) i# @3 m0 C6 B$ f, _ { case STATE_INIT_COPY: 8 E/ R$ A6 s" X# k$ x* } ml = strlen (marker); m = 0; state = STATE_COPY_INPUT; break;
}. M( x) `8 ]6 s/ z/ B if (m == ml) state = STATE_INIT_READLEN; break;
case STATE_FLUSHING:1 K4 b( J' f. x* @# j, @5 t outbuf[j++] = marker[k++];" ?6 |6 _4 m V4 K2 B3 }6 U m--; C' T' |: i" q if (m==0) state = STATE_COPY_INPUT; break;; A! V0 U8 x8 P k& }/ [ case STATE_SKIP_ML: 1 z6 e! b, A0 ~) z i++; if (!(--ml))# I1 t0 b5 k3 {, a- ^' J2 h state = nextstate;2 y/ r9 k9 x; R5 f) e$ c9 n break;
case STATE_INIT_READLEN: + Q! ]/ i% S! W. ~! v ml = 6;/ Y1 A$ W9 R5 j state = STATE_READLEN;& ?" E4 C# Q' H3 I3 d) q break;
case STATE_READLEN: lenbuf[6-ml] = inbuf[i++]; if (!(--ml)) { $ l1 z* a2 [" W4 }1 F: B& N len = decodeBase64 (lenbuf); m = 0;- a0 R$ Q2 m- u& e8 o ml = 2;0 ^. d1 {1 O- A( O3 @ state = STATE_SKIP_ML;7 K2 d( W! P* Z3 q nextstate = STATE_DECODE;. T( }& \4 w, \7 k$ g }( J8 Q7 t) g9 s break;
case STATE_DECODE: if (!len)3 E5 |/ t& M" _1 y2 F, V0 Z { ml = 6; state = STATE_CHECKSUM; break; }) O: G2 V: X5 j, z1 [7 Y: L if (inbuf == _blank>'@') state = STATE_UNESCAPE; else { if (inbuf < 0x80) { outbuf[j++] = c = transformed[pick_encoding[m%64]][inbuf]; csum += c;" M! ^& Y! W/ w m++;# k' M6 B3 F4 V# }2 N) ~9 |6 b } else { outbuf[j++] = inbuf;4 ]+ m4 P( r! v$ p7 V if ((cp) && (isLeadByte (cp,inbuf)))7 K* I. R4 [2 H. L% [9 M state = STATE_DBCS;& G) P6 H, G3 t' q' \ ^ }
}" L Z, I9 x: i9 A, K$ B i++; len--; break;
case STATE_DBCS: outbuf[j++] = inbuf[i++]; state = STATE_DECODE; break;+ J+ T. Z) D" Q: M8 ~* {3 i/ s* t+ j - R7 X4 ~5 T' a, u5 t, ? case STATE_UNESCAPE: + f; p0 a5 ~# H$ @' E outbuf[j++] = c = unescape (inbuf[i++]);6 P9 N+ \% Q: P+ P+ K csum += c;' C1 ^0 [# x- \ t! Z- S len--; m++; state = STATE_DECODE; break;
case STATE_CHECKSUM: 4 s$ g1 F1 i9 B" d csbuf[6-ml] = inbuf[i++]; if (!(--ml))* {9 K, e3 | r5 T { csum -= decodeBase64 (csbuf); if (csum)9 I4 `( E: a* w0 K9 |. l { //printf ("Error - Incorrect checksum! (%lu)\n", csum);' _8 y6 X6 C T U //csum=0; 此处注释掉好点,不然好多时候不能解密 嘿嘿 [icyfox]: p4 m) V; a# M# d5 }9 C' g } m = 0;% J+ ~" s- u2 x" v ml = 6; state = STATE_SKIP_ML;" c$ b' T3 R+ t% Y# z7 H nextstate = STATE_INIT_COPY;& q+ a2 `; O1 w4 f }% L; M4 I# I- x* P0 F. | break;
default: printf ("Invalid state: %d\n", state); break; } } 8 S$ h7 [ r$ l. b& L p fwrite (outbuf, sizeof (char), j, outfile); fclose (infile); fclose (outfile); return 0; }
int main (int argc, char **argv) { int cp = 0;
if (argc < 3)2 _! G- R) g! h( C { ; n5 B2 T$ @: b printf ("Decoder for Microsoft Script Encoder v1.3\n": `/ y3 [; B# l$ T/ ? "(c)2000/2001 MrBrownstone, _blank>mrbrownstone@virtualconspiracy.com\n"' Z2 O" Z; {% W' T1 H "Home page: _blank>http://www.virtualconspiracy.com/scrdec.html\n\n" "Usage: scrdec13 [codepage]\n\n" "Code pages can be 932 - Japanese\n" " 936 - Chinese (Simplified)\n"" |/ ~2 A7 c& d " 950 - Chinese (Traditional)\n"" u9 \ Y! L$ K " 949 - Korean (Wansung)\n"! [4 _ k+ Z% R " 1361 - Korean (Johab)\n", e9 b. l0 ^/ o5 ^# i "Any other code pages don't need to be specified.\n");* G# k2 |4 N% c; M" X- {% D# {$ C return 10; }
if (argc > 3) cp = atoi (argv[3]);& N, @2 K2 x/ Y5 I1 } return ScriptDecoder (argv[1], argv[2], cp);6 }& S# {7 u* Y( X }
| 欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) | Powered by Discuz! X2.5 |