Saya memiliki dua file exe satu file asli dan satu lagi file exe retak perangkat lunak Vector magic dan retak filenya adalah vmbe.zip Kedua file memiliki ukuran yang sama persis.

Saya menggunakan ghidra untuk mendekompilasi file biner itu Kemudian saya hanya mengekspor file tersebut ke format c/c++ program hanya dengan menggunakan opsi File->Export Program (O)

Kemudian saya membuka file-file itu ke Visual studio dan menerapkan ekstensi Diff untuk menemukan perbedaan antara file-file itu dan saya dapat menavigasi ke perbedaan hanya dengan menekan ALT+F5

Kemudian saya mengamati bahwa beberapa fungsi gagal didekompilasi menunjukkan kesalahan berikut tetapi saya hanya mencari fungsi-fungsi itu di Ghidra dengan menggunakan Windows->Functions dan sekali lagi saya mendekompilasi fungsi-fungsi itu satu per satu dan kemudian memasukkan fungsi-fungsi itu ke dalam keseluruhan .c file pada posisi yang sesuai.

/*
Unable to decompile 'FUN_004475d0'
Cause: Exception while decompiling 004475d0: process: timeout
*/

Sekarang saya memiliki dua file .c satu adalah versi dekompilasi dari file exe asli dan satu lagi adalah file exe yang retak dan setelah memperbaiki lebih sedikit nama variabel, kita dapat dengan mudah menemukan bahwa hanya ada satu perbedaan antara kedua file tersebut di akhir fungsi FUN_0043a620

File .c dekompilasi exe asli

    _bVar2 = uVar3 & 0xffffff00 | (uint)bVar2;
  }
  *in_FS_OFFSET = local_c;
  return _bVar2;
}

File .c dekompilasi exe yang diretas

    _bVar2 = uVar3 & 0xffffff00 | 1;
  }
  *in_FS_OFFSET = local_c;
  return _bVar2;
}


Dan di Ghidra kita bisa melihat hanya ada satu instruksi perakitan yang diubah di lokasi Memori 0043a687

Berkas asli

        0043a687 b3  01           MOV        BL,AL

File retak

        0043a687 b3  01           MOV        BL,0x1

Sekarang saya mengubah instruksi itu dalam file exe asli dan hanya mengekspor file biner dari opsi File->Export Program (O)

Kemudian saya mencoba versi file biner yang retak dengan hanya mengganti file asli dengan file retak saya dan itu tidak berfungsi tetapi ketika saya mencoba file yang retak itu berfungsi seperti pesona.

Dan patch ini sepertinya solusi yang tepat karena ini adalah fungsi yang menentukan apakah perangkat lunak terdaftar atau tidak dengan hanya mengamati nilai yang dikembalikan dan kami membuatnya selalu return 1. Kita dapat mencari kegunaan dari fungsi tersebut FUN_0043a620 dalam file .c yang didecomplied
Sebagai contoh

 if (local_65 != 0) {
    uVar5 = FUN_0043a620();
    if ((char)uVar5 != '\0') {
      pQVar7 = (QString *)FUN_0043a580((char *)&local_54,"Thank you for activating!");
      local_4._0_1_ = 5;
      pQVar8 = (QString *)FUN_0043a580((char *)&param_1,"Activation succeeded");

Dan

 uVar4 = FUN_0043a620();
  if ((char)uVar4 == '\0') {
    pQVar5 = (QString *)
             FUN_0044b910((char *)&local_14,

                          "Not activated. Click the \'Activate\' button on the first page to enable saving."
                         );

Itu persis apa yang saya temukan bahkan sebelum melihat biner yang retak dan saya mencobanya tetapi tidak berhasil kemudian saya menemukan file yang retak ini mencoba memahami perbedaan antara bekerja biner yang retak vs biner asli.

Saya ingin tahu mengapa versi retak saya tidak berfungsi bahkan saya menyalin instruksi perakitan yang diubah dengan tepat dari file yang retak?

0
Navpreet Devpuri 18 Juni 2020, 08:18

1 menjawab

Jawaban Terbaik

Gunakan editor hex (FlexHex, BeyondCompare, ...) dan cari perbedaan antara kedua file, mungkin ada perbedaan lain yang bukan perbedaan kode, misalnya - beberapa perubahan data global.

Untuk memahami apa itu byte lain, Anda juga dapat menganalisis biner binary

  1. statically: Buka di Ghidra atau IDA dan cari x-refs untuk data ini, dan di mana ia digunakan. Peluang bagus itu entah bagaimana terkait dengan perubahan lain yang Anda lihat dalam kode.

  2. secara dinamis: Cobalah untuk mengatur breakpoint Hardware pada akses ke lokasi ini.

1
macro_controller 21 Juni 2020, 09:31