sách gpt4 ăn đã đi

Cách ký và ký lại chương trình APK Android

In lại Tác giả: qq735679552 Thời gian cập nhật: 28-09-2022 22:32:09 25 4
mua khóa gpt4 giày nike

CFSDN nhấn mạnh vào giá trị tạo ra nguồn mở và chúng tôi cam kết xây dựng nền tảng chia sẻ tài nguyên để mọi nhân viên CNTT có thể tìm thấy thế giới tuyệt vời của bạn tại đây.

Bài viết blog CFSDN này sưu tầm và ký lại các phương pháp cho các chương trình APK Android của tác giả. Nếu bạn quan tâm đến bài viết này thì nhớ like nhé.

Signapk.jar được biên dịch bằng mã nguồn Android của công cụ chữ ký có thể dùng để ký cả apk và rom. Định dạng sử dụng:

?
1
java –jar signapk.jar [-w] publickey.x509[.pem] privatekey.pk8 đầu vào.jar đầu ra.jar
  • -w đề cập đến tham số cần sử dụng khi ký ROM
  • publickey.x509[.pem] là tệp khóa chung
  • Privatekey.pk8 đề cập đến tệp khóa riêng
  • apk hoặc rom input.jar cần được ký
  • out.jar apk hoặc rom được tạo sau khi ký

signapk.java 。

1) Hàm chính Hàm chính tạo đối tượng khóa chung và đối tượng khóa riêng, đồng thời gọi hàm addDigestsToManifest để tạo đối tượng tệp kê khai Bản kê khai, sau đó gọi signFile để ký.

?
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
26
27
28
29
30
31
32
33
34
35
36
công cộng tĩnh vô hiệu main(String[] args) {
  //...
  Boolean signWholeFile = SAI ;
  số nguyên đối số khởi động = 0 ;
  /*Nếu bạn muốn ký vào ROM, bạn cần truyền tham số -w*/
  nếu (args[0].equals("-w")) {
   signWholeFile = đúng;
   đối số = 1;
  }
  // ...
  thử {
   Tệp publicKeyFile = new File(args[argstart+0]);
   X509Certificate khóa công khai = readPublicKey(publicKeyFile);
   PrivateKey privateKey = readPrivateKey(tệp mới(args[argstart+1]));
   inputJar = new JarFile(tệp mới(args[argstart+2]), false);
   outputFile = new FileOutputStream(args[argstart+3]);
   /* Bạn đọc có thể tự mình phân tích chữ ký ROM Nó tương tự như chữ ký Apk nhưng sẽ thêm file otacert */
   nếu (signWholeFile) {
    SignApk.signWholeFile(inputJar, publicKeyFile, publicKey,
     khóa riêng, tệp đầu ra);
   }
   khác {
    JarOutputStream outputJar = new JarOutputStream(tệp đầu ra);
    đầu raJar.setLevel(9);
    /*addDigestsToManifest sẽ tạo một đối tượng Manifest và sau đó gọi signFile để sign*/
    signFile(addDigestsToManifest(inputJar), ​​​​inputJar,
    publicKeyFile, publicKey, privateKey, outputJar);
    outputJar. đóng();
   }
  } nắm lấy (Ngoại lệ e) {
   e.printStackTrace();
   Hệ thống.thoát( 1 );
  } Cuối cùng {
   //...
  }
}

2) addDigestsToManifest Trước tiên chúng ta phải hiểu cấu trúc của tệp Manifest. Tệp Manifest được chia thành nhiều phân đoạn với các dòng trống. Mỗi phân đoạn bao gồm nhiều thuộc tính của phân đoạn đầu tiên được gọi là tập thuộc tính chính. các phân đoạn khác được gọi là bộ sưu tập thuộc tính thông thường thường có thuộc tính Tên, là tên của phân đoạn chứa bộ sưu tập thuộc tính. Tệp kê khai của Android sẽ tạo một phân đoạn cho mỗi tệp trong zip. Giá trị của thuộc tính Tên của phân đoạn này là đường dẫn + tên tệp của tệp. Ngoài ra còn có thuộc tính SHA1-Digest. thông báo của tập tin Một chuỗi được mã hóa bằng base64. Ví dụ kê khai:

?
1
2
3
4
5
6
7
8
9
10
11
Phiên bản Manifest: 1.0
Được tạo bởi: 1.6.0-rc (Sun Microsystems Inc.)
 
