• Silahkan bergabung dengan chat kami di Telegram group kami di N3Forum - https://t.me/n3forum
  • Welcome to the Nyit-Nyit.Net - N3 forum! This is a forum where offline-online gamers, programmers and reverser community can share, learn, communicate and interact, offer services, sell and buy game mods, hacks, cracks and cheats related, including for iOS and Android.

    If you're a pro-gamer or a programmer or a reverser, we would like to invite you to Sign Up and Log In on our website. Make sure to read the rules and abide by it, to ensure a fair and enjoyable user experience for everyone.

RNDC [RNDC] Reverse Engineering Web Cruiser Enterprise Edition

dono

3 SMP
STAFF N3
Tukang Sapu
-----[ Pendahuluan

Beberapa waktu lalu, saya sempat berdiskusi dengan seorang rekan membahas log
yang dipenuhi dengan string yang cukup mencurigakan. Stringnya kurang lebih
seperti ini: "!S!WCRTESTINPUT000001!E!" (tanpa tanda kutip). Karena penasaran,
akhirnya saya melakukan googling untuk mencari kira-kira aplikasi apa yang di-
gunakan oleh attacker tersebut dan ternyata banyak yang mengalami hal yang sama
hingga akhirnya muncul titik terang dari sebuah forum di Russia[1]. Pada forum
tersebut terdapat petunjuk output dari aplikasi yang digunakan oleh attacker:

Code:
  <!--Created By WebCruiser - Web Vulnerability Scanner [url="http://sec4app.com"]http://sec4app.com[/url] -->
Nah, setelah membuka situs pembuat aplikasi yang dimaksud yaitu aplikasi Web
Cruiser[2], ternyata tersedia link untuk mengunduh aplikasinya dan saya pun me-
milih untuk mengunduh aplikasi versi enterprise.



-----[ Langkah-langkah

* Setelah aplikasinya selesai diunduh, selanjutnya tinggal diekstrak dan tidak
perlu di-install.

* Untuk mengecek apakah executablenya diproteksi dengan packer/cryptor atau se-
jenisnya, saya menggunakan protectionID[3]. Hasilnya adalah sebagai berikut:


Code:
-=[ ProtectionID v0.6.4.0 JULY]=-
(c) 2003-2010 CDKiLLER & TippeX
Build 07/08/10-17:57:05
Ready...
Scanning -> C:\Users\ids\WebCruiser\WebCruiserWVS.exe
File Type : 32-Bit Exe (Subsystem : Win GUI / 2), Size : 415744 (065800h) Byte(s)
[File Heuristics] -> Flag : 00000000000001001101000000110000 (0x0004D030)
[CompilerDetect] -> .NET
[!] File appears to have no protection or is using an unknown protection
- Scan Took : 0.875 Second(s)

* Dari informasi di atas bisa diketahui bahwa aplikasinya dibuat dengan meng-
gunakan .Net dan tidak terdeteksi adanya packer yang berarti kita tidak perlu
melakukan unpacking.

* Selanjutnya, karena aplikasi tersebut dibuat menggunakan .Net, maka kita
dapat menggunakan .Net Reflector[4] untuk melakukan disassembling dan kali
ini tujuan kita adalah untuk mempelajari mekanisme registrasi aplikasi Web
Cruiser tersebut.


Author: https://www.facebook.com/id.slacker @ RNDC
Group FB: https://www.facebook...ups/rndc.or.id/

* Berikut ini adalah penjelasan dari fungsi-fungsi yang berkaitan dengan proses
registrasi. Pertama adalah fungsi yang dipanggil ketika tombol "Register" di-
tekan. Berikut ini adalah listing fungsinya:

Code:
1 private void btnReg_Click(object sender, EventArgs e)
2 {
3 string str = this.txtRegUsername.Text.Trim();
4 if (string.IsNullOrEmpty(str) || (str.Length < 2))
5 {
6 MessageBox.Show("Username should has at least 2 letters!");
7 }
8 else
9 {
10 string text = this.txtRegCode.Text;
11 if (string.IsNullOrEmpty(text))
12 {
13 MessageBox.Show("RegCode can not be null!");
14 }
15 else if (Reg.ValidateRegCode(str, text) || Reg.ValidateRegCode2(str, text))
16 {
17 RegistryKey key = Registry.CurrentUser.CreateSubKey(@"Software\Sec4App\WebCruiser");
18 key.SetValue("Username", str);
19 key.SetValue("RegCode", text);
20 string str3 = Reg.Encrypt(DateTime.Now.ToString("yyyy-MM-dd"));
21 key.SetValue("InitDate", str3);
22 this.lblRegInfo.Text = "This copy of WebCruiser is licensed to: " + str;
23 MessageBox.Show("Thank You For Registration!", "Registration OK!");
24 this.lblRegUsername.Visible = false;
25 this.lblRegCode.Visible = false;
26 this.txtRegUsername.Visible = false;
27 this.txtRegCode.Visible = false;
28 this.btnReg.Visible = false;
29 this.linkLblBuy.Visible = false;
30 this.linkPaypal.Visible = false;
31 Reg.A1K3 = true;
32 Reg.RegUser = str;
33 }
34 else
35 {
36 MessageBox.Show("Invalid RegCode !");
37 }
38 }
39 }
* Penjelasan singkat untuk baris-baris yang penting pada snippet kode di atas
adalah sebagai berikut:

** Pada baris ke-4 dilakukan pengecekan terhadap nama,dimana nama tidak boleh
kosong dan ukurannya minimal 2 huruf.

** Selanjutnya pada baris ke-11 dilakukan pengecekan apakah user memasukkan
serial atau masih kosong. Jika masih kosong, maka akan muncul pesan error.

** Pengecekan serial dilakukan pada baris ke-15, dimana ada 2 fungsi yang
bertugas untuk melakukan pengecekan, dan cukup salah satunya saja yang
valid. Fungsi tersebut adalah "ValidateRegCode" dan "ValidateRegCode2"
dimana parameternya sama yaitu username dan serial.

* Berikut ini potongan dari fungsi "ValidateRegCode" yaitu salah satu fungsi
yang mengecek apakah serial yang dimasukkan user valid.

Code:
1 public static bool ValidateRegCode(string Username, string RegCode)
2 {
3 try
4 {
5 if (RegCode.Length == 0x13)
6 {
7 char[] chArray = RegCode.ToCharArray();
8 if (chArray[4] != '-')
9 {
10 return false;
11 }
12 if (chArray[9] != '-')
13 {
14 return false;
15 }
16 if (chArray[14] != '-')
17 {
18 return false;
19 }
20 RegCode = RegCode.Replace("-", "");
21 ulong num = Hash2UInt64(RegCode);
22 ulong num2 = Hash2UInt64(GetHash(Username));
23 ulong num3 = num - num2;
24 if (GetHash(num3.ToString()).Equals("1FEDF23C6CB786AA"))
25 {
26 _RegOK = true;
27 RegUser = Username;
28 return true;
29 }
30 }
31 return false;
32 }
33 catch (Exception exception)
34 {
35 MessageBox.Show(exception.Message);
36 return false;
37 }
38 }
* Penjelasan untuk beberapa baris penting dari snippet kode di atas adalah sbb:

** Baris ke-5 mengecek apakah panjang serial berjumlah 19 karakter (0x13 hex)
Jika tidak maka proses registrasi gagal.

** Baris ke-7 akan mengubah serial menjadi array dengan tipe karakter.

** Baris ke-8 akan mengecek apakah karakter ke-5 dari serial adalah karakter
"-" (tanpa tanda kutip). Demikian pula dengan baris ke-12 dan 16 mengecek
karakter ke 10 dan 15 dari serial. Jadi kesimpulan sementara, format se-
rial adalah "AAAA-BBBB-CCCC-DDDD".

** Baris ke-20 akan menghilangkan semua karakter "-" sehingga format serial
menjadi "AAAABBBBCCCCDDDD".

** Baris ke-21 akan mengubah serial dari format hexadesimal menjadi unsigned
long dan disimpan pada variabel "num". Untuk lebih jelasnya, akan dibahas
mengenai fungsi "Hash2UInt64" pada bagian lain tutorial ini.

** Baris ke-22 akan menghitung hash dari username menggunakan SHA512, dan
akan mengambil 1 karakter dari tiap kelipatan 8 dari string hasil hash
lalu diubah menjadi unsigned long dan hasilnya disimpan pada variabel
"num2". Untuk fungsi "GetHash", akan dibahas pada bagian selanjutnya.

** Baris ke-23 akan menghitung pengurangan dari hasil konversi serial di
kurangi hasil konversi nama, lalu hasilnya disimpan pada variabel "num3"

** Baris ke-24 akan menghitung hash dari hasil pengurangan tersebut lalu
menguji apakah hashnya sama dengan "1FEDF23C6CB786AA". Jadi secara se-
derhana, fungsinya seperti ini dimana setiap simbol adalah angka dan
nilai x selalu tetap.

x = n_serial - n_username

jadi untuk mengetahui serial, formulanya akan menjadi seperti ini:

n_serial = x + n_username

** Formula di atas terlihat sederhana, namun pada prakteknya cukup memakan
waktu, karena untuk menemukan nilai "x", kita perlu melakukan bruteforce
untuk mengecek nilai hash SHA512 dari "x" tersebut dan menggunakan fungsi
"GetHash" untuk mencocokkan nilanya dengan "1FEDF23C6CB786AA".

** Untuk itu, kita bisa membuat script python sederhana untuk melakukan brute
force. Listing scriptnya seperti ini:

Code:
1 #!/bin/env python
2 import hashlib
3
4 n = 0
5
6 while True:
7 print "[*] Trying: %i \r" % n,
8 h = hashlib.sha512(str(n)).hexdigest()
9 x = "".join([h[i] for i in range(0x80) if ((i % 8) == 0)])
10 if x == "1fedf23c6cb786aa":
11 print "\n[+] Found : %i" % n
12 break
13 n += 1
** Jika dijalankan dalam waktu yang cukup lama, maka hasilnya adalah sebagai
berikut:

Code:
$ ./chk-sha512.py
[*] Trying: 9196707196805196908
[+] Found : 9196707196805196908
** Jadi nilai "x" yang kita cari adalah "9196707196805196908".

** Karena sudah mengetahui nilai "x", maka kita dapat membuat key generator
yang akan dibahas pada bagian key generator pada tutorial ini. Selanjutnya
kita akan melihat skema registrasi ke-2.

* Berikut ini adalah skema registrasi lain yang dapat digunakan untuk melakukan
registrasi Web Cruiser Enterprise yaitu fungsi "ValidateRegCode2"

Code:
1 public static bool ValidateRegCode2(string Username, string RegCode)
2 {
3 try
4 {
5 if (RegCode.IndexOf('-') > 0)
6 {
7 string[] strArray = RegCode.Split(new char[] { '-' });
8 if (strArray.Length != 2)
9 {
10 return false;
11 }
12 string str = strArray[0];
13 string s = strArray[1];
14 uint num = String2UInt32(str);
15 uint num3 = uint.Parse(s) - num;
16 if (GetMD5Hash(num3.ToString()).Equals("B1B77A53F0264B1D"))
17 {
18 _RegOK = true;
19 RegUser = Username;
20 return true;
21 }
22 }
23 return false;
24 }
25 catch (Exception exception)
26 {
27 MessageBox.Show(exception.Message);
28 return false;
29 }
30 }
* Penjelasan untuk baris-baris penting dari kode di atas adalah sebagai berikut

** Baris ke-5 mengecek apakah serial yang dimasukkan memiliki tanda "-". Jika
tidak, maka serial yang dimasukkan invalid.

** Baris ke-7 akan memisahkan serial dengan tanda pemisah "-" dan menyimpan
hasilnya ke dalam array variabel "strArray".

** Baris ke-8 mengecek apakah jumlah arraynya adalah 2. Jika tidak, berarti
serial yang dimasukkan invalid. Jadi format serialnya kurang lebih seperti
ini: AAAA-BBBB

** Baris ke-12 fungsinya menyimpan komponen pertama dari array serial ke
dalam variabel "str" dengan tipe string.

** Baris ke-13 fungsinya menyimpan komponen kedua dari array serial ke dalam
variabel "s" yang tipenya adalah string.

** Baris ke-14 mengubah komponen pertama serial dari string menjadi hash md5
dan hanya mengambil 16 karakter terakhir, lalu dilakukan operasi modulus
0xf4240 (1000000) dan hasilnya disimpan ke dalam variabel "num".

** Baris ke-15 menghitung pengurangan komponen ke-2 serial dikurangi komponen
pertama dan hasilnya di simpan pada variabel "num3".

** Baris ke-16 menghitung hash md5 dari hasil pengurangan di langkah sebelum-
nya dan membandingkan 16 karakter terakhir dengan "B1B77A53F0264B1D", jika
benar, maka proses registrasi berhasil. Jadi secara sederhana, formulanya
kurang lebih seperti ini kalau dalam bahasa php:

Code:
 b1b77a53f0264b1d = substr(md5($s[1] - (hexdec(substr(md5($s[0]), -16)) % 0xf4240)), -16)
atau jika menggunakan python:

Code:
 hashlib.md5(str(10 - (int(hashlib.md5(str(1)).hexdigest()[-16:], 16) % 0xf4240))).hexdigest()[-16:]
** Selebihnya tinggal mencari variabel $s[0] dan $s[1] dan itu akan sangat
memakan waktu. Jadi silakan jika Anda ingin mencobanya. Berikut ini contoh
script yang bisa digunakan untuk melakukan bruteforce, dimana bilangan pe-
ngurang diset statis dengan nilai 1 dan yang dicari adalah bilangan ke-2:

Code:
#!/bin/env python
import hashlib

n = 1

while True:
r = hashlib.md5(str(n - (int(hashlib.md5("1").hexdigest()[-16:], 16) % 0xf4240))).hexdigest()[-16:]
print "[*] Trying: %i - %s\r" % (n, r),
if r == "b1b77a53f0264b1d":
print "\n[+] Found : %i\n" % n
break
n += 1
* Selanjutnya akan kita lihat fungsi-fungsi pendukung dari verifikasi serial
di atas.

** Fungsi "GetHash" untuk menghitung hash sha512 dari string yang menjadi
parameternya. Setelah itu, hanya akan mengambil satu karakter tiap ke-
lipatan 8 dari panjang hash.

Code:
1 private static string GetHash(string Source)
2 {
3 byte[] bytes = Encoding.UTF8.GetBytes(Source);
4 SHA512 sha = new SHA512Managed();
5 char[] chArray = BitConverter.ToString(sha.ComputeHash(bytes)).Replace("-", "").ToCharArray();
6 StringBuilder builder = new StringBuilder();
7 for (int i = 0; i < 0x80; i++)
8 {
9 if ((i % 8) == 0)
10 {
11 builder.Append(chArray[i].ToString());
12 }
13 }
14 return builder.ToString();
15 }
** Fungsi "GetMD5Hash" menggunakan 1 parameter berupa string yang akan di-
hitung hashnya, dan hanya mengambil 16 karakter terakhir dari hash yang
dihasilkan.

Code:
1 private static string GetMD5Hash(string Source)
2 {
3 byte[] bytes = Encoding.UTF8.GetBytes(Source);
4 MD5 md = new MD5CryptoServiceProvider();
5 return BitConverter.ToString(md.ComputeHash(bytes)).Replace("-", "").Substring(8, 0x10);
6 }
** Fungsi "Hash2UInt64" akan menggunakan 1 parameter bertipe string dan meng-
ubahnya dari format hexadesimal menjadi unsigned long dengan ukuran 64 bit

Code:
1 private static ulong Hash2UInt64(string Str)
2 {
3 try
4 {
5 return ulong.Parse(Str, NumberStyles.HexNumber);
6 }
7 catch
8 {
9 return 0L;
10 }
11 }
** Fungsi "String2UInt32" menggunakan 1 parameter bertipe string. Menghitung
hash md5nya dan hanya mengambil 16 karakter dari hash tersebut, lalu di-
ubah menjadi bilangan bertipe unsigned long lalu dioperasikan menggunakan
operator modulus terhadap bilangan 0xf4240 (1000000).

Code:
1 private static uint String2UInt32(string Str)
2 {
3 try
4 {
5 return (uint) (ulong.Parse(GetMD5Hash(Str), NumberStyles.HexNumber) % ((ulong) 0xf4240L));
6 }
7 catch
8 {
9 return 0;
10 }
11 }


-----[ Key Generator

Berikut ini adalah key generator yang dapat digunakan untuk melakukan registra-
si aplikasi Web Cruiser Enterprise. Key generator ini berupa script python, dan
untuk tipe executable bisa menggunakan buatan team mesmerize[5].

Code:
1 #!/bin/env python
2 import hashlib
3
4 u = raw_input("User: ")
5 h = hashlib.sha512(u).hexdigest()
6 x = "".join([h[i] for i in range(0x80) if ((i % 8) == 0)])
7 s = str(hex(9196707196805196908 + int(x, 16))).upper().lstrip('0X').rstrip('L')[-16:]
8 print "Code: %s-%s-%s-%s" % (s[0:4], s[4:8], s[8:12], s[12:16])
Dan cara menggunakannya seperti ini:

Code:
$ ./wckg.py
User: id.slacker
Code: 70A5-56EF-69A0-FA16


-----[ Penutup

Selain membuat key generator, juga bisa ditempuh cara lain yaitu dengan melaku-
kan hard patching karena konstanta "B1B77A53F0264B1D" dan "1FEDF23C6CB786AA"
sifatnya statis pada executablenya, namun perlu diingat bahwa string tersebut
menggunakan unicode. Kedua string tersebut bisa ditemukan pada offset 0x5e1fa
dan 0x5e21c. Sekian tutorial kali ini, semoga bermanfaat. Terima kasih kepada
Tuhan Yang Maha Esa, maxindo, RNDC, nyit-nyit, 1st (you guys rocks), dan Anda.



-----[ Referensi

Code:
[1] форума Xakep.ru
http://forum.xakep.ru/m_2668577/printable.htm

[2] WebCruiser - Web Vulnerability Scanner for Windows V2.6.1
http://sec4app.com/WebCruiser-Web-Vulnerability-Scanner.htm

[3] PROTECTiON iD v6.4.0
http://pid.gamecopyworld.com/

[4] .Net Reflector
http://www.reflector.net/

[5] Team Mesmerize
http://bit.ly/VJlT0z
Author: https://www.facebook.com/id.slacker @ RNDC
Group FB: https://www.facebook...ups/rndc.or.id/
 

Attachments

Top