Monday, December 26, 2011

Pilih patch atau keygen

Lumayan lupa kode-kode assembly yang dulunya pernah saya pelajari khususnya untuk cracking software. Memang sih pada masa itu masih tenar-tenarnya software dari Numega yang bernama softIce sebagai senjata paling utama cracking. Sekarang mencoba kembali mengingat dengan software yang berbeda yaitu OllyDbg. Okelah sebagai pemula kembali saya mencoba untuk melakukan cracking terhadap software latihan "crackme" yang saya dapat dari googling :D. 

Sebelum memulai saya akan menjelaskan tentang bedanya patch dengan keygen. Jadi begini, patch merupakan cara yang dilakukan cracker untuk membypass suatu program dengan merubah  logika yang ada pada kode program. Perubahan kode ini dilakukan dengan mengedit secara langsung tubuh program dengan menggunakan Hexa editor maupun software yang dibuat khusus untuk melakukan editing tubuh program target. Keygen merupakan sebuah software yang dibuat untuk menghasilkan serial dari suatu program yang membutuhkan registrasi. Pembuatan keygen ini lebih sulit dibandingkan patch karena dibutuhkan pemahaman tentang alur dari perhitungan program terhadap input yang dimasukkan user. Berikut ini saya membuat contoh tentang patching  dan keygening pada suatu program. (sangat dasar)

- PATCH -

Pertama saya membuka program yang akan di patch ini menggunakan Olly dan singkat cerita saya telah menemukan bagian program yang membandingkan sesuatu dari register untuk kemudian hasilnya digunakan sebagai penentu apakah program akan menampilkan pesan "salah" atau pesan "benar" seperti berikut :


Program membandingkan isi dari EAX dengan EBX dan ketika sama maka program melompat ke pemanggil pesan "benar" pada alamat 0040124C atau dengan kata lain serial dan user telah benar, sedangkan jika isi dari EAX dan EBX tidak sesuai maka jump dilewati dan program  memanggil subroutine pada alamat 00401362 (pesan kesalahan).


Dari hasil analisa sebenarnya ada beberapa cara yang bisa dilakukan untuk melakukan patching software ini. Misal dengan mengubah jump bersyarat menjadi jump tanpa syarat (JE menjadi JMP), membalik logika jump (JE menjadi JNE) dan mengubah kode pembanding seperti pada gambar di atas yaitu dengan mengubah register sehingga ketika dibandingkan akan selalu sama dan jump akan selalu dieksekusi ;). Setelah dilakukan pengeditan program di dalam memori dan hasil sesuai yang diinginkan maka dilakukan proses editing program secara permanen dengan menggunakan hexa editor kesayangan.


Gambar di atas merupakan gambar sebelum pengeditan, dan gambar di bawah merupakan gambar setelah pengeditan.


Save program hasil edit dan dilakukan testing terhadap pemasukkan nama dan serial palsu :


Tekan OK dan hasilnya seperti berikut :


- KEYGEN -

Masih pada program yang sama, saya mencoba mencontohkan bagaimana keygen itu dibuat. Telah diketahui program akan menampilkan pesan kesalahan ketika dimasukkan sebuah serial yang salah seperti pada gambar berikut.


Dengan modal string tersebutlah saya mencari dimana letak pemanggil dari pesan ini. Melalui Olly saya bisa mencari dengan fasilitas search stringnya.


String dalam program ditampilkan seperti gambar berikut.


Double klik pada string dan saya dibawa menuju lokasi sebuah subroutine yang mengambil string dari memori.


Setelah saya berada pada subroutine yang mengambil string saya mencari kembali lokasi pemanggil dari subroutine ini.



Pada saat ini saya telah dibawa pada program utama yang melakukan pemanggilan terhadap subroutine-subroutine yang ada pada program.


Dari lokasi di atas kemungkinan bisa dilakukan pelacakan perhitungan string nama dan juga serial yang dimasukkan. Pertama saya mencoba menuju subroutine yang dipanggil setelah program mengambil string nama.


Setelah berada pada awal subroutine saya mencoba untuk memberikan breakpoint agar program berhenti ketika subroutine sedang dipanggil.


Kembali ke pemanggil untuk memberikan breakpoint tambahan pada subroutine di bawah serial.




Saya telah memasang dua buah jebakan dalam program, kemudian saya mencoba mengeksekusi program dengan memasukkan nama dan serial.


Setelah dimasukkan tekan tombol OK program berhenti pada breakpiont yang telah dibuat.


