Pages

Friday, September 7, 2012

Mengenal Angka Biner Pada Komputer


Pada dasarnya komputer adalah makhluk digital yang hanya mengerti angka 1 dan 0 saja (binary). Komputer hanya mau menerima data dalam bentuk biner dan juga hanya bisa mengerti perintah dalam bentuk biner. Perintah dalam bentuk biner ini disebut dengan bahasa mesin.

Bahasa assembly adalah mnemonic dari instruksi bahasa mesin ( biner) yang disebut opcode, jadi programmer tidak memprogram dengan bahasa mesin(biner) secara langsung  tetapi mereka awalnya memprogram dengan mnemonic dari intruksi bahasa mesin yaitu "Assembly".

Setiap prosesor (otak komputer) memiliki instruction set masing-masing,sehingga bahasa assembly untuk prosesor Intel akan berbeda dengan assembly untuk prosesor lainnya.  Namun karena intel menguasai pangsa pasar prosesor maka hampir semua produsen prosesor membuat instruksi set yang kompatibel dengan intel. jadi yang kita pelajari adalah instruksi set dari intel.



Ada beberapa jenis bilangan biner yang dibedakan yaitu: "Machine Instruction" dan "Data Code"
pada dasarnya untuk mengerti sebuah kode biner harus dalam "Runtime Instruction" atau pada saat debug program.

1. Machine Instruction yaitu: sebuah kode perintah kepada komputer dengan berbentuk biner yang memiliki ukuran sekian "Byte" per intruksi misalkan untuk intruksi "mov eax,5" memiliki ukuran 2 byte per intruksi
yaitu angka binernya adalah 10110111000. sebenarnya intruksi ini akan membaca 5 byte pada 32 bit prosesor tetapi karena nilai operan keduanya adalah "5" maka 3 byte selanjutnya nilainya 00 sehingga intruksi "mov eax,5" ukurannya hanya 2 byte saja. presentasi dalam memmorynya adalah B8 05 00 00 00
lihatlah 3 byte dari kanan yaitu nilainya 0.

2. Data Code yaitu: sebuah data kode untuk prosesor yang tersimpan secara sementara pada RAM komputer dan juga memiliki ukuran sekian "Byte" per satu baris data. misalkan RAM menyimpan data string "aku" dengan ukuran 1 byte per karakter yaitu nilai binernya adalah 11101010110101101100001 yang memiliki ukuran 3 byte.

misal contoh data code:
#ascii code(bisa 4 atau 2 atau 1 byte ukuran string)
#Floating Point (bilangan ber koma yg di presentasikan dengan integer pada RAM komputer) lihat Floating Point
#data Integer... dll

contoh Machine Instruction:
pada dasarnya sebuah intruksi yg berjalan mempunyai sub prosedur ataupun function prosedur
misal suatu intruksi copy memory:
010111000111 dengan parameter ,
dengan tujuan 32 bit addres "00100c00": 000000000001000000001100000000000000 dan Nilai operannya adalah "0x54" yaitu 1010100
kemudian digabungkan secara terbalik Nilai-Tujuan-Instruction code
jadilah sebuah instruksi 1010100000000000001000000001100000000000000010111000111
artinya isikan addres 00100c00 dengan nilai 0x54
hal ini sama dengan intruksi assembly "mov[00100c00],54h" cm yg dijelaskan versi biner nya

jika intruksi berjalan pada function prosedur yang mempunyai 1 parameter dengan ukuran 4 byte karena parameter itu disimpan di stack maka di akhir intruksi harus diberi biner: 11000010 dengan operan 4 byte.
jadi penulisannya "Jumlah Byte"-"Instruction Code"
sehingga kode biner aslinya adalah 10011000010
artinya menghapus parameter memory yg ada di stack sebesar 4 byte
hal ini sama dengan intruksi assembly "ret 4" cm yg dijelaskan versi biner nya
jika tidak ada intruksi ini diakhir main instruction maka komputer km akan hank coba saja..!!

Representasi "Float Point" VB6



