5. BASE64 การเข้ารหัสและอัลกอริทึมการถอดรหัสโดยใช้ JavaScript ใน Delphi
การค้นหา Google: การเข้ารหัส JavaScript Base64 จะพบรหัสการเข้ารหัส Base64 จำนวนมาก
var base64encodechars = "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz0123456789+/"; var base64decodechars = อาร์เรย์ใหม่ ( -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, -1, -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1); ฟังก์ชั่น base64Encode (str) { var out, i, len; var c1, c2, c3; len = str.length; i = 0; ออก = ""; ในขณะที่ (i <len) { c1 = str.charcodeat (i ++) & 0xff; ถ้า (i == len) - out += base64encodechars.charat (C1 >> 2); out += base64encodechars.charat ((C1 & 0x3) << 4); out += "=="; หยุดพัก; - c2 = str.charcodeat (i ++); ถ้า (i == len) - out += base64encodechars.charat (C1 >> 2); out += base64encodechars.charat (((C1 & 0x3) << 4) | ((C2 & 0xf0) >> 4)); out += base64encodechars.charat ((c2 & 0xf) << 2); out += "="; หยุดพัก; - c3 = str.charcodeat (i ++); out += base64encodechars.charat (C1 >> 2); out += base64encodechars.charat (((C1 & 0x3) << 4) | ((C2 & 0xf0) >> 4)); out += base64encodechars.charat (((c2 & 0xf) << 2) | ((C3 & 0xc0) >> 6)); out += base64encodechars.charat (C3 & 0x - กลับมา; - ฟังก์ชั่น base64decode (str) { var c1, c2, c3, c4; var i, len, out; len = str.length; i = 0; ออก = ""; ในขณะที่ (i <len) { / * C1 */ ทำ { c1 = base64decodechars [str.charcodeat (i ++) & 0xff]; } ในขณะที่ (i <len && c1 == -1); ถ้า (c1 == -1) หยุดพัก; / * C2 */ ทำ { c2 = base64decodechars [str.charcodeat (i ++) & 0xff]; } ในขณะที่ (i <len && c2 == -1); ถ้า (c2 == -1) หยุดพัก; out += string.fromCharcode ((C1 << 2) | ((C2 & 0x30) >> 4)); / * C3 */ ทำ { c3 = str.charcodeat (i ++) & 0xff; ถ้า (c3 == 61) กลับมา; c3 = base64decodechars [C3]; } ในขณะที่ (i <len && c3 == -1); ถ้า (c3 == -1) หยุดพัก; out += string.fromCharcode (((C2 & 0xf) << 4) | ((C3 & 0x / * C4 */ ทำ { c4 = str.charcodeat (i ++) & 0xff; ถ้า (c4 == 61) กลับมา; c4 = base64decodechars [C4]; } ในขณะที่ (i <len && c4 == -1); ถ้า (c4 == -1) หยุดพัก; out += string.fromCharcode (((C3 & 0x03) << 6) | C4); - กลับมา; - ฟังก์ชั่น UTF16TO8 (STR) { var out, i, len, c; ออก = ""; len = str.length; สำหรับ (i = 0; i <len; i ++) { c = str.charcodeat (i); if ((c> = 0x0001) && (c <= 0x out += str.charat (i); } อื่นถ้า (c> 0x07ff) { out += string.fromCharcode (0xe0 | ((c >> 12) & 0x out += string.fromCharcode (0x80 | ((c >> 6) & 0x out += string.fromCharcode (0x80 | ((c >> 0) & 0x } อื่น { out += string.fromCharcode (0xc0 | ((c >> 6) & 0x out += string.fromCharcode (0x80 | ((c >> 0) & 0x - - กลับมา; - ฟังก์ชั่น UTF8TO16 (STR) { var out, i, len, c; var char2, char3; ออก = ""; len = str.length; i = 0; ในขณะที่ (i <len) { c = str.charcodeat (i ++); สวิตช์ (c >> 4) - กรณีที่ 0: กรณีที่ 1: กรณีที่ 2: กรณีที่ 3: กรณีที่ 4: กรณีที่ 5: กรณีที่ 6: กรณี 7: // 0xxxxxxxx out += str.charat (I-1); หยุดพัก; กรณีที่ 12: กรณีที่ 13: // 110X xxxx 10xx xxxx char2 = str.charcodeat (i ++); out += string.fromCharcode (((C & 0x หยุดพัก; กรณีที่ 14: // 1110 xxxx 10xx xxxx 10xx xxxx char2 = str.charcodeat (i ++); char3 = str.charcodeat (i ++); out += string.fromCharcode (((C & 0x ((char2 & 0x ((Char3 & 0x หยุดพัก; - - กลับมา; - |
เราจะเพิ่มโค้ดที่มีความยาวในวิธีการของ AddCode () ได้อย่างไร
1) วิธีแรก: กำหนดรหัสยาวดังกล่าวเป็นสตริง ภาระงานนี้มีขนาดใหญ่มากและผิดพลาดได้ง่าย
2) วิธีที่สอง: กำหนดในแผ่นจดบันทึกและอ่านเมื่อโปรแกรมทำงาน ความปลอดภัยต่ำมากและง่ายต่อการแก้ไขและนำไปสู่ข้อผิดพลาด
3) วิธีที่สาม: เก็บไว้ใน DLL เป็นไฟล์ทรัพยากร วิธีนี้เหมาะสมกว่า เราจะใช้วิธีนี้เพื่อจัดการกับมันด้านล่าง
ขั้นตอนในการสร้าง DLL:
1) สร้าง Notepad ใหม่วางรหัสด้านบนและในที่สุดก็บันทึกเป็น base64.txt
2) สร้าง notepad ใหม่เขียนรหัสต่อไปนี้และในที่สุดบันทึกเป็น base64.rc
base64file exefile "base64.txt" |
3) สร้างไฟล์แบตช์ใหม่ในไดเรกทอรีเดียวกันและบันทึกเป็น base64.bat
brcc32.exe base64.rc |
4) รวบรวมลงในไฟล์ทรัพยากร Res: ดับเบิลคลิกเพื่อเรียกใช้งาน base64.bat และหลังจากนั้นไฟล์ base64.res จะถูกสร้างขึ้นซึ่งเป็นไฟล์ทรัพยากรของสคริปต์ JavaScript
5) สร้าง DLL ใหม่บันทึกเป็น base64.dpr เพิ่มรหัสต่อไปนี้จากนั้นรวบรวมเป็น base64.dll
ห้องสมุด Base64; {$ r base64.res} เริ่ม จบ. |
ด้วยวิธีนี้ไฟล์ทรัพยากรของเราจะถูกบรรจุไว้ใน DLL และเสร็จสมบูรณ์!
ต่อไปงานของเราคือการอ่านรหัส JavaScript ผ่าน DLLS
{อ่านไฟล์ทรัพยากรไปยังตัวแปรสตริง} ฟังก์ชั่น readresource (): สตริง; วาจา HINST: Thandle; สตรีม: Tresourcestream; codestring: tstrings; เริ่ม ผลลัพธ์: = ''; // โหลด dll hinst: = loadlibrary ('base64.dll'); ถ้า hinst = 0 จากนั้นออก; พยายาม // อ่านไฟล์ทรัพยากร สตรีม: = tresourcestream.create (hinst, 'base64file', 'exefile'); codestring: = tStringList.create (); พยายาม // บันทึกไฟล์ทรัพยากรในรายการ codestring.loadfromstream (สตรีม); // ส่งคืนสตริง ผลลัพธ์: = codestring.text; ในที่สุด codestring.free; สตรีมฟรี; จบ; ในที่สุด Freelibrary (Hinst); จบ; จบ; |
งานต่อไปนี้คือการเพิ่มฟังก์ชั่น JavaScript ที่กำหนดเองผ่าน addCode () ของการควบคุม ScriptControl
เริ่มต้นองค์ประกอบ ScriptControl โปรดดูแอปพลิเคชันขั้นสูงของ ScriptControl ใน Delphi (i)
http://blog.csdn.net/juwuyi/archive/
sc.addcode (readresource ()); // การเข้ารหัส คำ: = 'นี่คือชิ้นส่วนของข้อความที่เข้ารหัสด้วย base64'; //ผลลัพธ์: ผลลัพธ์: = sc.eval ('base64Encode (UTF16to8 (' '+คำ+' '')) '); // การถอดรหัส ผลลัพธ์: = sc.eval ('UTF8to16 (base64Decode (' '+คำ+' '')) '); |
<span style = "Font-Family: Song Font; M