Program melakukan pengubahan string dari Lcase menjadi Ucase. Setelah string berubah menjadi huruf besar semua, program memanggil subroutine yang berada pada alamat 004013C2.


Huruf dari nama diolah satu-persatu dari Z,A dan M. Huruf-huruf ini ditampung oleh register BL dan kemudian ascii dari huruf-huruf ini ditambahkan dan ditampung oleh register EDI (5A+41+4D=E8). Setelah selesai sampai huruf terakhir program kembali ke pemanggil.


Isi dari register EDI di xor kan dengan 5678 hexa kemudian hasil xor tampung pada register EAX (5690) dan lompat ke lokasi 004013C1 yaitu return pada program utama.


Simpan EAX pada stack kemudian lanjutkan perhitungan serial :)), baru nama tok...pusing! Okelah langsung saja begini subroutine perhitungan pada serial.


Bisa dilihat AL di isi dengan 0A, BL menampung serial dari awal satu-satu. BL yang berisi ascii dari serial dikurangi dengan hexa 30. EDI berisi perkalian EAX dengan dirinya kemudian ditambah dengan isi dari EBX. Ulangi sampai string serial habis, kemudian hasil perhitungan di xorkan dengan 1234, pindah hasil xor ke register EBX dan kembali ke program utama.
"123" :
  • EDI = (asc(X) - 30) + (EDI*EAX)
  • EDI = (31-30)+(0*0A) = 1
  • EDI = (32-30)+(1*0A) = C
  • EDI = (33-30)+(C*0A) = 7B
  • EDI = 7B XOR 1234 = 124F
  • EBX = EDI
Setelah selesai perhitungan maka program kembali ke pemanggil.


Isi register EAX(5690) dibandingkan dengan EBX(124F), sehingga jump tidak akan dieksekusi. Oke biarpun jump tak dieksekusi, dengan mengetahui perhitungan dari angka yang dibandingkan tersebut saya  dapat membuat algoritma untuk menggenerate serial yaitu (asc(x) xor 5678h xor 1234h). Berikut ini program lengkap keygen yang saya buat dengan bahasa vbs.
Dim Nama, Hasil
Nama=Inputbox("Masukkan nama","Belajar Keygen")
Nama=Ucase(Nama)
    For i = 1 To Len(Nama)
        p = p + Asc(Mid(Nama, i, 1))
    Next
Hasil = p xor &h5678 xor &h1234
msgbox("Nama : " & Nama &""& vbcrlf & "Serial :" &  Hasil)

Download:
Selesai.. :)

Tuesday, December 13, 2011

Sebuah method untuk pengolah replacer yang berada pada collection list


Kode di atas merupakan salah satu kode dalam method yang tergolong penting di dalam kinerja salah satu aplikasi modifikasi data header yang pernah saya buat (zamProx). Prinsip kerja method ini diawali dengan meletakkan matching string input dari user ke dalam sebuah tabel yang kemudian di tampung di dalam collection. Dari collection tersebut, akan dilakukan pencarian string yang sama pada stream  socket. Method ini mengawali kerjanya dengan melakukan perhitungan terhadap banyaknya collection yang dimiliki, jika jumlah melebihi 0 atau collection memiliki isi, program melanjutkan dengan merubah tipe data stream dari StringBuffer menjadi String. Dibuat juga object dari StringBuffer pada variabel ret sebagai nilai kembalian method. Selanjutnya, dimulailah proses manipulasi data dengan pemanggilan method yang disediakan kelas string yaitu replaceFirst() -- mengganti string matching yang pertama kali ditemukan.

NB:
Collection menggunakan Vector 2 dimensi (nama_header dan value_header).

Tuesday, December 6, 2011

Tanya sendiri dan dijawab sendiri


Diketahui sebuah jaringan terdiri dari 6 komputer yang terhubung pada sebuah switch. Alamat IP dari komputer dalam jaringan terlihat seperti pada gambar. 
  • Komputer A : 192.168.10.10/28
  • Komputer B : 192.168.10.14/28
  • Komputer C : 192.168.10.17/28
  • Komputer D : 192.168.10.18/28
  • Komputer E : 192.168.10.33/28 
  • Komputer F : 192.168.10.34/28

Pertanyaan :

Dari konfigurasi pengalamatan IP seperti di atas, komputer mana saja yang terkoneksi (secara logic)?

Jawab :