Tên: res/drawable-hdpi/user_logout.png
SHA1-Tóm tắt: zkQSZbt3Tqc9myEVuxc1dzMDPCs=
 
Tên: res/drawable-hdpi/contacts_cancel_btn_pressed.png
SHA1-Tóm tắt: mSVZvKpvKpmgUJ9oXDJaTWzhdic=
 
Tên: res/drawable/main_head_backgroud.png
SHA1-Thông báo: fe1yzADfDGZvr0cyIdNpGf/ySio=

Phân đoạn chứa thuộc tính Manifest-Version và Created-By là tập thuộc tính chính và các tập thuộc tính khác là tập thuộc tính thông thường. Các tập thuộc tính thông thường này có thuộc tính Tên làm tên của phân đoạn. mã nguồn addDigestsToManifest:

?
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
riêng tư tĩnh Bản kê khai addDigestsToManifest(JarFile jar)
    ném IOException, Ngoại lệ bảo mật chung {
  Đầu vào của tệp kê khai = jar.getManifest();
  Đầu ra biểu hiện = mới Biểu hiện();
  Thuộc tính main = output.getMainAttributes();
  nếu như (đầu vào != vô giá trị ) {
   main.putAll(input.getMainAttributes());
  } khác {
   main.putValue( "Phiên bản kê khai" , "1.0" );
   main.putValue( "Được tạo ra bởi" , "1.0 (Android SignApk)" );
  }
  MessageDigest md = MessageDigest.getInstance( "SHA1" );
  byte [] bộ đệm = mới byte [ 4096 ];
  số nguyên số;
  // Chúng tôi sắp xếp các mục nhập đầu vào theo tên và thêm chúng vào
  // đầu ra manifest theo thứ tự được sắp xếp. Chúng tôi mong đợi rằng đầu ra
  // bản đồ sẽ mang tính xác định.
  TreeMap byName = mới TreeMap();
 
  (Đánh số e = jar.entries(); e.hasMoreElements(); ) {
   Mục nhập JarEntry = e.nextElement();
   byName.put(entry.getName(), mục nhập);
  }
 
  (Mục nhập JarEntry: byName.values()) {
   Tên chuỗi = entry.getName();
   nếu như (!entry.isDirectory() && !name.equals(JarFile.MANIFEST_NAME) &&
    !name.bằng(CERT_SF_NAME) && !name.bằng(CERT_RSA_NAME) &&
    !name.bằng(OTACERT_NAME) &&
    (dảiPattern == vô giá trị ||
     !stripPattern.matcher(tên).matches())) {
    Dữ liệu InputStream = jar.getInputStream(mục nhập);
    /*Tính sha1*/
    trong khi ((num = data.read(buffer)) > 0) {
     md.update(bộ đệm, 0, số);
    }
    Thuộc tính attr = null;
    nếu (đầu vào != null) attr = input.getAttributes(tên);
    attr = attr != null ? Thuộc tính mới(attr): Thuộc tính mới();
    /*base64 mã hóa giá trị sha1 để lấy giá trị của thuộc tính SHA1-Digest*/
    attr.putValue( "SHA1-Tóm tắt" ,
        mới Chuỗi(Base64.encode(md.digest()), "ASCII" ));
    output.getEntries().put(tên, thuộc tính);
   }
  }
  trở lại đầu ra;
}

3) trước tiên, signFile sao chép tất cả các tệp trong inputjar sang outjar, sau đó tạo Manifest.MF, CERT.SF và CERT.RSA.

