Reverse ile Login ByPass
8 min read

Reverse ile Login ByPass

Reverse ile Login ByPass

Giri┼č ­čŚú´ŞĆ

Selamlar,

Bu yaz─▒ serimizde kolaydan zora do─čru masa├╝st├╝ uygulamalar─▒n login ekranlar─▒n─▒ nas─▒l atlayaca─č─▒m─▒z─▒ anlatmaya ├žal─▒┼čaca─č─▒m. Bu bilgiler e┼čli─činde bir uygulamaya ko┼čul ile lisans sorgusu veya kullan─▒c─▒ bilgisi isteyen bir ekran kar┼č─▒s─▒nda neler yap─▒labilece─čini ├Â─črenmeye ├žal─▒┼čaca─č─▒z. Uygulamalarda ├žok ├že┼čit do─črulama kod algoritmas─▒ vard─▒r. Bu makale ├╝zerinde anlataca─č─▒m uygulama asl─▒nda bir nevi crackme olarak adland─▒r─▒lan k─▒rmak i├žin yazd─▒─č─▒m bir uygulama. Basit├že if ile kontrol sa─član─▒yor. Kullan─▒c─▒ ad─▒ ve ┼čifre sabit. Asl─▒nda decompile edilse bile yine de kullan─▒c─▒ ad─▒ ve ┼čifreye ula┼č─▒labilir. Geli┼čtirici aspack veya upx ile pack etmi┼č ise belki biraz dolan─▒r─▒z veya obfuscator metotlar─▒ndan birini kullanm─▒┼č ise yine biraz u─čra┼č─▒rd─▒k ama 1.seviye anlat─▒m oldu─čundan en kolay ┼čekilde anlatmaya ├žal─▒┼čaca─č─▒m. Seviye 2,3,4 diye devam edecek yaz─▒ dizimiz de i┼čleri zorla┼čt─▒rarak baz─▒ konular─▒ netle┼čtirmeye ├žal─▒┼čaca─č─▒m.

Kullan─▒lan Ara├žlar ­čŤá´ŞĆ

Kulland─▒─č─▒m─▒z debug arac─▒ OllyDbg. OllyDbg uygulamas─▒ ile uygulamam─▒z─▒n login kontrol├╝ devre d─▒┼č─▒ b─▒rakmaya ├žal─▒┼čaca─č─▒z.

Ad─▒m 1 - Uygulamay─▒ ─░zleyelim ­čÖł

Uygulamam─▒z yukar─▒da g├Âsterildi─či ┼čekilde bir tasar─▒ma sahip. Amac─▒m─▒z ise do─čru bilgileri girdi─čimizi teyit ettiren mesaj─▒ yakalamak. Standart bir ┼čekilde birka├ž test yap─▒yoruz. Kullan─▒c─▒ ad─▒ olarak admin, ┼čifre olarak da admin ┼čeklinde bir test ger├žekle┼čtiriyorum.

Bu k─▒s─▒mda zaten yanl─▒┼č oldu─čunu belirten mesaj mevcut. Mesaj yap─▒s─▒ndan hangi adreste bu mesaj─▒n ├ž─▒kt─▒─č─▒n─▒ tespit edip, gerekli breakpointleri koyarak ilgili ko┼čulu ters ├ževirerek bu durumu bypass etmeye ├žal─▒┼čaca─č─▒z.

Ad─▒m 2 - OllyDbg ile ─░zleyelim ­čöŹ´ŞĆ

