作者:冰狐浪子 来自:http://www.icyfoxlovelace.com/
9 {* R7 v9 L8 r$ B) u一网友给我一加密网页“太乙奇門六壬排盤程式”,其中脚本采用微软工具进行了加[VBScript.Encode],说是用解密软件不能解密,我看后发现页面编码是UTF-8,改为ANSI后,使用scrdec顺利解密,看来编码问题有的时候满有用的,对于解密失败的朋友可以尝试看下编码格式,因为现在的解码工具好像是针对ANSI编码的!
4 F& ]' ~9 k/ f6 l附scrdec1.3源代码[c代码]:
/**********************************************************************/ /* scrdec.c - Decoder for Microsoft Script Encoder */ ^+ T, b, G5 l+ I /* Version 1.3 */ /* */) D* L' f0 z5 M6 u' F /* COPYRIGHT: */ /* (c)2000/2001 MrBrownstone, _blank>mrbrownstone@virtualconspiracy.com */& ?2 H+ f1 m" z5 H6 k0 a. ] /* Some changes by Joe Steele to correct minor stuff */9 W; s& k9 a5 a" d9 f( M% o8 @ /* */ /* DISCLAIMER: */* ^. \* g9 l" h5 o' J m /* This program is for demonstrative and educational purposes only. */ /* Use of this program is at your own risk. The author cannot be held */ /* responsible if any laws are broken by use of this program. */! X; X9 _9 S; I, Y l /* */ /* If you use or distribute this code, this message should be held */; |. f2 z7 E6 G- P+ H% o /* intact. Also, any program based upon this code should display the */ /* copyright message and the disclaimer. */ /**********************************************************************/
#include : [( E7 o; z2 ?2 f #include #include
' L8 c: `: G9 F3 C1 i5 p% b) \#define LEN_OUTBUF 64* |) \) \# o1 ` b/ t% w: @ #define LEN_INBUF 1024
#define STATE_INIT_COPY 100 #define STATE_COPY_INPUT 101, P- j. z/ G" J9 @9 r+ J1 Q* X #define STATE_SKIP_ML 102 #define STATE_CHECKSUM 103( e" b9 |9 d( d6 t #define STATE_READLEN 1049 c7 q8 n; m- W% k4 r5 j. A #define STATE_DECODE 105 #define STATE_UNESCAPE 106% b b* ?( Y" [1 e: A #define STATE_FLUSHING 107 #define STATE_DBCS 108% w$ h% A3 Y& F7 e. n% D #define STATE_INIT_READLEN 109
5 x1 X4 H' o o v2 W6 k1 d- L9 p, eunsigned 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, 0x42,0x76,0x45, 0x60,0x63,0x76, 0x23,0x62,0x2A, 0x65,0x4D,0x43, 6 ^0 J- n9 W9 y" n! G9 F* r& v7 j/ ] 0x5F,0x51,0x33, 0x7E,0x53,0x42, 0x4F,0x52,0x20, 0x52,0x20,0x63, # o' |, E3 y% E) x0 j3 I/ f 0x7A,0x26,0x4A, 0x21,0x54,0x5A, 0x46,0x71,0x38, 0x20,0x2B,0x79, 0x26,0x66,0x32, 0x63,0x2A,0x57, 0x2A,0x58,0x6C, 0x76,0x7F,0x2B, 0x47,0x7B,0x46, 0x25,0x30,0x52, 0x2C,0x31,0x4F, 0x29,0x6C,0x3D, 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, 0x7C,0x46,0x6E, 0x53,0x4A,0x64, 0x48,0x5C,0x74, 0x31,0x48,0x67, ' x7 A+ |; @. S9 s' u* A! z' [$ j' e 0x72,0x36,0x7D, 0x6E,0x4B,0x68, 0x70,0x7D,0x35, 0x49,0x5D,0x22, # ^9 y. d+ g6 C( V5 F8 j 0x3F,0x6A,0x55, 0x4B,0x50,0x3A, 0x6A,0x69,0x60, 0x2E,0x23,0x6A, N8 O) [- i9 I 0x7F,0x09,0x71, 0x28,0x70,0x6F, 0x35,0x65,0x49, 0x7D,0x74,0x5C, 4 l1 T: I. W; t. n- r8 s 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, 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, ! Z' n& z) K- C& {. t/ f! c 0x09,0x60,0x50, 0x75,0x6B,0x2D, 0x38,0x4E,0x29, 0x55,0x3D,0x3F,3 v- ~; S K% `' m, |' n 0x51,0x67,0x2f/ F/ F. f \# \7 n+ @ } ;
const unsigned char pick_encoding[64] = { 2 c0 o. ?6 s- [ 1, 2, 0, 1, 2, 0, 2, 0, 0, 2, 0, 2, 1, 0, 2, 0, 0 A z1 W+ |% H7 d! R 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, - U" d1 w& W9 u' D 1, 0, 2, 0, 1, 1, 2, 0, 0, 1, 1, 2, 0, 1, 0, 2) M9 h4 f. R$ s% z& ^" q$ { };
' W% k) U0 a& A: _7 t9 O* T) zunsigned char transformed[3][128]; int digits[0x7b];
! }2 I5 h- B! I3 n( ^$ R' X$ Aunsigned char unescape (unsigned char c) { & ~6 v4 G( t) a9 I; @( C0 f static unsigned char escapes[] = "#&!*$";" `( t% v6 U( q' \0 w static unsigned char escaped[] = "\r\n<>@"; int i=0;
0 a8 L. y- u- o) f. d9 sif (c > 127)! M/ Z* Z3 b4 u return c;, Z/ U; H7 _9 i while (escapes) { 5 i( E4 G% O. Q& u if (escapes == c) return escaped;# _5 r* r" L# B% m2 _/ V i++; } 6 A- I' g6 e( a1 j. ~$ m9 i6 G return '?';) \! R/ z/ l( \$ T }
& W, J1 O. b$ T; ~. Z3 X7 Svoid maketrans (void)4 Q) ?+ V6 i5 _) R( p/ B { , l8 P) u. s5 n) B# s5 B+ R int i, j;
7 |* `# O0 V( h" n8 p* {) ?for (i=31; i<=127; i++) for (j=0; j<3; j++) transformed[j][rawData[(i-31)*3 + j]] = (i==31) ? 9 : i;0 {; p2 [" P% G4 J: J( [# s3 c4 u }
void makedigits (void)- q1 Z f. k6 { { 8 E% ] C7 }* E/ o1 Z8 t% y int i;
for (i=0; i<26; i++). ]; N4 a+ s' h7 v% {6 Y { digits['A'+i] = i; digits['a'+i] = i+26;8 K6 @' q9 h) s! w } for (i=0; i<10; i++) digits['0'+i] = i+52;& W: S+ C; y" i1 A* L digits[0x2b] = 62; digits[0x2f] = 63;+ g1 {' N7 r( `, Z! |+ m/ L8 t }
unsigned long int decodeBase64 (unsigned char *p)1 K2 q( T: c2 f: e& K7 @; a0 ` { unsigned long int val = 0;
val += (digits[p[0]] << 2);+ j5 n' x3 S2 T2 O) H val += (digits[p[1]] >> 4); val += (digits[p[1]] & 0xf) << 12; val += ((digits[p[2]] >> 2) << 8); val += ((digits[p[2]] & 0x3) << 22);/ j; K- @, }6 Q; S) u1 E+ v val += (digits[p[3]] << 16);8 P9 L7 p4 t1 h val += ((digits[p[4]] << 2) << 24); val += ((digits[p[5]] >> 4) << 24);
/* 543210 543210 543210 543210 543210 543210
765432 10 ba98 fedc: F7 Y8 w2 d* f* A6 w5 W. e 76 5432101 t+ z7 p( V8 U. M4 p fedcba 98----, S9 }, o0 i- b% W" l6 t |- LSB -||- -||- -| |- MSB -| */ return val;7 O5 w8 G0 d* Y }
int isLeadByte (unsigned int cp, unsigned char ucByte) { 8 o/ @5 z! h$ K: \1 V /* Code page 932 - Japanese Shift-JIS - 0x81-0x9f 0xe0-0xfc / a* { Y( y/ S+ q8 N; f% R 936 - Simplified Chinese GBK - 0xa1-0xfe 949 - Korean Wansung - 0x81-0xfe) b% ?9 ]3 a. X& m, u7 X 950 - Traditional Chinese Big5 - 0x81-0xfe : `2 \( V3 \7 j! G( {. y 1361 - Korean Johab - 0x84-0xd3 0xd9-0xde 0xe0-0xf9 */0 C% B2 c; `% {8 z: g switch (cp)# w; X( I) }. X. T1 o6 s8 { { case 932:# n: f4 l& \0 V9 i6 K8 o if ((ucByte > 0x80) && (ucByte < 0xa0)) return 1; if ((ucByte > 0xdf) && (ucByte < 0xfd)) return 1; i( J7 ]9 [" v% \ else return 0;/ {/ } i$ ?- ~6 h6 q3 C case 936: if ((ucByte > 0xa0) && (ucByte < 0xff)) return 1;* M! B# d/ q- K: G" }- v else return 0;# c1 C0 n- G+ y' }8 j( l+ P0 _ case 949: case 950:! c! |% P2 g9 I- b% k" |, Y if ((ucByte > 0x80) && (ucByte < 0xff)) return 1;0 p' y, o' ^8 h6 W& m+ ] else return 0; case 1361:6 q$ {4 O& |9 b+ O8 o9 O0 L+ Q if ((ucByte > 0x83) && (ucByte < 0xd4)) return 1; if ((ucByte > 0xd8) && (ucByte < 0xdf)) return 1;; i5 E u/ g2 `$ R$ f% U6 u& S, C if ((ucByte > 0xdf) && (ucByte < 0xfa)) return 1; else return 0;: U* O" Q3 s) @1 \ default: return 0; }
}
int ScriptDecoder (unsigned char *inname, unsigned char *outname, unsigned int cp)' ^& A/ q$ w+ z, @ { unsigned char inbuf[LEN_INBUF+1]; unsigned char outbuf[LEN_OUTBUF+1]; unsigned char c, lenbuf[7], csbuf[7]; unsigned char marker[] = "#@~^";5 o- h" O1 D2 t( G& t7 V& L int nextstate, state = 0; int i, j, k, m, ml = 0;5 b$ b/ @) E8 V* j. Z8 v8 P unsigned long int csum = 0, len = 0;* b! l1 Y" h T. K# l FILE *infile, *outfile;
infile = fopen (inname, "rb"); outfile = fopen (outname, "wb"); if (!infile || !outfile); Y: _' j, l1 ?8 ~ t$ Q2 e* V. Y) f. C { 5 k, Q, p- C o) I printf ("Error opening file!\n"); return 10; } maketrans(); makedigits();$ J1 S4 b/ R7 ^2 w9 d5 r) S5 A memset (inbuf, 0, sizeof (inbuf)); memset (outbuf, 0, sizeof (outbuf)); memset (lenbuf, 0, sizeof (lenbuf));9 T$ u) }0 S5 ?( m, @/ I$ a( o state = STATE_INIT_COPY; i = 0; j = 0;
while (state)/ |, M! ^7 g: q! G2 {6 k { if (inbuf == 0)7 x9 K! U, _, j" O2 y* {5 e { if (feof (infile))% j0 V9 h: P- S0 B break;
memset (inbuf, 0, sizeof (inbuf)); fgets (inbuf, LEN_INBUF, infile);" ^: i0 W c# Y) M i = 0; continue;& ~( J( y3 }' G }
if (j == LEN_OUTBUF) { fwrite (outbuf, sizeof(char), j, outfile);. b: i" C9 a; c% }) a j = 0;! Q1 S8 c" P8 e5 f) C9 Z) m. a }
switch (state) { case STATE_INIT_COPY: ' z5 ^, j" L/ F5 K4 G# y% k ml = strlen (marker);* P% H! ~3 w* u m = 0; state = STATE_COPY_INPUT;% K' Y* T. r' s break;
}3 L. m: h7 C' w6 u; Q if (m == ml), X9 t2 R& ]# X v+ Q" e8 p state = STATE_INIT_READLEN; break;
case STATE_FLUSHING:) h- b/ C. e! p `; w8 w& @% K; [, x outbuf[j++] = marker[k++];1 G; L* V2 b# | m--; if (m==0)& M9 Q" H) A& F" [ G: x+ ?/ { state = STATE_COPY_INPUT; Q1 n w$ a6 J* u$ B. u" N: U break; case STATE_SKIP_ML: 0 L& ?# B9 c. S" I i++;( m6 e9 z% e0 [8 T" Z if (!(--ml)) state = nextstate; break;
1 T0 F( e% l/ x' U& `* |3 z case STATE_INIT_READLEN: ml = 6; state = STATE_READLEN;! }3 } Y9 d' T# I' {3 m break;
case STATE_READLEN: / I$ ~ E a: J5 t2 Z# s5 H lenbuf[6-ml] = inbuf[i++]; if (!(--ml))4 H1 J( Z' m* c! x- l) D0 D3 p { ' ?7 z* c) d; ~ len = decodeBase64 (lenbuf);, g( }2 P- i/ Q; F( p. h# I4 a* J* } m = 0; ml = 2;' H1 N- a3 y; K" E X: ~ state = STATE_SKIP_ML;; S# J3 o' Z4 M5 a) B: Q, Y nextstate = STATE_DECODE;+ O9 E. g v: K }, M) ?- g9 L4 O break;
case STATE_DECODE: if (!len), }8 B! d6 X. y! R/ W7 k- R { ml = 6; state = STATE_CHECKSUM;; X- N0 {0 j/ |9 f: r break; } if (inbuf == _blank>'@') state = STATE_UNESCAPE;3 K/ X( D' x* j& \3 ~. ~( Q else3 j$ j- ?0 I1 i ^ { 3 E. B8 k7 D" \: H if (inbuf < 0x80) { outbuf[j++] = c = transformed[pick_encoding[m%64]][inbuf]; csum += c;; ~: f+ x" r# P8 g) S0 h m++; }, S; f G3 k& `/ I* ` else# @/ N7 B2 f" _8 E# x. o2 C { " e9 k P2 Y+ ]1 k' i outbuf[j++] = inbuf; if ((cp) && (isLeadByte (cp,inbuf)))& a& @3 S8 Z" G state = STATE_DBCS;& k& b# S* I) l3 J3 ~2 W }
} i++; len--; break;
case STATE_DBCS: outbuf[j++] = inbuf[i++];+ l" C. ?2 g3 p0 P# k: ? state = STATE_DECODE; break;+ p. n. r7 B: d9 o$ G( { ) _, G$ [+ u6 M) r5 E+ g case STATE_UNESCAPE: outbuf[j++] = c = unescape (inbuf[i++]);$ h+ y3 U- |4 ~' Z; k csum += c;- A6 r- J l( _4 x7 ?, ]* L len--;2 r6 Z' h! D& ^ m++; state = STATE_DECODE;7 k+ J# b& a- Y/ |: M! `4 G break;
case STATE_CHECKSUM: csbuf[6-ml] = inbuf[i++]; if (!(--ml)) { 9 C/ E8 i; Q j, h2 P csum -= decodeBase64 (csbuf);) h5 L9 M" l1 t2 ^ if (csum)1 y0 }' }# P0 J6 h! V4 I8 K/ H$ f { //printf ("Error - Incorrect checksum! (%lu)\n", csum); //csum=0; 此处注释掉好点,不然好多时候不能解密 嘿嘿 [icyfox] } m = 0; ml = 6;7 C7 {9 X/ h$ |0 b+ | state = STATE_SKIP_ML;$ ^" b7 D Y' j' r% f5 | nextstate = STATE_INIT_COPY;0 q K% o8 Q+ N- t3 D& \ } break;
default: printf ("Invalid state: %d\n", state);. n3 r1 m5 d5 a) z+ ]& C break; } } ; i: v# m* f" t* Y% ~+ f! X fwrite (outbuf, sizeof (char), j, outfile); fclose (infile); fclose (outfile);- u# ]4 G% v3 I# _0 i1 q0 a2 H( s return 0;" l5 ]( L5 N4 i3 v! o+ r' d8 R }
: f, m. G# T- R" O( e! N int main (int argc, char **argv)6 y5 r1 I3 z; B3 I4 {6 W9 F5 ]3 q. l: q { int cp = 0;
if (argc < 3) { ; j' n9 `( n' t: R2 z3 l7 ~ printf ("Decoder for Microsoft Script Encoder v1.3\n"* k" `5 d+ m+ d* k- j' n: i9 W% e" y "(c)2000/2001 MrBrownstone, _blank>mrbrownstone@virtualconspiracy.com\n" "Home page: _blank>http://www.virtualconspiracy.com/scrdec.html\n\n" "Usage: scrdec13 [codepage]\n\n"4 t1 a0 J2 ?: {" Z "Code pages can be 932 - Japanese\n" " 936 - Chinese (Simplified)\n" " 950 - Chinese (Traditional)\n" " 949 - Korean (Wansung)\n" " 1361 - Korean (Johab)\n"& {1 l+ E. a8 c0 I- D "Any other code pages don't need to be specified.\n"); return 10;3 g! Z( t# T2 X' C' H/ A/ x6 n }
if (argc > 3) cp = atoi (argv[3]);+ k4 R) \! {7 w, ]1 u+ i$ k return ScriptDecoder (argv[1], argv[2], cp);7 f7 d$ Z* N5 N# o }
| 欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) | Powered by Discuz! X2.5 |