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]