Uygulamam─▒z─▒ ilgili tool ile a├ž─▒yoruz. OllyDbg hakk─▒nda temel bilgilere ┼ču makaleden ula┼čabilirsiniz. ┼×imdi ilk olarak ilgili adrese ula┼čman─▒n bir yolu belirli bir string de─čerini arat─▒p o adrese ula┼čmakt─▒r. Bunu a┼ča─č─▒daki ad─▒mlar ile ger├žekle┼čtiriyoruz:

  1. Bu a┼čamada t├╝m referans disassembly olmu┼č text tabanl─▒ verileri listeliyoruz.

  2. Sonras─▒nda ise i├žerisinde arama ger├žekle┼čtirmek i├žin arama formunu a├ž─▒yoruz.

  3. Mesaj yap─▒s─▒n─▒ referans alaca─č─▒m─▒z─▒ baz alarak "Bilgiler yanl─▒┼č..." gibi bir mesaj kar┼č─▒l─▒yordu. T├╝rk├že karakterlerin ASCII veya farkl─▒ bir format ile yaz─▒ld─▒─č─▒n─▒ baz alarak ─░ngilizce'ye uyumlu olan "Bilgiler" kelimesi ile arama ger├žekle┼čtiriyorum.

  4. Evet, ilgili texti bulduk. Çift tıklayarak ilgili adrese gidiyoruz.

  5. ─░lgili adrese geldikten sonra incelemelerde bulunaca─č─▒z. Bunun i├žin i┼člemin ba┼člad─▒─č─▒ k─▒s─▒ma breakpoint koyarak uygulamam─▒z─▒ izleyece─čiz.

Assembly Bilgilendirmesi Ôä╣´ŞĆ

Bizim plan─▒m─▒z if ko┼čulunu di─čer ad─▒yla ┼čartl─▒ dalland─▒rmay─▒ ters ├ževirerek do─čru bilgi haricinde her t├╝rl├╝ kullan─▒c─▒ ad─▒ ve ┼čifreyi do─čru alg─▒lamas─▒n─▒ sa─člamakt─▒. Biraz d├╝┼č├╝nelim... Standart bir yaz─▒l─▒mda kullan─▒c─▒ ad─▒ ve ┼čifre ikili ko┼čul ile kodlan─▒r. Yani ├Ârnek verecek olursam;

C#

if (a == a & b==b) 
{

}

Delphi

if (a = a) AND (b = b) then
begin

end;

PHP

if (a == a && b==b)
{

}

Tek bir ko┼čul olarak g├Âz├╝kse de iki farkl─▒ ko┼čul mevcut. Assembly de ko┼čulu belirten komutlar JNZ, JNE, JE gibi komutlard─▒r. Bunlar─▒ tek tek anlataca─č─▒m ┼čimdi(sadece e┼čittir ve e┼čittir de─čil komutlar─▒ i├žin);

JE komutu e┼čit ko┼čullar i├žin kullan─▒l─▒r. Bu komutun kar┼č─▒t komutu ise JNE komutudur. JZ komutu ile ayn─▒ i┼čleve sahiptirler.
JNE komutu ise e┼čit de─čildir ko┼čulu i├žin kullan─▒l─▒r. Bu komutun kar┼č─▒t komutu yukar─▒da belirtti─čim JE komutudur. JNZ ile ayn─▒ i┼čleve sahiptir.

Breakpoint ile ─░zleme ­čöŹ´ŞĆ

Bu a┼čamada PUSH komutunun oldu─ču yerden ba┼člatarak biraz ba┼čtan almay─▒ denedim.

Breakpoint'lerden ald─▒─č─▒m sonu├žlar─▒ kod ┼čeklinde yazaca─č─▒m:

005EB604  /. 55             PUSH EBP
005EB605  |. 8BEC           MOV EBP,ESP
005EB607  |. 33C9           XOR ECX,ECX
005EB609  |. 51             PUSH ECX
005EB60A  |. 51             PUSH ECX
005EB60B  |. 51             PUSH ECX
005EB60C  |. 51             PUSH ECX
005EB60D  |. 51             PUSH ECX
005EB60E  |. 51             PUSH ECX
005EB60F  |. 51             PUSH ECX
005EB610  |. 51             PUSH ECX
005EB611  |. 53             PUSH EBX
005EB612  |. 8BD8           MOV EBX,EAX //EAX, EBX gibi registerlar ile bo┼čluk hesaplamas─▒ ve daha sonra kontrol├╝ yap─▒l─▒yor. Bu komuttan **005EB63F** adresinde ki ko┼čula kadar iki textbox'─▒n i├žerisinde ki textleri kontrol ederek veri giri┼či olup olmad─▒─č─▒ kontrol ediliyor.
005EB614  |. 33C0           XOR EAX,EAX
005EB616  |. 55             PUSH EBP
005EB617  |. 68 33B75E00    PUSH Project1.005EB733
005EB61C  |. 64:FF30        PUSH DWORD PTR FS:[EAX]
005EB61F  |. 64:8920        MOV DWORD PTR FS:[EAX],ESP
005EB622  |. 8D55 F8        LEA EDX,DWORD PTR SS:[EBP-8]
005EB625  |. 8B83 D4030000  MOV EAX,DWORD PTR DS:[EBX+3D4]
005EB62B  |. E8 DC4DF4FF    CALL Project1.0053040C
005EB630  |. 8B45 F8        MOV EAX,DWORD PTR SS:[EBP-8]
005EB633  |. 8D55 FC        LEA EDX,DWORD PTR SS:[EBP-4]
005EB636  |. E8 C582E3FF    CALL Project1.00423900
005EB63B  |. 837D FC 00     CMP DWORD PTR SS:[EBP-4],0
005EB63F     74 1F          JE SHORT Project1.005EB660 // JE komutu ile e─čer data bo┼č ise gerekli komutlar─▒ uygulamas─▒ i├žin **005EB660** adresi ├ža─č─▒r─▒l─▒yor.
005EB641     8D55 F0        LEA EDX,DWORD PTR SS:[EBP-10]
005EB644     8B83 D8030000  MOV EAX,DWORD PTR DS:[EBX+3D8]
005EB64A  |. E8 BD4DF4FF    CALL Project1.0053040C
005EB64F  |. 8B45 F0        MOV EAX,DWORD PTR SS:[EBP-10]
005EB652  |. 8D55 F4        LEA EDX,DWORD PTR SS:[EBP-C] //girdi─čimiz kullan─▒c─▒ ad─▒n─▒ al─▒yor.
005EB655  |. E8 A682E3FF    CALL Project1.00423900
005EB65A  |. 837D F4 00     CMP DWORD PTR SS:[EBP-C],0
005EB65E     75 12          JNZ SHORT Project1.005EB672 //JNZ ile do─čru olup olmad─▒─č─▒ kontrol ediliyor.
005EB660  |> 83C9 FF        OR ECX,FFFFFFFF
005EB663  |. 83CA FF        OR EDX,FFFFFFFF
005EB666  |. B8 4CB75E00    MOV EAX,Project1.005EB74C
005EB66B  |. E8 5C1AF7FF    CALL Project1.0055D0CC
005EB670  |. EB 76          JMP SHORT Project1.005EB6E8
005EB672  |> 8D55 EC        LEA EDX,DWORD PTR SS:[EBP-14]
005EB675  |. 8B83 D4030000  MOV EAX,DWORD PTR DS:[EBX+3D4]
005EB67B  |. E8 8C4DF4FF    CALL Project1.0053040C
005EB680  |. 8B45 EC        MOV EAX,DWORD PTR SS:[EBP-14] //yazm─▒┼č oldu─čumuz ┼čifre EAX register─▒na aktar─▒l─▒yor
005EB683  |. 50             PUSH EAX /// EAX PUSH ile y─▒─č─▒n haf─▒zaya aktar─▒l─▒yor.
005EB684  |. 8D55 E8        LEA EDX,DWORD PTR SS:[EBP-18] ///olmas─▒ gereken ┼čifre olu┼čturuluyor.
005EB687  |. B8 F4B55E00    MOV EAX,Project1.005EB5F4
005EB68C  |. E8 133EE2FF    CALL Project1.0040F4A4
005EB691  |. 8B55 E8        MOV EDX,DWORD PTR SS:[EBP-18]
005EB694  |. 58             POP EAX ///PUSH haf─▒zaya aktar─▒rken POP ise haf─▒zadan  olmas─▒ gereken ┼čifreyi al─▒yor.
005EB695  |. E8 5EF4E1FF    CALL Project1.0040AAF8
005EB69A     75 3C          JNZ SHORT Project1.005EB6D8 /// ko┼čul ile kontrol ediliyor...Bu kontrol ile kontrol yani kullan─▒c─▒ ad─▒ kontrol├╝.
005EB69C  |. 8D55 E4        LEA EDX,DWORD PTR SS:[EBP-1C] //burada ise ┼čifreler tekrardan set edilerek ikinci ko┼čul yani AND(&)'den sonra gelen ┼čifre kontrol├╝n├╝ kaps─▒yor.
005EB69F  |. 8B83 D8030000  MOV EAX,DWORD PTR DS:[EBX+3D8]
005EB6A5  |. E8 624DF4FF    CALL Project1.0053040C
005EB6AA  |. 8B45 E4        MOV EAX,DWORD PTR SS:[EBP-1C]
005EB6AD  |. 50             PUSH EAX
005EB6AE  |. 8D55 E0        LEA EDX,DWORD PTR SS:[EBP-20]
005EB6B1     B8 FCB55E00    MOV EAX,Project1.005EB5FC
005EB6B6     E8 E93DE2FF    CALL Project1.0040F4A4
005EB6BB  |. 8B55 E0        MOV EDX,DWORD PTR SS:[EBP-20]
005EB6BE     58             POP EAX
005EB6BF  |. E8 34F4E1FF    CALL Project1.0040AAF8
005EB6C4     75 12          JNZ SHORT Project1.005EB6D8 //─░kinci ko┼čulda burada kontrol ediliyor. Sonras─▒ zaten mesajlar g├Âsteriliyor. ┼×imdi kod modundan d├Ân├╝p normal moda d├Ân├╝yoruz.
005EB6C6  |. 83C9 FF        OR ECX,FFFFFFFF
005EB6C9  |. 83CA FF        OR EDX,FFFFFFFF
005EB6CC  |. B8 98B75E00    MOV EAX,Project1.005EB798                ;  UNICODE "Bilgiler do"
005EB6D1  |. E8 F619F7FF    CALL Project1.0055D0CC
005EB6D6  |. EB 10          JMP SHORT Project1.005EB6E8
005EB6D8  |> 83C9 FF        OR ECX,FFFFFFFF
005EB6DB  |. 83CA FF        OR EDX,FFFFFFFF
005EB6DE  |. B8 F8B75E00    MOV EAX,Project1.005EB7F8                ;  UNICODE "Bilgiler yanl"