Representasi bilangan yang berkoma/desimal atau biasa disebut float atau "Single" pada VB. pada Memory Komputer.
sekian lama udah gak nulis artikel baru lagi di blog ini. akhirnya baru bisa juga, untuk berbagi ilmu disini.. 
representasi tipe data float/Single yang digunakan compiler/ide pada "Visual Basic".
kebanyakan prosesor tidak mensuport secara langsung untuk operasi bilangan floating-point (bilangan berkoma), karena hanya memiliki unit aritmetika dan logika, dan unit kontrol yang beroperasi berdasarkan pada integer saja.
biasanya ini juga bagian terpenting yang perlu diketahui jika anda ingin belajar assembly atau developer language programming. tapi silahakan dibaca untuk sekedar pengetahuan para programmer2.

nah pada gambar, adalah representasi tipe data Single pada VB yang diisi dengan nilai 5.53 pada memory komputer.
lihatlah pada kotak warna merah pada memory(sebelah kanan) format yang ditunjukan adalah "Byte Array" coba kalian baca nilainya per element Byte Arraynya dari kanan yang sudah saya kotakan.. yaitu representasi nilainya menjadi 40B0F5C3h (ingat bilangan heksa) dengan ukuran 32bit/4byte, nah lho gimana nyambungnya coba dari 5.53 kok bisa jadi 40B0F5C3h pada memory... nah ini dia yang kita pelajari adalah bagaimana prosesor mengerti berapa nilai float point asli dan representasi "Single precision binary floating-point 32bit" (tipe data nya adalah Single pada VB)

dalam floating point dengan format 32 bit, sebuah angka yang dikonversi kedalam bentuk biner, misal 40B0F5C3 memiliki angka biner yaitu: "1000000101100001111010111000011" (bisa pake kalkulator windows) karena jumlah digit binernya hanya memiliki 31 digit dan kita memakai format ukuran 32bit maka akan ditambahkan 1 digit angka lagi dipaling depan dengan nilai 0 agar sesuai dengan format 32bit yaitu menjadi "01000000101100001111010111000011" 
intinya adalah, tidak boleh ada awalan 0 dalam notasi yang akan dioperasi
format 32bit kemudian terbagi menjadi 3 bagian yaitu:
1. Sign -> dengan ukuran 1bit
2. Eksponen -> dengan ukuran 8bit
3. Mantissa -> dengan ukuran 23bit

kemudian kita pisah2 kan dahulu ketiga bagian tersebut:
0 10000001 01100001111010111000011
ketiga bagian tersebut akan kita olah menjadi bilangan desimal..

#pertama untuk menentukan nilai itu positif atau negatif kita menggunakan bagian sign bit yaitu "jika nilai sign 0 maka bilangannya adalah positif, jika nilai sign 1 maka bilangannya adalah negatif".

#kedua pada bagian exponen memiliki nilai: 81h (heksa). untuk mendapatkan nilai exponen asli kita bisa kurangkan nilai 81h dengan 7Fh dan nilai exponen asli yang kita gunakan adalah 2

#ketiga pada bagian Mantissa -> pertama kita tambahkan 1 pada awalan Mantissa yaitu menjadi 1.01100001111010111000011 nah karena eksponen aslinya adalah 2 kita geser koma nya 2 bit kekanan yaitu menjadi 101.100001111010111000011

nah kalau sudah begini notasi biner nya dibagi menjadi 2 bagian yaitu: notasi pada sebelah kirinya koma adalah nilai integer yaitu 5 dan di sebelah kanan adalah nilai yang akan kita operasikan yaitu rumusnya:
(n1*2^-1) +( n2*2^-2) + (n3*2^-3).... dan seterusnya kalo kalian itungin pake manual sih kelamaan langsung pake kode VB saja!


Function CalcMantissa(biner As String) As String
Dim rtrn As Single
Dim p As Integer
Dim n As String
p = -1
For i = 1 To Len(biner)
n = Mid(biner, i, 1)
rtrn = rtrn + (n * 2 ^ p)
p = p - 1
Next
CalcMantissa = rtrn
End Function


parameternya yaitu notasi Mantissa yang sudah digeser koma nya yaitu "100001111010111000011"
pemanggilan fungsinya : MsgBox CalcMantissa("100001111010111000011")
dan nilai yang keluar adalah 0,53
kemudian digabungkan dengan nilai integer menjadi 5.53 karena sign bit 0 maka bilangan tersebut positif

Friday, December 16, 2011

Tutorial Membuat Cheat Game Dengan Vb6 [Part 3]