Diketahui dari konfigurasi seperti di atas (netmask 255.255.255.240) maka komputer yang terkoneksi secara logic adalah :
  • A dengan B
  • C dengan D
  • E dengan F
Semua komputer dalam jaringan terkoneksi secara fisik, namun secara logic tidak semua komputer bisa saling berkomunikasi.

Nilai : 100 (dari total nilai 1000)

Tuesday, November 15, 2011

Membuat file yang tidak bisa dibaca ditulisi dan didelete

Pada kesempatan kali ini saya akan share sebuah trik yang bisa digunakan untuk menangkal pembuatan file autorun.inf oleh "worm" dengan pembuatan sebuah file di dalam flashdisk. Sebenarnya cara ini sudah lama terpublish di dunia luar sana, hanya saja tidak banyak diketahui oleh orang kebanyakan. Lagipula site yang menampung informasi ini telah down selamanya atau telah tutup.

Oke langsung saja tidak terlalu banyak basa-basi, peralatan yang dipakai pada pembuatan file ini yaitu "WinHEX". Untuk informasi mengenai tool ini silakan buka sendiri di sitenya http://x-ways.net/winhex/. Langkah-langkah pembuatan saya tuliskan di bawah ini :

Buat file "Autorun.inf" di dalam flashdisk dengan melakukan klik kanan->new pilih text document, kemudian beri nama file yang tercipta dengan nama "Autorun.inf".


Setelah file tercipta, selanjutnya buka aplikasi WinHEX. Pilih menu tool->Open Disk atau tekan F9.


Untuk membuka isi dari flashdisk, pilih removable medium sesuai drive flashdisk.


Pilih file "Autorun.inf" di dalam viewer WinHex.


Cari string nama file "Autorun.inf".


Edit angka hexa 20 menjadi 40 (explorer mendeteksi ini sebagai device).


Save hasil edit, klik yes pada popup yang muncul.


Untuk memastikan, eject flashdisk dan masukkan kembali.


Langkah terakhir lakukan testing terhadap file "Autorun.inf"

Saya mencoba untuk mendelete file, dan tentu file tidak akan pernah terdelete dan explorer memunculkan pesan error nya.


Ini merupakan contoh pembuatan file yang tak terdelet, dikhususkan untuk antisipasi dari pembuatan file autorun.inf dari worm. Untuk folder sebenarnya bisa juga dilakukan hanya saja ada beberapa perbedaan perubahan lokasi data, sudah dicoba dan berjalan. Mungkin lain waktu akan saya share untuk folder yang tak bisa di delete, atau anda ingin mencobanya? :)


NB: Segala macam error (data hilang, data tak terbaca, atau disfungsi dari flash) ditanggung sendiri. Selamat mencoba.

Monday, October 31, 2011

Jaringan di dalam sebuah laptop

Walau bagaimanapun saya tidak bisa sepenuhnya menggunakan linux sebagai satu-satunya sistem operasi yang dapat mendukung kelangsungan hidup sehari-hari. Sebagian besar praktikum di kampus masih menggunakan perangkat lunak yang berjalan di sistem operasi windows. Terkendala oleh laptop yang tidak  mau diinstall windows, beginilah cara saya menjalankan sistem operasi windows di dalam laptop saya.



Dengan memanfaatkan software dari oracle "VirtualBox" ini saya dapat melaksanakan aktivitas yang mendukung dalam dunia perkuliahan :P~(wkwk..). 
Dan ternyata menggunakan tool ini secara tidak sengaja saya telah membuat sebuah jaringan lokal, antara komputer virtual(windows) dan komputer host (linux). Komputer host bekerja layaknya sebuah router /firewall yang menghubungkan jaringan lokal dengan internet. Terdapat beberapa konfigurasi koneksi yang dapat kita pakai dalam menghubungkan komputer host dengan komputer virtual. Pada komputer saya ini digunakan konfigurasi NAT, yang mirip ketika kita melakukan setting rule firewall dengan memberikan action masquerade pada tabel nat. Tampak seperti gambar di bawah ini.


PC klien sedang melakukan update antivirus AVG melalui koneksi yang ada pada komputer host. Sambungan bisa digambarkan seperti ini :

[klien]--[host]--[internet]

Speednya lumayan tak terlalu berkurang banyak :).

Thursday, October 27, 2011

Perhitungan akar persamaan dengan metode bisection atau metode bagidua

