作者:冰狐浪子 来自:http://www.icyfoxlovelace.com/
一网友给我一加密网页“太乙奇門六壬排盤程式”,其中脚本采用微软工具进行了加[VBScript.Encode],说是用解密软件不能解密,我看后发现页面编码是UTF-8,改为ANSI后,使用scrdec顺利解密,看来编码问题有的时候满有用的,对于解密失败的朋友可以尝试看下编码格式,因为现在的解码工具好像是针对ANSI编码的!
6 O3 _/ F+ r U( z# }附scrdec1.3源代码[c代码]:
/ [ n0 G2 K6 \- w4 V/**********************************************************************/$ ?9 G( s+ ~6 h' H6 q /* scrdec.c - Decoder for Microsoft Script Encoder */9 E' q, C `6 J: p5 W /* Version 1.3 */ /* */6 w0 u/ T) }" | /* COPYRIGHT: */ /* (c)2000/2001 MrBrownstone, _blank>mrbrownstone@virtualconspiracy.com */ /* Some changes by Joe Steele to correct minor stuff */7 L# G$ H6 z8 ^5 S4 e4 D /* */3 Y* @- D! f2 `5 H6 F1 U /* DISCLAIMER: */ /* This program is for demonstrative and educational purposes only. */ /* Use of this program is at your own risk. The author cannot be held */, U8 c/ e% o8 e$ q- K' b /* responsible if any laws are broken by use of this program. */ /* */, {2 P0 P! o" v+ d9 f" j/ w3 y /* If you use or distribute this code, this message should be held */: ^) U& }; ~/ ` /* intact. Also, any program based upon this code should display the */ /* copyright message and the disclaimer. */ /**********************************************************************/
# r4 P! H& l" M- D- @, I#include #include $ _7 t; B8 U- s% G# ? #include
$ n- R$ f+ V/ L#define LEN_OUTBUF 64 #define LEN_INBUF 1024
$ f* ^- @; |- Q4 Y! ]3 g f#define STATE_INIT_COPY 100 #define STATE_COPY_INPUT 101 #define STATE_SKIP_ML 102 #define STATE_CHECKSUM 103 #define STATE_READLEN 104! @( E5 m' K: ^0 ? #define STATE_DECODE 105 #define STATE_UNESCAPE 106 F2 g/ {5 W! P #define STATE_FLUSHING 107 #define STATE_DBCS 108 #define STATE_INIT_READLEN 109
/ ?8 ~$ b( _; R, _2 @ M4 Aunsigned char rawData[292] = { % u% C. i% [7 K3 g2 F8 e. n4 M 0x64,0x37,0x69, 0x50,0x7E,0x2C, 0x22,0x5A,0x65, 0x4A,0x45,0x72, / V( G. L6 M, P( Y 0x61,0x3A,0x5B, 0x5E,0x79,0x66, 0x5D,0x59,0x75, 0x5B,0x27,0x4C, 0x42,0x76,0x45, 0x60,0x63,0x76, 0x23,0x62,0x2A, 0x65,0x4D,0x43, ' o8 Q+ S1 g. M$ r 0x5F,0x51,0x33, 0x7E,0x53,0x42, 0x4F,0x52,0x20, 0x52,0x20,0x63, 0x7A,0x26,0x4A, 0x21,0x54,0x5A, 0x46,0x71,0x38, 0x20,0x2B,0x79, 0x26,0x66,0x32, 0x63,0x2A,0x57, 0x2A,0x58,0x6C, 0x76,0x7F,0x2B, 9 W# b$ z7 R) _6 V& p 0x47,0x7B,0x46, 0x25,0x30,0x52, 0x2C,0x31,0x4F, 0x29,0x6C,0x3D, : [) u7 \- B; b, r0 ~& [# Z3 T 0x69,0x49,0x70, 0x3F,0x3F,0x3F, 0x27,0x78,0x7B, 0x3F,0x3F,0x3F, 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, 5 f5 S9 H/ h( O$ N$ x 0x7C,0x46,0x6E, 0x53,0x4A,0x64, 0x48,0x5C,0x74, 0x31,0x48,0x67, 6 S6 A9 p2 a. j* O* ]3 ?6 A( U 0x72,0x36,0x7D, 0x6E,0x4B,0x68, 0x70,0x7D,0x35, 0x49,0x5D,0x22, 0x3F,0x6A,0x55, 0x4B,0x50,0x3A, 0x6A,0x69,0x60, 0x2E,0x23,0x6A, 0x7F,0x09,0x71, 0x28,0x70,0x6F, 0x35,0x65,0x49, 0x7D,0x74,0x5C, : e3 L! z- M: W- ^) S3 V 0x24,0x2C,0x5D, 0x2D,0x77,0x27, 0x54,0x44,0x59, 0x37,0x3F,0x25, 0x7B,0x6D,0x7C, 0x3D,0x7C,0x23, 0x6C,0x43,0x6D, 0x34,0x38,0x28, 0x6D,0x5E,0x31, 0x4E,0x5B,0x39, 0x2B,0x6E,0x7F, 0x30,0x57,0x36, 5 O Q- k) l' S! D) i) N' v% e! F! } 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, + T A* _ H0 t' ]) E" r) Q" X 0x68,0x41,0x53, 0x36,0x61,0x58, 0x58,0x7A,0x48, 0x79,0x22,0x2E, 0x09,0x60,0x50, 0x75,0x6B,0x2D, 0x38,0x4E,0x29, 0x55,0x3D,0x3F,# x- o$ y; N% Z: o3 W$ w" X 0x51,0x67,0x2f- h* c: p% h' A$ c0 G } ;
const unsigned char pick_encoding[64] = { 1, 2, 0, 1, 2, 0, 2, 0, 0, 2, 0, 2, 1, 0, 2, 0, 9 ~* F) ?0 s, ^+ W* w P- G+ S+ r6 X 1, 0, 2, 0, 1, 1, 2, 0, 0, 2, 1, 0, 2, 0, 0, 2, 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' t ]" ^3 x. x* Y( \' ?6 E+ r };
unsigned char transformed[3][128];! T6 ~7 x8 K9 h6 g$ m7 \0 c int digits[0x7b];
unsigned char unescape (unsigned char c) { , R; ]* K0 k0 N: ~/ @ static unsigned char escapes[] = "#&!*$"; static unsigned char escaped[] = "\r\n<>@";& F; s6 k% f# y( W0 y" b int i=0;
if (c > 127)3 N4 s8 n1 M& ?1 v return c; while (escapes) { if (escapes == c) return escaped; i++;- m* s; A2 U2 @+ s0 I } 8 k0 m* @. M: W) I return '?'; }
void maketrans (void)6 h' E; r% ?8 k& g { int i, j;
6 G' f0 a! }: Kfor (i=31; i<=127; i++) for (j=0; j<3; j++) $ `! u( x% R* [8 } transformed[j][rawData[(i-31)*3 + j]] = (i==31) ? 9 : i; }
void makedigits (void) S' K+ Y& C7 m { 9 s1 Z V I1 A- U% z8 p4 a$ a; G int i;
for (i=0; i<26; i++)8 |' k/ ~9 L! G3 D, E1 P { 0 x! H1 U% P! n2 r digits['A'+i] = i; digits['a'+i] = i+26; } for (i=0; i<10; i++)6 O" Z( Z% Q/ R# Y digits['0'+i] = i+52;2 P/ h$ T" C) M v digits[0x2b] = 62; digits[0x2f] = 63;/ w) Z- m; Y- Z' h }
unsigned long int decodeBase64 (unsigned char *p); J3 m- V [5 |" d+ g( |! } { unsigned long int val = 0;
val += (digits[p[0]] << 2);; r! ?4 K* ~5 ^+ A5 } val += (digits[p[1]] >> 4); val += (digits[p[1]] & 0xf) << 12;* F+ A1 l: t4 i$ `/ w val += ((digits[p[2]] >> 2) << 8); ! L+ T7 d6 F- t4 z0 O6 u7 @( D val += ((digits[p[2]] & 0x3) << 22);* y2 M$ r* W+ ^* }- W/ D+ a& L val += (digits[p[3]] << 16); val += ((digits[p[4]] << 2) << 24); i5 ^" A V; L9 ] U val += ((digits[p[5]] >> 4) << 24);
/* 543210 543210 543210 543210 543210 543210
765432 10. v- j/ u6 v2 x$ ~6 {. s! B ba98 fedc6 m0 m$ T8 g; e, H1 v' y0 N 76 5432100 K6 b6 \7 Z9 o3 w+ Q/ h, Q5 { fedcba 98---- {' d2 K* h- R |- LSB -||- -||- -| |- MSB -|, I5 ?3 ?' G O/ m: }4 Z% P; ? */ return val; }
int isLeadByte (unsigned int cp, unsigned char ucByte)2 e! Z7 w, m, i, l* B( m/ K/ d { # d; m8 D- M( T8 _7 g /* Code page 932 - Japanese Shift-JIS - 0x81-0x9f + \& j. V! U0 Q6 V" d4 Z( x 0xe0-0xfc 936 - Simplified Chinese GBK - 0xa1-0xfe! Y! r* ]3 Z1 X5 M' b 949 - Korean Wansung - 0x81-0xfe( a) F+ f0 t4 V! ]# Z% [ 950 - Traditional Chinese Big5 - 0x81-0xfe ! k% w7 I2 {) X 1361 - Korean Johab - 0x84-0xd3 0xd9-0xde 0xe0-0xf9 */ switch (cp)/ x4 [/ z- ^, N. r { 6 N5 m) t8 k( t! r case 932: if ((ucByte > 0x80) && (ucByte < 0xa0)) return 1; if ((ucByte > 0xdf) && (ucByte < 0xfd)) return 1; else return 0; case 936:) r3 m3 d. r$ ^3 C0 b. f, _: [# q if ((ucByte > 0xa0) && (ucByte < 0xff)) return 1;! l) ]& L: w6 T6 Q2 [ else return 0;# _3 w+ v: [# M, @0 J case 949:% V' v$ d; r" W9 h/ A case 950:4 C. i+ x, B8 K if ((ucByte > 0x80) && (ucByte < 0xff)) return 1; else return 0; case 1361:% _% Q" v- J& ~' n0 H if ((ucByte > 0x83) && (ucByte < 0xd4)) return 1; if ((ucByte > 0xd8) && (ucByte < 0xdf)) return 1; if ((ucByte > 0xdf) && (ucByte < 0xfa)) return 1;8 `) l+ R* t( j4 K5 f. ^5 g( d else return 0;4 O; @& k. S5 M- f; r9 A default: return 0; }
}
4 B& O$ [4 t4 Y& }! q int ScriptDecoder (unsigned char *inname, unsigned char *outname, unsigned int cp)) w6 A4 M& v1 h: a* J6 Z { 9 B3 }7 L9 l6 n C3 p3 B! v; b unsigned char inbuf[LEN_INBUF+1]; unsigned char outbuf[LEN_OUTBUF+1]; unsigned char c, lenbuf[7], csbuf[7]; unsigned char marker[] = "#@~^";8 c3 Q4 k! g7 K int nextstate, state = 0; int i, j, k, m, ml = 0;3 b0 G) C, `* C3 B( I* y unsigned long int csum = 0, len = 0; FILE *infile, *outfile;
infile = fopen (inname, "rb"); outfile = fopen (outname, "wb"); if (!infile || !outfile) { 6 T8 U$ G/ h. N X" \6 D3 L1 l0 t* | printf ("Error opening file!\n"); return 10;; l K) B" l; G } 7 ~) c7 T. Y( s8 A, x maketrans(); makedigits();# O4 L( W: K9 ?2 V& w7 b0 ? memset (inbuf, 0, sizeof (inbuf));* B7 B- J7 F& h M7 A memset (outbuf, 0, sizeof (outbuf)); memset (lenbuf, 0, sizeof (lenbuf)); + [% K( \) S& ` w' J6 ? state = STATE_INIT_COPY;0 v; ~$ U' n8 n6 | M i = 0; j = 0;
while (state) { if (inbuf == 0) { ) M9 L# x" T4 e: u if (feof (infile)) break;
memset (inbuf, 0, sizeof (inbuf));5 d E$ T# X. O3 p% B) f fgets (inbuf, LEN_INBUF, infile);. V2 z g x6 N" { |$ I i = 0;: Y9 y8 D u, ` W: w9 h9 T5 S! l- i continue;$ Y2 G: ~2 N$ _5 G5 j/ Z& w2 k- z/ R, j& { }
if (j == LEN_OUTBUF)+ z& s( h% D) u1 C5 O5 ]% f { fwrite (outbuf, sizeof(char), j, outfile); j = 0; }
switch (state) { - L+ A( ?3 [. i5 `% u case STATE_INIT_COPY: * D( O3 ~* ^1 C) h2 i+ r3 V$ }1 b, ~ ml = strlen (marker);; x6 B; F! `8 {$ K7 q S- N m = 0;; G1 {- R- ]: b3 h state = STATE_COPY_INPUT;! u: R: E8 z3 t) d4 P5 B% H* ] break;
}0 A, c, f; B9 b5 w if (m == ml) state = STATE_INIT_READLEN; break;
case STATE_FLUSHING: outbuf[j++] = marker[k++];# a7 N, ]6 S8 P) a$ _7 {9 k m--; if (m==0) state = STATE_COPY_INPUT; break;1 A: ~9 I( B- ^ p, p6 T: a 4 Z. Y2 _" Z8 O9 s$ S case STATE_SKIP_ML: 9 E" p8 l# O$ h2 a5 v i++; if (!(--ml)) state = nextstate; break;
+ V1 X S% @: T G! V1 ^4 L case STATE_INIT_READLEN: ml = 6; state = STATE_READLEN;: b& `8 l7 a% }2 q break;
case STATE_READLEN: lenbuf[6-ml] = inbuf[i++];; g& L. Z% y* e1 F/ j! X' ]! F if (!(--ml)) { 6 x- z7 t2 H3 V5 {! r5 ^ len = decodeBase64 (lenbuf); m = 0;& z5 O' C9 |' l" P4 I V ml = 2; state = STATE_SKIP_ML;: m0 W/ A [9 q: q: j nextstate = STATE_DECODE; }) [6 C' i* {* h* k; u break;
case STATE_DECODE: e# M1 ^' m* C' ^, {# j; N if (!len) { ml = 6;. o. F$ A$ I7 [ @: L5 o9 f( x state = STATE_CHECKSUM; break; } if (inbuf == _blank>'@') state = STATE_UNESCAPE;& _2 K0 w' C3 i3 S9 L else7 c* K# X; d% h: z: d. D+ u0 l { " U% w6 S6 Z* C8 i: ] if (inbuf < 0x80) { , U! D3 Q$ J+ D# {" ~4 `$ d' R outbuf[j++] = c = transformed[pick_encoding[m%64]][inbuf]; csum += c; m++; } else { outbuf[j++] = inbuf; [2 O7 O+ q6 @% @% N4 E if ((cp) && (isLeadByte (cp,inbuf))) state = STATE_DBCS;) [, \3 v: A) q }
}: T; \: E; V. {+ C# N3 C, E4 K9 g i++; len--; break;
case STATE_DBCS: outbuf[j++] = inbuf[i++];2 \( M1 Z: j: |/ W$ h- c+ O9 w2 O/ k state = STATE_DECODE;4 B1 q- Q: Z% n, P break; case STATE_UNESCAPE: outbuf[j++] = c = unescape (inbuf[i++]); csum += c;! T# @4 x1 y6 j+ P" x1 j len--; m++; state = STATE_DECODE; break;
case STATE_CHECKSUM: E) X& E; H: y. g, j: l csbuf[6-ml] = inbuf[i++]; if (!(--ml))1 e D8 h6 a |4 ]8 w { csum -= decodeBase64 (csbuf); if (csum) { $ m/ e( ?0 w$ | //printf ("Error - Incorrect checksum! (%lu)\n", csum); //csum=0; 此处注释掉好点,不然好多时候不能解密 嘿嘿 [icyfox] } m = 0;1 I3 o# w; x/ c8 P# s* ~ ml = 6; state = STATE_SKIP_ML; nextstate = STATE_INIT_COPY;/ C$ M6 F5 n2 M- H3 Z" P } break;
default:$ p4 J* M6 j* c$ l printf ("Invalid state: %d\n", state);1 ^. P0 \2 A D2 k6 N/ p break; } } ) J+ i4 \! g" Z, Y3 W1 m6 c6 k fwrite (outbuf, sizeof (char), j, outfile); fclose (infile); fclose (outfile); return 0; }
5 }# @" s- p/ W$ K8 }7 P int main (int argc, char **argv) { - m- P) f9 C* |* n' d1 R! ` int cp = 0;
if (argc < 3)+ z8 I$ d/ C/ n { 4 ^; u, d+ [# T printf ("Decoder for Microsoft Script Encoder v1.3\n"2 b7 W/ Y* b' s. e "(c)2000/2001 MrBrownstone, _blank>mrbrownstone@virtualconspiracy.com\n"9 Q3 O+ l7 L$ W" d8 r+ f "Home page: _blank>http://www.virtualconspiracy.com/scrdec.html\n\n"' P1 w8 z6 _# u# a& W& T "Usage: scrdec13 [codepage]\n\n", A, k$ c. B# i) o2 o+ P2 H "Code pages can be 932 - Japanese\n" " 936 - Chinese (Simplified)\n" " 950 - Chinese (Traditional)\n" " 949 - Korean (Wansung)\n" " 1361 - Korean (Johab)\n"/ F# y3 \: x' h r3 A# V "Any other code pages don't need to be specified.\n");% A- i) Y9 I% X; ^ return 10; }
if (argc > 3)* `4 q! _: o" v cp = atoi (argv[3]); return ScriptDecoder (argv[1], argv[2], cp);% u0 Z K- p/ Y) K* X9 A6 B: ] }
| 欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) | Powered by Discuz! X2.5 |