?
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
26
27
28
công cộng tĩnh vô hiệu signFile(Bản kê khai bản kê khai, JarFile inputJar,
Tệp publicKeyFile, X509Certificate publicKey, PrivateKey privateKey,
  JarOutputStream đầu raJar) ném Ngoại lệ {
  // Giả sử chứng chỉ có hiệu lực trong ít nhất một giờ.
  dài dấu thời gian = publicKey.getNotBefore().getTime() + 3600L * 1000 ;
  JarEntry là;
  // sao chép tập tin
  copyFiles(manifest, inputJar, outputJar, dấu thời gian);
  // Tạo MANIFEST.MF
  là = mới JarEntry(JarFile. MANIFEST_NAME);
  is.setTime(dấu thời gian);
  outJar.putNextEntry(is);
  manifest.write(outputJar);
  //Gọi writeSignatureFile để tạo CERT.SF
  là = mới JarEntry(CERT_SF_NAME);
  is.setTime(dấu thời gian);
  outJar.putNextEntry(is);
  ByteArrayOutputStream bao gồm = mới Dòng đầu ra ByteArray();
  writeSignatureFile(bản kê khai, baos);
  byte [] signedData = baos.toByteArray();
  outputJar.write(signedData);
  // Một bước rất quan trọng là tạo CERT.RSA
  là = mới JarEntry(CERT_RSA_NAME);
  is.setTime(dấu thời gian);
  outJar.putNextEntry(is);
  viếtChữ kýKhối( mới CMSProcessableByteArray(Dữ liệu đã ký),
       khóa công khai, khóa riêng tư, đầu raJar);
}

4) writeSignatureFile tạo CERT.SF, thực tế tính toán lại bản tóm tắt Sha1 của từng phân đoạn của MANIFEST.MF để thu được CERT.SF.

?
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
riêng tư tĩnh vô hiệu writeSignatureFile(Bản kê khai bản kê khai, OutputStream ra)
   ném IOException, Ngoại lệ bảo mật chung {
  Biểu hiện sf = mới Biểu hiện();
  Thuộc tính main = sf.getMainAttributes();
  //Thêm thuộc tính
  main.putValue( "Phiên bản chữ ký" , "1.0" );
  main.putValue( "Được tạo ra bởi" , "1.0 (Android SignApk)" );
  MessageDigest md = MessageDigest.getInstance( "SHA1" );
  In luồng in = mới Dòng in
    mới Dòng đầu ra Digest( mới ByteArrayOutputStream(), md),
    ĐÚNG VẬY , "UTF-8" );
  //Thêm bản tóm tắt sha1 của Manifest.mf
  manifest.write(in);
  in. flush();
  main.putValue( "SHA1-Digest-Manifest" ,
      mới Chuỗi(Base64.encode(md.digest()), "ASCII" ));
  // Tính toán thông báo sha1 cho từng phân đoạn của MANIFEST.MF
  Bản đồ mục nhập = manifest.getEntries();
  (Map.Entry mục nhập: mục nhập.entrySet()) {
   // Tóm tắt khổ thơ biểu thị cho mục nhập này.
   in.in( "Tên: " + mục nhập.getKey() + "\r\n" );
   (Map.Entry att : entry.getValue().entrySet()) {
    print.print(att.getKey() + ": " + that.getValue() + "\r\n" );
   }
   in.in( "\r\n" );
   in. flush();
 
   Thuộc tính sfAttr = mới Thuộc tính();
   sfAttr.putValue( "SHA1-Tóm tắt" ,
       mới Chuỗi(Base64.encode(md.digest()), "ASCII" ));
   sf.getEntries().put(entry.getKey(), sfAttr);
  }
  Dòng đếm đầu ra cout = mới CountOutputStream(ra);
  sf.write(cout);
  // Một lỗi trong việc triển khai java.util.jar của nền tảng Android
  // lên đến phiên bản 1.6 sẽ gây ra lỗi IOException không mong muốn
  // nếu độ dài của tệp chữ ký là bội số của 1024 byte.
  // Để giải quyết vấn đề này, hãy thêm CRLF bổ sung trong trường hợp này.
  nếu như ((cout. kích thước() % 1024 ) == 0 ) {
   cout.write( '\r' );
   cout.write( '\N' );
  }
}

5) writeSignatureBlock sử dụng thuật toán SHA1withRSA để tính toán bản tóm tắt CERT.SF và mã hóa nó để lấy chữ ký số. Khóa riêng được sử dụng là khóa riêng, sau đó chữ ký số và khóa chung được lưu trữ trong CERT.RSA. Thư viện mã nguồn mở bouncycastle được sử dụng ở đây để ký.