Metode bisection atau metode bagidua merupakan salah satu jenis metode pencarian akar secara incremental yang mana setiap selang dibagi dua. Jika suatu fungsi berubah tanda pada suatu selang, maka nilai fungsi dihitung pada titik tengah. Kemudian lokasi akar ditentukan sebagai terletak pada titik tengah selang bagian tempat terjadinya perubahan tanda. Prosesnya diulang untuk memperoleh taksiran yang diperhalus.

Rumus cek cakupan interval : 

F(XL)*F(XU) < 0

Rumus taksiran akar : 

XR = (XL+XU)/2

Rumus persamaan akar polinom : 

f(x) = a0x0^0 + a1x1^1 + a2x2^2 + … + anxn^n

Rumus cek interval akar :

- Bila akar berada pada interval bawah : F(XL)*F(XR) < 0

- Bila akar berada pada interval atas : F(XL)*F(XR) > 0

- Bila akar setara taksiran (XR) : F(XL)*F(XR) = 0


Kita dapat menuangkan semua rumus-rumus di atas ke dalam sebuah program untuk mempermudah perhitungan akar-akar dari polinom. Berikut ini merupakan langkah algoritma program dalam pembentukkan polinom dan algoritma ketika program mendapat input dari user.

  1. Masukkan nilai derajat tertinggi ke dalam variable N
  2. Masukkan nilai pengali (a) ke dalam variable array NilaiA 
  3. Ulangi langkah 2 sebanyak N+1 kali atau dari N sampai 0 (nilai a dari pangkat tertinggi ke terendah)
  4. Masukkan nilai X taksiran bawah (Lower) -> XL
  5. Masukkan nilai X taksiran atas (Upper) -> XU
  6. Masukkan nilai Error maksimum yang akan dicari -> ES
  7. Masukkan nilai Batas iterasi -> MAXIT
  8. Periksa interval dari perubahan fungsi F(X) dengan rumus F(XL)*F(XU). Jika didapat hasil kurang dari 0 maka perubahan fungsi mencakup seluruh interval.
  9. Jika F(XL) * F(XU) > 0, maka program akan keluar
  10.  Jika F(XL) * F(XU) < 0, maka program melanjutkan dengan menghitung nilai XR (taksiran akar) dengan rumus XR = (XL+XU)/2.
  11. Jika XL+XU tidak sama dengan 0 program menghitung EA (galat)-> Abs((XU - XL) / (XL + XU)) * 100 atau (XRbaru – XRlama) / XRbaru * 100 (hasil sama).
  12. Evaluasi pada variabel XL dan XR untuk menentukan bagian interval. Hasil evaluasi dimasukkan ke variable TEST, dengan rumus F(XL)*F(XR).
  13. Jika TEST = 0 maka EA = 0, berarti akar setara XR (hentikan komputasi).
  14. Jika TEST < 0 maka XU = XR, berarti akar berada pada interval bawah. Tampilkan nilai Iterasi, XL, XU, XR, EA, ES pada listview. Ulangi perhitungan sampai batas iterasi atau batas galat tercapai. 
  15. Jika TEST > 0 maka XL = XR, berarti akar berada pada interval atas. Tampilkan nilai Iterasi, XL, XU, XR, EA, ES pada listview. Ulangi perhitungan sampai batas iterasi atau batas galat tercapai. 
  16. Selesai dan selamat berhitung.

Perwujudan dari algoritma di atas dalam bahasa Visual Basic :

Private Sub Hitung_Click()
 'Definisi Variabel
 Dim XL, XU, XR, ES, EA, MAXIT, ITER, TEST As Double
 XL = Val(txt_XL.Text)
 XU = Val(txt_XU.Text)
 ES = Val(txt_ES.Text)
 MAXIT = txt_MAXIT.Text