┼×imdi yukar─▒da incelemi┼č oldu─čumuz bellek aral─▒─č─▒ var. Biz iki ko┼čulu tespit ettik. AND ile kontrol edildi─či i├žin iki ko┼čul mevcut. Biri yanl─▒┼č olunca di─čerine u─čramadan zaten "garda┼č─▒m yanl─▒┼č nereye" diye s├Âyleniyor uygulama. Biz ilk ko┼čulu yani 005EB69A adresinde ki ko┼čulu de─či┼čtirsek bile ┼čifrede tak─▒laca─č─▒ i├žin bizim hem 005EB69A adresindeki hem de 005EB6C4 adresindeki ko┼čuluda terse ├ževirmemiz gerekecek. "Ya hak!" diye zehirli okumuzu f─▒rlat─▒yoruz.

005EB65E     75 12          JNZ SHORT Project1.005EB672
005EB69A     75 3C          JNZ SHORT Project1.005EB6D8

Normalde bu iki ko┼čul alt alta de─čil ama yukar─▒daki b├Âl├╝mden kestim. Adreslerden zaten bulabilirsiniz. ┼×imdi biz bu iki komutu tersi yaparak t├╝m kullan─▒c─▒ adlar─▒n─▒ kabul etmesini sa─člayaca─č─▒z. Hemen tersi komutlar─▒ yukar─▒da anlatt─▒m ger├žekle┼čtiriyoruz.