?
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
26
27
28
29
riêng tư tĩnh vô hiệu viếtChữ kýKhối(
  Dữ liệu CMSTypedData, X509Certificate publicKey, PrivateKey privateKey,
  OutputStream ra)
  ném Ngoại lệ IO,
    Chứng chỉEncodingException,
    Ngoại lệ tạo toán tử,
    Ngoại lệ CMS {
  Mảng certList = mới Mảng( 1 );
  certList.add(Khóa công khai);
  Chứng chỉ JcaCertStore = mới JcaCertStore(Danh sách chứng chỉ);
  CMSSignedDataGenerator gen = mới Trình tạo dữ liệu CMSSigned();
  // Thuật toán chữ ký là SHA1withRSA
  ContentSigner sha1Signer = mới Người xây dựng JcaContentSigner( "SHA1vớiRSA" )
   .setProvider(sBouncyCastleProvider)
   .build(khóa riêng);
  gen.addSignerInfoGenerator(
   mới JcaSignerInfoGeneratorBuilder(
    mới JcaDigestCalculatorProviderBuilder()
    .setProvider(sBouncyCastleProvider)
    .xây dựng())
   .setDirectSignature( ĐÚNG VẬY )
   .build(sha1Signer, Khóa công khai));
  gen.addCertificates(chứng chỉ);
  CMSSignedData sigData = gen.generate(dữ liệu, SAI );
 
  ASN1InputStream asn1 = mới ASN1InputStream(sigData. getEncoded());
  DEROutputStream dos = mới DEROutputStream(ra);
  dos.writeObject(asn1.readObject());
}

Sử dụng dòng lệnh để ký lại APK Trên thực tế, có cách đơn giản nhất để ký lại apk, đó là tải xuống công cụ ký lại re-sign.jar, kéo apk vào cửa sổ của công cụ này. để tạo apk được ký lại. Bây giờ hãy để tôi nói về phương pháp ký lại phức tạp: sử dụng phương pháp dòng lệnh. 1. Để định cấu hình môi trường, bạn cần cài đặt jdk và sdk 2. Tìm tệp jarsigner.exe trong thư mục jdk đã được cài đặt thành công. Thư mục của máy này như sau: C:\Program Files\Java\jdk1. .8.0_20\bin 3. Chuẩn bị xóa Chữ ký của chính apk đã ký lại (fantongyo.apk) Mở apk ở chế độ Winrar, xóa thư mục META-INF và sao chép tệp Apk vào thư mục C:\Program Files\Java\jdk1.8.0_20\bin. 1.Thư mục META-INF: lưu trữ các tệp CERT và MANIFEST đã ký, được sử dụng để xác định thông tin chữ ký và phiên bản của phần mềm 2. thư mục còn lại: lưu trữ nhiều tài nguyên gốc của Android, bao gồm: hoạt hình, hình ảnh có thể vẽ, bố cục, menu, xml, 3. Tệp mô tả dự án Android được mã hóa bởi AndroidManifest.xml, bao gồm tên, giới hạn phiên bản và nhóm chương trình của dự án Android Mô tả tệp, v.v. 4. Sau khi Class.dex được biên dịch, Lớp được chương trình dx chuyển đổi thành tệp mã byte thực thi của máy ảo Dalvik 5. Resources.arsc là sản phẩm được biên dịch của tất cả các tài nguyên văn bản, chứa chuỗi tài nguyên tương ứng với từng Vị trí 4 Phương pháp 1 ký lại tệp Apk: Tạo lại chứng chỉ ký gói AndroidApk thông qua lệnh và sau đó ký lại tệp Apk 1. Chuyển sang thư mục bin của jdk trong cmd: cd C:\Program Files\Java\jdk1.8.0_20\bin Nhấn Enter 2. Sau đó nhập lệnh sau:

?
1
2
3
4
5
6
7
8
Công cụ khóa -genkey - bí danh fantongyo.keystore -keyalg RSA -giá trị 20000 -keystore fantongyo.keystore
/*Giải thích: Công cụ keytool là công cụ chứng chỉ đi kèm với Java JDK
Tham số -genkey cho biết: để tạo chứng chỉ (chứng chỉ bảo mật để nhận dạng bản quyền và danh tính)
- bí danh Biểu diễn tham số: Chứng chỉ có bí danh, - bí danh fantongyo.keystore chỉ ra rằng bí danh chứng chỉ là: fantongyo
-keyalg RSA cho biết loại mã hóa, RSA cho biết cần mã hóa để ngăn chặn người khác lấy cắp
-validity 20000 nghĩa là thời gian hiệu lực là 20000 ngày (K3
-keystore fantongyo.keystore chỉ ra rằng tên của chứng chỉ được tạo là fantongyo
*/