sesuai janji saya di postingan Tutorial Membuat Cheat Game Dengan Vb6 [Part 2]. dipostingan tersebut udah mempelajari tentang API2 apa yang kita butuhkan saat melakukan proses hacking dan cara menggunakan API tersebut untuk merubah data dari Memory Address. kalau di postingan part2 hanya mempelajari tentang cara mengubah data memory address aja itu juga prosessnya pada notepad bukan di game.. kalau untuk game bagaimana? nah itu dia yang akan kita bahas.

oke langsung aja alat yang dibutuhkan disini adalah:
-Cheat Engine (versi berapa aja)
-visual basic 6

juga dibutuhkan ketelitian dan pantang menyerah dalam mempelajari tehnik - tehnik cracking
disini kita menggunakan game PlantsVsZombies untuk sebagai contoh, soalnya cuma ada game itu saja di kompi saya.. hehehe
tutorial ini tentang bagaimana penghackan jumlah sun di game tersebut.
sekarang buka Cheat Engine kalian dan open process pada gamenya.
pilih pada scan type: "exact value" dan value type: "4 byte" kemudian masukanlah jumlah sun yang kalian punya contoh: 50 lalu klik "First Scan" setelah keluar banyak address kembali ke game ubah sun kalian misalnya kalian mengambil matahari atau menanam tanaman sehingga Sun nya akan berubah. setelah itu kalian masukan lagi sun yang telah berubah nilainya ke kotak value pada cheat engine lalu klik next sehingga kalian mendapat 1 buah address saja. jika kalian mendapatkan lebih dari 1 ulangi cara tadi sampai kalian mendapatkan 1 address. setelah ketemu addressnya masukan address nya ke table cheat engine. seperti gambar dibawah
sip setelah ketemu address sun nya tinggal kita masukan ke visual basic 6 tapi tunggu dulu
address yang kita scan dan dapatkan tadi bukanlah address yang static. address tersebut dapat berubah ketika game nya relog atau game tersebut dicoba pada komputer lain. sekarang kita lanjut tutorialnya cara mencari address yang tidak dinamis biasanya disebut pointer.
klik kanan pada address di table kemudian klik "Find out what writes to this address" jika ada pesan klik yes saja nanti akan muncul kotak dialog kosong seperti gambar dibawah
disini kita mencari address lain yang mem-write data dari address sun tersebut.
setelah muncul kotak dialognya kalian kembali ke game lalu lakukan perubahan pada nilai sun (saran perubahan sun sebaiknya naik sebesar 25 yaitu dgn cara mengambil sun yang jatuh kebawah) . setelah melakukan perubahan pada Sun nantinya akan muncul seperti ini:
klik lah address nya lalu kalian klik More Information sehingga akan muncul seperti ini:
lihatlah intruksi assembly pada address yang berwarna merah pada gambar diatas yaitu:
add [eax+00005560],ecx <- apa artinya intruksi diatas?
jika kita sudah mengenal intruksi dasar pada assembly pasti kita tahu apa artinya kode diatas?
kita lihat pada kata kunci "add"(tulisan berwarna merah) intruksi ini terdiri atas 2 parameter jika dilihat parameter kesatu adalah berwarna hijau dan parameter kedua adalah berwarna biru
kode ini mengintruksikan parameter pertama ditambah oleh parameter kedua.
coba kita lihat pada parameter pertama: [eax+00005560] -> apa artinya ini? kita lihat pada register bernama "eax" lihatlah pada gambar diatas yang saya lingkari
"EAX =102E30B0" jadi parameter pertama ini mengacu pada address EAX + 5560
artinya 102E30B0+5560 silahkan kalian buktikan di calculator windows dengan menjumlahkan kedua bilangan tersebut ingat bilangan ini berbentuk hexa maka hasilnya adalah address Sun yang kalian dapat tadi.
lihatlah register bernama "ecx"(parameter kedua) jika lihat gambar diatas nilai yang tersimpan pada register "ecx" adalah 19 (dalam bentuk bilangan hexa) jika dirubah ke angka decimal adalah 25. mengapa 25? karena saya telah melakukan perubahan nilai Sun sebesar '25'
jadi arti intruksi jika diterjermahin lagi artinya "tambahkan pada address eax+5560 dengan ecx"
atau lebih mudahnya tambahkan Address Sun dengan nilai sebesar 25.
ingat kode diatas hanya berlaku pada anda yang melakukan perubah nilai Sun menambah bukan berkurang.

oke kembali ke topik bagaimana cara mencari Address yang tidak statis? jika kita lihat pada intruksi tadi nilai "5560" adalah offset dan "eax" adalah nilai yang akan ditambahkan offset nantinya. kedua nilai tersebut adalah pointer penunjuk ke alamat address sun yang kalian temukan tadi. jadi kembalilah ke cheat engine centrang Hex lalu masukan value "eax" pada intruksi assembly tadi yaitu: 102E30B0 kemudian klik new scan dan setelah itu akan muncul banyak address kalian pilih yang paling atas dan masukan ke table Cheat Engine seperti gambar di bawah:
bisa kita liat pada contoh gambar diatas address yang kita dapat adalah 0018926C inilah address statis yang bisa kita gunakan sebagai pointer untuk menunjukan alamat dari address sun.
ada untuk pointer rumusnya begini:
Address = value dari address 0018926C + offset yang kalian dapat tadi. hal ini mirip dengan pointer pada parameter pertama dari intruksi add [eax+00005560],ecx dimana value dari address 0018926C merupakan nilai dari register "eax". oke sekarang tinggal gimana coding nya pada vb6, perhatikan code dibawah ini

CODE
'declare dulu
Private Declare Function GetWindowThreadProcessId Lib "user32" _
(ByVal hwnd As Long, lpdwProcessId As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal _
dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal _
dwProcessId As Long) As Long
Private Declare Function WriteProcessMemory Lib "kernel32" ( _
ByVal hProcess As Long, ByVal lpBaseAddress As Any, _
lpBuffer As Any, _
ByVal nSize As Long, _
lpNumberOfBytesWritten As Long) As Long
Private Declare Function FindWindow Lib "user32" Alias _
"FindWindowA" (ByVal IpClassname As String, ByVal IpWindowName _
As String) As Long
Private Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
Private Declare Function CloseHandle Lib "kernel32.dll" (ByVal hObject As Long) As Long
Dim Hwndx As Long
Dim PID As Long
Dim OpenX As Long
Dim BaseAddr As String
Private Function ReadMemory(Address As Long) As Long 'modul ini berfungsi untuk membaca value dari base address
'fungsi ini hanya dapat membaca value hanya sampai jangkauan Signed Long (32,767)
Dim OpenZ As Long, PID As Long
Hwndx = 0
Hwndx = FindWindow("MainWindow", vbNullString) 'mencari windows
If Hwndx = 0 Then Exit Function
GetWindowThreadProcessId Hwndx, PID
OpenZ = OpenProcess(&H10, False, PID)
If OpenZ = 0 Then Exit Function
ReadProcessMemory OpenZ, Address, ReadMemory, 4, 0&
CloseHandle OpenZ
End Function

Private Function WriteMMry(Addres As Long, Value As Long)'modul ini berfungsi untuk mem-write memory
Hwndx = 0
Hwndx = FindWindow("MainWindow", vbNullString) 'mencari windows
If Hwndx = 0 Then
MsgBox "Game Tidak Ditemukan!", vbCritical, "Error"
Exit Function
End If
GetWindowThreadProcessId Hwndx, PID 'mendapatkan ProcessID target
OpenX = OpenProcess(&H1F0FFF, False, PID) 'membuka akses pada program
If OpenX <> 0 Then WriteProcessMemory OpenX, Addres, Value, 4, 0&
CloseHandle OpenX
End Function
sekarang bagaimana cara memanfaatkan pointer untuk mencari address sun tadi pada modul di vb6
untuk pemanggilan fungsi nya dan sekaligus cara penulisan pointer di vb6:

CODE
BaseAddr = ReadMemory(&H18926C) 'membaca value dari base address
BaseAddr = Val(BaseAddr) + Val(&H5560) 'penambahan, ini sebagai pointer ke address
WriteMMry "&h" & Hex(BaseAddr), 9999 'mem-write address sun dengan nilai 9999
jika kalian melakukan tutorial ini dengan benar kalian telah berhasil membuat suatu cheat game /trainer yang bisa di pakai di komputer orang lain. bagi yang ga ngerti comment aja kalau sempet tak jawab kok. bagi yang gak mudeng2 jangan pernah putus asa!