Pengenalan Kepada
Reverse Code Engineering(RCE)
Setelah menerima beberapa persoalan mengenai RCE, mereka menyatakan
tidak berapa faham.
Oleh itu saya nak menjelaskan sedikit sebanyak mengenai RCE secara amnya.
Ceritanya bermula dah lama berlalu..
Setelah sesuatu aturcara(menggunakan bahasa pengaturcaraan seperti C,
C++, Basic, Pascal, dll) di'compile'kan kepada bahasa mesin. Harddisk
programmer tersebut rosak dan semua kod2 sumber yang telah ditulis olehnya
disimpan di dalam telah hilang. Hanya tinggal file binary(file yang
telah di'compile'). Dia tiada jalan lain untuk menulis balik beberapa
algoritma yang agak susah kecuali meng'reverse engineering'.
Programmer tersebut membeli program disassembler(program khas untuk
menukarkan kod mesin(binary files) kepada bahasa assembly(bahasa penghimpun
kalau belajar di sekolah). Dan programmer tersebut terpaksa belajar
bahasa pengaturcaraan assembly untuk memahami code yang telah di'disassmble'
oleh disassembler. Kemudian menulis balik aturcara berdasarkan kod assembly
kepada bahasa yang dia tulis sebelum itu seperti C, C++, Pascal.
Contoh lain ialah seperti masalah Y2K, saya agak semua orang tahu mengenainya.
Software yang mengalami masalah Y2K lebih senang diubah jika source
codes(kod sumber) masih wujud. Tetapi jika source code software tersebut
telah lama lesap. Sedangkan program tersebut masih dapat berjalan dengan
baik jika Y2K tidak wujud. Maka terpaksalah 'reverse engineer' mengambil
alih tugas untuk membetulkan balik software tersebut. Jadi reverse engineer
tadi akan mengambil langkah seperti di atas dan menjalan proses debugging(trace
code line by line) menggunakan program debugger seperti SoftIce, Turbo
Debugger, debug.com (program MS-DOZ), dll.
Contoh:
jika ditulis dengan bahasa C.
for( i = 0 ; i < namelen; i++){
jumlah += name[i] + 0x26; // 0x26 - nombor hexa == 38 decimal
}
// cara menukarkan no decimal(asas 10, 0-9) kepada asas 16 (0-F) hexadecimal
akan dibincangkan kemudian
code yang kita dapat selepas disassembler ialah
LOOP:
MOVSX ECX,BYTE PTR DS:[EAX+EDI] ;;; EDI
= memory address yang menyimpan *nama
MOV EDX,DWORD PTR SS:[EBP-4] ;;;;;; nilai
jumlah dari memory sementara ke EDX
INC EAX ;;;;;;;;;;;;;;;;;;;;;;;;;;; naikkan
EAX ( eax = eax+1 ) = i++
LEA ECX,DWORD PTR DS:[EDX+ECX+26] ; ECX = nilai jumlah + 38;
MOV DWORD PTR SS:[EBP-4],ECX ;;;;;; simpan
nilai jumlah ke memory sementara
JL LOOP ;;;;;;;;;;;;;;;;;;;;;;;;;;; jika
i < namelen..lompat LOOP
CMP EAX,ESI ;;;;;;;;;;;;;;;;;;;;;;;
banding ESI(panjang nama) dgn EA(counter)
EAX, EDX, ECX, ESI adalah Register untuk intel compatible processor untuk menyimpan
nilai bagi proses pengiraan.
MOVSX, MOV, INC, CMP, LEA adalah beberapa contoh processor instruction.
Beberapa lagi opcodes/instruction awak boleh download kat sini. opcodes.zip
Jangan risau jika awak tak faham benda ni sekarang. akan dibincangkan
kemudian..teruskan membaca.
Contoh lain:
Saya telah membina satu crackme yang mudah iaitu mengkehendaki reverser
membuang nag screen (message box) yang meminta pengguna menekan button
OK untuk meneruskan aturcara. Nag screen yang terdapat pada software
biasanya menyusahkan kerana kita terpaksa menekan button ok setiap kali
menjalankan program tersebut. Oleh itu, reverser mesti mencari lokasi
code untuk menjalan nag screen tersebut kemudian membuangnya terus dari
program.
[bersambung kemudian]