Sau khi gõ và nhấn Enter, màn hình hiển thị: Nhập mật khẩu kho khóa: [Mật khẩu không được lặp lại] (Thông thường nên sử dụng 20 chữ số, tốt nhất nên ghi lại và sử dụng sau) Nhập lại mật khẩu mới: [ Mật khẩu không được lặp lại](o' ^$ _( F( K& I0 Họ và tên của bạn là gì? [Không xác định]: fantongyo Tên đơn vị tổ chức của bạn là gì? [Không xác định]: fantong Tên tổ chức của bạn là gì ? [Không rõ]: cuộc sống Tên thành phố hoặc vùng của bạn là gì? ) L# V' |. E0 f; { [Không xác định]: Thâm Quyến Tên tiểu bang hoặc tỉnh của bạn là gì? [Không xác định]: guangdong Mã quốc gia gồm hai chữ cái là gì? đơn vị này? [Không xác định]: CN CN=fantongyo, U=fantong, O=đội fantong, L=shenzhen, ST=guangdong, C=CN đúng không? Mật khẩu chính của Mine.keystore> (nếu giống với mật khẩu kho khóa, hãy nhấn Enter): Kiểm tra thư mục C:\Program Files\Java\jdk1.8.0_20\bin để tạo tệp chứng chỉ fantongyo.keystore 3. Để ký lại tệp Apk, hãy nhập vào cmd: jarsigner –verbose –keystore fantongyo.keystore –signedjar fantongyo_signed.apk fantongyo.apk fantongyo.keystore /*Giải thích: * ^, {& k1 Z. M* P/ M+ K5 n5 hjarsigner là một công cụ chữ ký Java# K8 ~% s# Y. @6 Tham số P -verbose có nghĩa: hiển thị chi tiết chữ ký- nghĩa là kho khóa sử dụng tệp chứng chỉ ký fantongyo.keystore trong thư mục hiện tại -signedjar fantongyo_signed.apk có nghĩa là tên APK được tạo sau khi ký, % v a7 e2 v4 W#! ]; Gfantongyo.apk đại diện cho phần mềm APK Android chưa được ký, fantongyo.keystore đại diện cho bí danh */ Sau khi nhập key, màn hình hiển thị: jar đã được ký.

Cách ký và ký lại chương trình APK Android

Tệp fantongyo_signed.apk đã được tạo lại trong thư mục C:\Program Files\Java\jdk1.8.0_20\bin.

Phương pháp 2. Ký lại tệp Apk bằng debug.keystore đi kèm với android 1. Mở Eclipse, thanh menu Window—>Preferences—>Android—>Build—>Thư mục kho khóa gỡ lỗi mặc định (trình chỉnh sửa của tôi hiển thị: C:\Users \ Administrator\.android\debug.keystore) 2. Copy file debug.keystore vào C:\Program Files\Java\jdk1.8.0_20\bin thư mục 3. Chuyển sang thư mục bin của jdk trong cmd: cd C:\Program Files\Java\jdk1.8.0_20\bin và nhấn Enter 4. Nhập lệnh sau:

Sao chép mã Mã này như sau:
jarsigner -digestalg SHA1 -sigalg MD5withRSA -keystore debug.keystore -storepass android -keypass android fantongyo.apk androiddebugkey
Đi vào
5. Tìm tệp zipalign trong sdk. Thư mục trên máy tính của tôi là: E:\SoftWare\adt-bundle-windows-x86-20140702\sdk\build-tools\android-4.4W
Trong cmd, chuyển sang thư mục chứa tệp zipalign.exe trong sdk:

  。

?
1
đĩa CD E:\SoftWare\adt-bundle-windows-x86-20140702\sdk\build-tools\android-4.4W

6. Sau đó nhập: zipalign 4 fantongyo.apk fantongyo_signed.apk (fantongyo_signed.apk là file apk được ký lại).

Cuối cùng, bài viết này về phương pháp ký và ký lại chương trình APK Android kết thúc tại đây. Nếu bạn muốn biết thêm về phương pháp ký và ký lại chương trình APK Android, vui lòng tìm kiếm bài viết CFSDN hoặc tiếp tục Duyệt liên quan. bài viết, hy vọng bạn sẽ ủng hộ blog của tôi trong tương lai! .

25 4 0
qq735679552
Hồ sơ

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá taxi Didi miễn phí
Phiếu giảm giá taxi Didi
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress