WTai.Tk
HOMEUPLOADFORUM
22/05/201816:48:36
Chào: khách!
Đăng nhập
Đăng ký
HOME > Java > Hướng dẫn lập trình
Tìm kiếm | Lượt xem: 541
↓↓ [HD j2me] Tạo thuật toán giải mã và mã hóa ảnh socogame đuôi .rsp
* skypeaful (VIP) [Off]
Exp: 378 | 1301/528
Xu: 92834873
Mệt mỏi vì quá tài giỏi :v
Cách đây 11 tháng #1
Hôm nay skypeaful sẽ hướng dẫn các bạn tạo ứng dụng giải mã và mã hóa ảnh socogame (đuôi .rsp). Các bạn có thể tải "Rsp Tool.jar" trong file .jar bao gồm đầy đủ source .java mình viết, chỉ cần đổi đuôi sang .zip và bung nén ra sẽ thấy. Trong chủ đề mình chỉ đề cập đến thuật toán mã hóa và giải mã .rsp thôi.
Bước 1: Mở tập tin "kjys2-xt_l6_jar" và tìm ".rsp" để xác định class chứa code giải mã .rsp ra tệp c.class
Bước 2: Dịch ngược c.class bằng Jclazz và xóa bớt các code không cần thiết.
Bước 3: Chuyển method giải mã trả kết quả dạng byte array để phù hợp ứng dụng giải mã mình viết. Code: public byte[] decode(DataInputStream dis)
Bước 4: Phân tích thuật toán:
* Giải mã .rsp sang .png:
this.c = new byte[8]; //tạo 8 byte array
this.a.read(this.c, 0, 8); //lấy dữ liệu 8 byte array lấy từ 8 byte đầu của DataInputStream a
this.d = 0; //thiết lập int d về 0
if (this.a() != 808594993){return null// chạy method a() và ép kết quả phải bằng số 808594993 nếu không sẽ trả về null
trong method a() ta thấy:
return ((this.c[this.d++] + 256 & 0xff) + ((this.c[this.d++] + 256 & 0xff) << 8) + ((this.c[this.d++] + 256 & 0xff) << 16) + ((this.c[this.d++] + 256 & 0xff) << 24));//số d ban đầu là 0 (code trên) trong method a() lúc này sẽ chạy lần lượt từ 1-4 và mỗi đoạn sẽ dùng thuật toán bitwise xử lý, nghĩa là 4 byte array đầu của tệp mã hóa .rsp sẽ chạy code này và tính toán nhưng kết quả sau cùng chắc chắn là 808594993. Qua xem xét nhiều file .rsp tôi nhận thấy 4 byte đầu luôn là {49, 46, 50, 48} để tính toán ra kết quả đúng.
Code tiếp theo là:
this.b = 16 + this.a();//int b này sẽ là độ dài file .png sau giải mã, method a()I lúc này sẽ chạy lại nhưng d thay đổi tức là d từ 5 đến 8, lấy 4 byte tiếp theo nữa của tệp cộng dồn 16 ra kết quả là tổng độ dài file .png ban đầu
this.c = null;//byte array c lúc này sẽ chuyển về null
this.c = new byte[this.b];//độ dài mảng c lúc này là độ dài file .png
this.a.read(this.c, 16, this.b - 16); (lấy dữ liệu từ offset 16 đến hết của file vào trong byte array c)
d = 0; //chuyển int d về 0 để dùng lại lần sau sẽ như code ban đầu
i = 16;
while (true)
{
if (i >= this.b){/*22*/break;}
this.c[i] = (byte) (this.c[i] - 170 ^ 0xffffffff); //chạy xor đối với những phần tử trong c thoả điều kiện. c[i] sẽ thay đổi giá trị với i chạy 16 đến độ dài b (của file .png)
i += 8;// cách mỗi 8 số sẽ thay đổi giá trị trong mảng
}
i = 0;
while (true)
{
if (i >= 16){/*22*/break;}
this.c[i] = this.e[i]; //từ 0 đến 15 sẽ thay đổi theo e (e[] chính là cái header mặc định của file chuẩn .png)
i++;
}
return c; // trả về kết quả sau khi giải mã .rsp là c[]
Tóm lại, cấu trúc file .rsp là:
4 byte đầu bắt buộc là 49, 46, 50, 48, 4 byte kế là độ dài file .png gốc sau khi trừ 8 byte, các byte còn lại sẽ được chạy hàm xử lý ở các vị trí nhất định.
Tạm thời viết diễn giải giải mã, nếu các bạn đã hiểu sẽ tôi viết tiếp hướng dẫn tạo file .rsp từ .png
[9] alo113, Darkrai, ServantOfEvil, hoichemgio9x, NhokTapYeu, ☆™VinhVIP™☆, Huyền Vũ, Nguyễn Hoàng Thuận, PMTpro,
Edited: skypeaful. 21:40 04/07 [1]

Tập tin đính kèm
* skypeaful (VIP) [Off]
Exp: 378 | 1301/528
Xu: 92834873
Mệt mỏi vì quá tài giỏi :v
Cách đây 11 tháng #2
File game demo có .rsp để test
Tải xuống kjys2-xt-l6.jar (74.06 KB)
* skypeaful (VIP) [Off]
Exp: 378 | 1301/528
Xu: 92834873
Mệt mỏi vì quá tài giỏi :v
Cách đây 11 tháng #3
* Mã hóa .png sang .rsp:
Khi đã hiểu code giải mã rõ ràng thì bạn có thể viết code mã hóa lại.
Cách làm: 4 byte đầu bắt buộc là 49, 46, 50, 48, 4 byte kế là độ dài file .png gốc sau khi trừ 8 byte, các byte còn lại sẽ được chạy hàm xử lý ở các vị trí nhất định.
Tạo method mã hóa public byte[] encode(DataInputStream dis)
int l = dis.available();//lấy độ dài .png
int size = l - 8;//lấy size mới sau khi - 8 để xử lý
int r1 = (size >> 0) & 0xff;
int r2 = (size >> 8) & 0xff;
int r3 = (size >> 16) & 0xff;
int r4 = (size >> 24) & 0xff;
byte[] magic = new byte[]{49, 46, 50, 48};//4 byte đầu file .rsp
int [] bf = new int[]{r1, r2, r3, r4};//chuyển hàm đảo chuyển size sang intarray giống như code lấy màu arpg
byte[] data = new byte[l];//tạo mảng với độ dài là size file png
dis.read(data);//đọc dữ liệu datainputstream sang data
byte[] ba = new byte[l - 16];//tạo byte array mới sau khi trừ header png
System.arraycopy(data, 16, ba, 0, l - 16);//chép từ offset 16 đến hết length data[] sang mảng mới ba
int i = 0;//thay vì 16 như code giải mã i sẽ chuyển về 0 do mảng ba[] đã cắt 16 byte png header
while (true)
{
if (i >= ba.length){/*22*/break;}
ba[i] = (byte) (ba[i] - 170 ^ 0xffffffff);//xử lý xor các byte trong ba[]
i += 8;
}
ByteArrayOutputStream bos = new ByteArrayOutputStream();// tạo để ghi lại byte array trong dataoutputstream
DataOutputStream dos = new DataOutputStream(bos);//tạo dataoutputstream để ghi dữ liệu
dos.write(magic); //ghi 4 magic byte .rsp đầu
for (int jj = 0; jj < bf.length; jj++)
{
dos.write(bf[jj]);//viết int lấy size sau khi chạy bitwise vô
}
dos.write(ba);//ghi ba[] sau khi xử lý vô
System.gc();
dis.close();
dos.close();
bos.close();
return bos.toByteArray();//chuyển bos sang byte[]
Mình diễn giải ý tưởng nếu có chỗ nào còn chưa rõ, các bạn vui lòng tải file đính kèm ở đầu top về xem.
* hoichemgio9x (Memb) [Off]
Exp: 193 | 125/42
Xu: 38701
Cách đây 11 tháng #4
Gửi từ: skypeaful

File game demo có .rsp để test Tải xuống kjys2-xt-l6.jar (74.06 KB)

làm cách nào để biết dc cấu trúc file rsp mà viết tool dc nhỉ? xem hex à bác
* skypeaful (VIP) [Off]
Exp: 378 | 1301/528
Xu: 92834873
Mệt mỏi vì quá tài giỏi :v
Cách đây 11 tháng #5
Gửi từ: hoichemgio9x

làm cách nào để biết dc cấu trúc file rsp mà viết tool dc nhỉ? xem hex à bác


Xem hex nhiều file .rsp để so sánh, đồng thời decompile class đọc .rsp để hiểu rõ cấu trúc hơn và viết code
* ServantOfEvil (Spam) [Off]
Exp: 324 | 381/211
Xu: 96669051
Tôi bị điên.
Cách đây 11 tháng #6
Đưa code vào khung đi anh. Với lại 16 byte đầu ảnh là Signature chung của .png
* hoichemgio9x (Memb) [Off]
Exp: 193 | 125/42
Xu: 38701
Cách đây 11 tháng #7
Gửi từ: skypeaful

Xem hex nhiều file .rsp để so sánh, đồng thời decompile class đọc .rsp để hiểu rõ cấu trúc hơn và viết code

kí tự ">>" là so sánh cái gì thế nhỉ
* skypeaful (VIP) [Off]
Exp: 378 | 1301/528
Xu: 92834873
Mệt mỏi vì quá tài giỏi :v
Cách đây 11 tháng #8
Gửi từ: hoichemgio9x

kí tự ">>" là so sánh cái gì thế nhỉ


Xem thêm
Các thao tác trên bitwise
Edited: skypeaful. 16:13 05/07 [1]
* Hocj2me (Memb) [Off]
Exp: 195 | 21/114
Xu: 100081379
Cảnh báo thiên tai c4 cấp cực kì nguy hiểm
Cách đây 11 tháng #9
ai biết hàm chuyển mã nhị phân=> hexa kôg
* hoichemgio9x (Memb) [Off]
Exp: 193 | 125/42
Xu: 38701
Cách đây 11 tháng #10
Gửi từ: Hocj2me

ai biết hàm chuyển mã nhị phân=> hexa kôg

có công thức thôi
12>>
Bài viết cùng chuyên mục
Hướng dẫn viết app xem thời khoá biểu online không cần host! [18]
Một số phương thức của lớp RecordStore, và help :v [3]
Bàn luận về Thread [19]
Xin up lại bài Liên kết class [37]
[HD j2me] Tạo thuật toán giải mã và mã hóa ảnh socogame đuôi .rsp [17]
Chia sẻ bài viết
BBCode:

Link:

Link nhanh:
Trực tuyến [0 user] [2 khách]
Không có thành viên nào trực tuyến!