005EB65E     75 12          JE SHORT Project1.005EB672
005EB69A     75 3C          JE SHORT Project1.005EB6D8

De─či┼čimi ger├žekle┼čtirdik. ┼×imdi uygulamam─▒z─▒ derleyip test edelim. Ba┼čta admin-admin bilgileri ile giri┼č yapmak istedik kabul etmedi. ┼×imdi de─čil admin-admin istersen osas'─▒n ismini yaz─▒n yine size izin verecektir.

Kabul etti. G├╝zel bir durum. Bunu derleyip zaten art─▒k bypass ┼čekliyle kullanabilirsiniz.

Hatal─▒ Kodlar Ôś╣´ŞĆ

Peki uygulamada nas─▒l kodlar mevcuttu. Nas─▒l bir yanl─▒┼č yol izlenmi┼čti?

Delphi

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    kullaniciAdi: TEdit;
    kullaniciSifre: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  resourcestring
   kullaniciAdi_Text = 'test';
   kullaniciSifre_Text = 'sifre';

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
 if (Trim(kullaniciAdi.Text) = '') OR (Trim(kullaniciSifre.Text) = '') then
 begin
   ShowMessage('Kullan─▒c─▒ ad─▒ veya ┼čifre bo┼č!!');
   exit;
 end;

 if (kullaniciAdi.Text = kullaniciAdi_Text) AND (kullaniciSifre.Text = kullaniciSifre_Text) then
 begin
   ShowMessage('Bilgiler do─čru! Giri┼č i┼člemi ba┼čar─▒l─▒...');
 end else
 begin
   ShowMessage('Bilgiler yanl─▒┼č! L├╝tfen tekrar deneyiniz...');
 end;
end;

end.

┼×imdi arkada┼člar b├Âyle kod yaz─▒lmaz. Yani bu kodlama diyor ki;

Karde┼čim senin crack yapmana gerek yok, ben zaten kendi kendimi sana crack ettiririm.

K─▒ssadan Hisse ÔîĘ´ŞĆ

  1. Kolay d├╝z mant─▒k ko┼čullardan ka├ž─▒n─▒n.
  2. Uygulaman─▒z─▒n bilgilerini uygulaman─▒zda de─čil uzak sunucuda bar─▒nd─▒r─▒n.
  3. ┼×ifrelerinizi md5 gibi do─črulama algoritmalar─▒ ile koruyun.
  4. Belirli kontroller ekleyin. Bu kontroller anl─▒k olarak de─či┼čken tarz─▒nda olmal─▒.
  5. Kodlar─▒n─▒z─▒ s─▒k─▒┼čt─▒r─▒n. Antivir├╝sler i├žin k├Ât├╝ bir durum olabiliyor ama g├╝venlik i├žin bir ad─▒m belki.
  6. Obfuscator algoritmalar─▒n─▒z─▒ olu┼čturun. Kendinize ait ┼čifrelemeler ve ko┼čul algoritmalar─▒ ile yayg─▒n y├Ântemlerden ka├ž─▒n─▒n.

Son ­čľą´ŞĆ

Yaz─▒m─▒z─▒n sonuna geldik fakat s├Âylemeden ge├žemeyece─čim bir durum var. Uygulamalar─▒n g├╝venli─čini sa─člamak zordur. Decompile, sniff gibi y├Ântemler ile gerek uygulama tabanl─▒ gerekse sunucu tabanl─▒ her t├╝rl├╝ veri ak─▒┼č─▒n─▒z izlenip bypass edilebilir. Kendinize ait algoritmalar kullanmay─▒ al─▒┼čk─▒nl─▒k haline getirmenizde yarar vard─▒r.

Sa─čl─▒cakla kal─▒n ­čĄč