ListView1.ListItems.Clear
'Cek Apakah Input Merupakan Numerik
If IsNumeric(XL) = True And IsNumeric(XU) = True And IsNumeric(ES) = True And IsNumeric(MAXIT) = True Then
'    MsgBox Pers(XL) * Pers(XU)
    If Pers(XL) * Pers(XU) < 0 Then
        ITER = 0
        EA = 1.1 * ES
        While EA > ES And ITER < MAXIT
            XR = (XL + XU) / 2
            ITER = ITER + 1
            If XL + XU <> 0 Then
                EA = Abs((XU - XL) / (XL + XU)) * 100
            Else
            End If
            TEST = Pers(XL) * Pers(XR)
            If TEST = 0 Then
                EA = 0
            ElseIf TEST < 0 Then
                XU = XR
            Else
                XL = XR
            End If
            'If EA < ES Then MsgBox "XR = " & XR & ", EA = " & EA & "ITER = " & ITER
            XL = FormatNumber(XL, 8, vbTrue, vbTrue, vbTrue)
            XU = FormatNumber(XU, 8, vbTrue, vbTrue, vbTrue)
            XR = FormatNumber(XR, 8, vbTrue, vbTrue, vbTrue)
            EA = FormatNumber(EA, 8, vbTrue, vbTrue, vbTrue)
            XL = Val(XL)
            XU = Val(XU)
            XR = Val(XR)
            EA = Val(EA)
            With ListView1
                .ListItems.Add , Key:="", Text:=ITER
                .ListItems(ITER).ListSubItems.Add , Key:="", Text:=XL
                .ListItems(ITER).ListSubItems.Add , Key:="", Text:=XU
                .ListItems(ITER).ListSubItems.Add , Key:="", Text:=XR
                .ListItems(ITER).ListSubItems.Add , Key:="", Text:=EA
                .ListItems(ITER).ListSubItems.Add , Key:="", Text:=ES
            End With
        Wend
    End If
Else
    MsgBox "Tentukan Batas Bawah Dan Batas Atas. Ex: XL=-1, XU=2"
End If
End Sub


Monday, October 24, 2011

Polymorphisme dalam pemrograman java

Hari ini tanggal 24 Oktober 2011 terasa sangat panas, sedikit lebih panas dari hari-hari sebelumnya (menurut saya). Pada hari yang panas ini saya mempelajari sebuah sifat dalam pemrograman java yaitu polymorphisme. Apa itu polymorphisme? Polymorphisme dapat digambarkan dengan sebuah objek yang dapat memiliki bermacam-macam sifat. Misal pada variabel yang direferensikan oleh objek dapat melakukan aksi yang berbeda bila tipe objeknya berubah atau diganti.

Ada dua jenis polymorphisme yaitu Override dan Overload. Di dalam java dikatakan bersifat override ketika terdapat method dengan nama, parameter dan tipe data yang sama persis di dalam kelas induk maupun kelas turunannya.


Contoh :
// kelas a sebagai superclass
class a
{
 public void a()
 {
  System.out.println("A");
 }
}

// kelas b sebagai subclass
class b extends a
{
 public void a()
 {
  System.out.println("B");
 }
}

// class utama untuk eksekutor kelas
// dilengkapi dengan method main
public class utama
{
 public  static void main(String[] args)
 {
  a a=new a();
  b b=new b();
  a.a();
  a=b;
  a.a();
 }
}


Overload Polymophisme memiliki perbedaan pada method yang ada. Pada overload polymorphisme terdapat lebih dari satu method dengan nama yang sama tetapi memiliki jumlah parameter maupun tipe data yang berbeda.

Contoh :
// kelas a sebagai superclass
class a
{
 public int ab;
 public void a()
 {
  ab=0;
  System.out.println("A");
 }
 public void a(int ax)
 {
  ab=ax;
  System.out.println("A");
 }
}

// kelas b sebagai subclass
class b extends a
{
 public void a()
 {
  ab=0;
  System.out.println("B");
 }
 public void a(int ax)
 {
  ab=ax;
  System.out.println("B");
 }
}

// class utama untuk eksekutor kelas
// dilengkapi dengan method main
public class utama
{
 public  static void main(String[] args)
 {
  a a=new a();
  b b=new b();
  a.a();
  a.a(10);
  a=b;
  a.a();
  a.a(20);
 }
}
Seperti itulah bentuk polymorphisme dalam java menurut pemahaman yang saya dapatkan. Dan dalam benak saya masih bertanya "seperti apa implementasi sesungguhnya dari polymorphisme ini? dan kenapa harus polymorphisme?" apa karena kehabisan kata-kata untuk membuat nama method? hehe.. entahlah... untuk sementara masih terus belajar. Semoga ada yang terbantu.


Saturday, October 22, 2011

ZamProx solusi aplikasi manipulasi http data di linux

Berawal dari keingintahuan saya terhadap teknik phreaking, maka terciptalah aplikasi ini. Sebenarnya sudah ada aplikasi khusus yang dirancang untuk manipulasi data paket http "ispce", namun aplikasi ispce tersebut hanya mendukung untuk dijalankan pada sistem operasi windows. Dan kebetulan entah nasib entah takdir, laptop saya tidak mau alias ogah di instal windows. Pernah saya bertanya pada laptop saya, kenapa ogah? Diapun menjawab "saya juga tidak tau" hehe....

