Lấy hình ảnh của game Java cũ

Tình hình là e muốn lấy file hình ảnh của một game java mà hồi trước em mê lắm ấy. Chính xác thì nó là “Bộ lạc thời tiền sử”. Em đã dùng Java Decompiler + Eclipse để mò và suy luận một chút thì có thể cái đoạn lấy hình ảnh nó ở file e.class -> private void d() . Thật ra thì e cũng chả biết nhiều về java nên cũng không rõ nữa, ai đó có thể giúp em được không ạ :sob::sob::sob:
Cái game này thì chỉ cần gg phát là nó ra luôn
Cảm ơn ạ :sob:

Bạn đã làm được đến cỡ đó nhưng lại không biết file dữ liệu ở đâu à?

3 Likes

Mình cũng không chắc, mình đã thử để mở file đó nhưng mình không thể mở đc nên mới lên đây chứ :sweat_smile:

Từ: http://vn.phoneky.com/games/?s=download&id=j4j7724

  private void d()
  {
    System.gc();
    Thread.yield();
    int i = jdField_a_of_type_ArrayOfByte[jdField_a_of_type_Byte];
    int k = 0;
    try
    {
      System.gc();
      Thread.yield();
      DataInputStream localDataInputStream = new DataInputStream(getClass().getResourceAsStream(jdField_a_of_type_ArrayOfJavaLangString[jdField_a_of_type_Byte]));
      byte[] arrayOfByte = new byte[62502];
      localDataInputStream.read(arrayOfByte);
      localDataInputStream.close();
      int n = 0;
      for (k = 0; k < i; k = (byte)(k + 1))
      {
        int j = (byte)(arrayOfByte[n] & 0xFF);
        n++;
        if (k == 0) {
          jdField_a_of_type_F.jdField_a_of_type_Array2dOfJavaxMicroeditionLcduiImage[jdField_a_of_type_Byte] = new Image[i];
        }
        if (j == 255) {
          return;
        }
        int m = (short)(j << 8 | arrayOfByte[n] & 0xFF);
        n++;
        try
        {
          if (k < 27) {
            jdField_a_of_type_F.jdField_a_of_type_Array2dOfJavaxMicroeditionLcduiImage[jdField_a_of_type_Byte][k] = Image.createImage(arrayOfByte, n, m);
          }
        }
        catch (Exception localException1) {}
        n += m;
        jdField_a_of_type_F.a(2);
        System.gc();
        Thread.yield();
      }
      return;
    }
    catch (Exception localException2) {}
  }

Hình ảnh đã được nối vào với nhau thành 1 tập tin. Trước mỗi hình đều có 2 byte chứa thông tin về kích thước của hình.
Có 3 tập tin như thế: pi0, pi8pi9.

Nếu biết về lập trình thì bạn tự tạo 1 chương trình “giải nén”.
Thủ công thì dùng chương trình đọc nhị phân (thập lục phân) Hex Editor. Để tìm từng tập tin hình và sao chép ra tập tin mới. Các tập tin hình định dạng PNG bắt đầu bằng [0x89]PNG (byte đầu là 0x89).

6 Likes

Bạn có thể hướng dẫn được không ạ ?
Trước mình cũng đã thử làm copy đoạn code và chỉnh sửa nhưng mình không biết làm thế nào để lưu các byte kia thành file hình ảnh. Máy mình mới hỏng ổ cứng nên mất hết dữ liệu, cũng lâu rồi mình không đụng vào nên quên hết rồi
Còn cái Hex Editor thì mình có nghe qua nhưng chưa dùng bao giờ :frowning:

Vậy là bạn thiếu quá nhiều kiến thức về đọc file, việc mò cái này thật là xa vời.

4 Likes

Không những kiến thức về đọc file mà còn nhiều thứ khác nữa, mình cũng đã lâu lắm rồi chưa đụng vào mấy cái này vì không có thời gian :sweat_smile:
Mình cũng toàn kiểu mò đến đâu học đến đó, cũng chẳng biết bắt đầu từ đâu nữa, thời gian tới chắc phải tập trung tìm hiểu thêm mới được
Còn h mình cần là làm sao để lấy được cái file hình ảnh kia đây :sob::sob::sob:

À, biết tí lập trình là được rồi.
Nếu lấy từ đoạn mã trên thì càng ổn.
Chỉ cần thay đoạn trong if(k < 27) thành lưu tập tin theo 3 giá trị arrayOfByte, nm là xong.

4 Likes

Bây giờ mới lên đây được :sweat_smile:
Cảm ơn @SITUVN.gcd mình làm được rồi ạ :smile:
Code:

import java.io.*;

public class Main {
	
	public static void main(String args[]) {
		
		byte[] ArrayOfByte = new byte[] { 31, 6, 12 };
		
		byte Byte = 0; //0 = pi0 | 1 = pi8 | 2 = pi9
		
		String[] ArrayOfJavaLangString = new String[] { "C://Users//MyPC//Desktop//pi0", "C://Users//MyPC//Desktop//pi1", "C://Users//MyPC//Desktop//pi2" };
		
		File fileOut = null;
		boolean bool = false;
		String link = "C://Users//MyPC//Desktop//Make Image//pi" + Byte + "//";

		int i = ArrayOfByte[Byte];
		int k = 0;
		try {

			DataInputStream localDataInputStream = new DataInputStream(new FileInputStream(ArrayOfJavaLangString[Byte]));
			byte[] arrayOfByte = new byte[62502];
			localDataInputStream.read(arrayOfByte);
			localDataInputStream.close();
			int n = 0;
			for (k = 0; k < i; k = (byte)(k + 1)) {
			
				int j = (byte)(arrayOfByte[n] & 0xFF);
				n++;
				if (j == 255) {
					return;
				}
				int m = (short)(j << 8 | arrayOfByte[n] & 0xFF);
				n++;
				try {
					if (k < 27) {
						try {
							try {

								fileOut = new File(link + n + "image" + ".png");

		        				bool = fileOut.createNewFile();

		        				System.out.println("File created: " + bool);
	        		         
							} catch(Exception e) {e.printStackTrace();}

	        	        OutputStream os = new FileOutputStream(fileOut);

	        	        os.write(arrayOfByte, n, m);
	        	         
	        	        fileOut = null;
	        	        os.close();
		        	    } catch (Exception ex) {ex.printStackTrace();}
	          		}
				}
	        	catch (Exception localException1) {}
	        	n += m;
			}
	      return;
	    }
	    catch (Exception localException2) {}
	}
}
1 Like

anh ơi, em cũng muốn lấy được 1 số hình ảnh trong game em thích… và hình như cũng tương tự anh ạ… anh có thể nói một vài từ khóa để em tìm hiểu hay hướng dẫn giúp em được không ạ ?

1 Like

bạn ơi, mình cũng muốn lấy hình ảnh game giống vấn đề này… bạn còn online không, và có thể hỗ trợ giúp mình không ạ

1 Like

Muốn lấy thì phải hiểu cấu trúc của dữ liệu hoặc như bạn @BOW303 dịch ngược và lấy đoạn mã xử lý ra được?
Nói chung là phải biết viết tí mã (code).

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?