Jadi seperti ini ceritanya, pada suatu ketika laptop dengan dual os saya tersebut tiba-tiba gak menampakkan gambar pada lcdnya. Kemudian saya membawanya ke service centernya, setelah 3 hari nginep saya dihubungi tukang servisnya untuk jemput laptop saya. Setelah sampai, tukang servis memberikan berita buruk pada saya. Katanya dia gak bisa install windowsnya, dia juga menyuruh saya untuk ganti yang baru karena di dalam telah ada komponen yang terbakar.

Mulai dari situ saya berkali-kali mencoba install windows dari xp, vista dan seven semua menunjukkan reaksi yang sama yaitu hang. Pasrah tak tau mau gimana untuk menginstall windows, saya ambil keputusan untuk install linux. Dan alhasil sempurna bisa lewat lancar tanpa neko-neko sampai saat ini menjadikan saya sebagai pengguna linux sejati (karena terpaksa). 
Hehe, Langsung saja skrinsut terbaru dari aplikasiku zamProx :

 

Aplikasi yang dapat berjalan pada multi os dibuat dengan *bahasa java. Ttd. Murid pak Badi 
- zam


link download saya titipkan di tempat teman :
http://www.sohib378.com/down/download.php?file=zamProx2x.jar.jar

Friday, October 21, 2011

Membatasi Login SSH Per User Pada CentOS

Jurus ini didapatkan ketika saya dan teman saya menyewa sebuah VPS untuk disewakan kembali sebagai perantara koneksi gratisan melalui SSH tunnel. Terus terang sebelumnya saya mencari ke mana-mana tetapi tidak menemukan solusi, entah karena mimimnya pemahaman atau kurang jelas dalam translate bahasa :D.

Oke menuju ke pokok permasalahan, kenapa diperlukan sebuah pembatasan terhadap login user?
Jawabannya, karena kita juga manusia :P~ (canda hehe..), ya karena kita menyewa, kita butuh dana, dan juga kita tidak memberikan kesempatan kepada user yang agak kepinteren yaitu dengan membeli satu akun bisa dipake untuk beramai-ramai.... Baiklah, dari pokok permasalahan tersebutlah terpikirkan sebuah ide untuk membatasi login per user. Tapi bagaimana caranya? (entahlah.. =D).

Oke bro... langsung saja tanpa berlama-lama, dengan ide sendiri saya tuangkan ke dalam sebuah bahasa pemrograman bash.


#!/bin/bash
# Created By zam
arruser=(paijo paimin paino parno dankawannya)
len=${#arruser[@]}
for (( i = 0; i < ${len} ;i++ ))
do
 if [ `ps f -N -u root|grep -v grep|grep -c ${arruser[$i]}` -gt "1" ]; then
  for x in `ps f -N -u root | grep -v grep | grep ${arruser[$i]} | awk '{print $1}'`; do kill -9 $x; done
 fi
done

Silakan baca kodenya untuk mengetahui algoritmanya, :). Semoga bermanfaat!

Thursday, May 26, 2011

Crazy blue planet

Tema yang menggambarkan kesemrawutan sebuah planet berpenghuni manusia di masa yang akan datang :)

Saturday, May 21, 2011

File .asoundrc solve my old problem =D

Dengan menggunakan window manager yang serba manual memang membutuhkan lebih banyak kesabaran. Mau ini mau itu tidak bisa langsung klik dan jadi. Semua harus dikonfigurasi dengan tepat, seperti pada program pengolah suara alsa ini. Tanpa file konfigurasi ini Penggunaan device suara akan dilayani secara bergantian, misal ketika dijalankan  2 buah aplikasi yang memberikan output suara maka yang  berbunyi hanya program yang lebih dulu start dengan kata lain tidak ada aplikasi yang bisa menggunakan device suara selama device masih dipakai oleh aplikasi lain. Dengan file .asoundrc ini request penggunaan suara bisa bersamaan seperti multithreading menurut saya :P. Berikut isi dari file tersebut : 

"~/.asoundrc"
###
pcm.ossmix {
    type dmix
    ipc_key 1024 
    slave {
        pcm "hw:0,0"
        period_time 0
        period_size 1024
        buffer_size 8192
    }
    bindings {
        0 0
        1 1
    }
}
pcm.dsp0 {
    type plug
    slave.pcm "ossmix"
}
ctl.mixer0 {
    type hw
    card 0
}
pcm.default pcm.dsp0