Bir API'yi Ters Mühendislik ile Çözümlemek

Bu yazıda sizlere bir REST API’nin ters mühendislik yöntemiyle nasıl çözümlenebileceğini basitçe anlatacağım. Bu yazı eğitimsel amaçlı olup, etik dışı işlerde kullanılmasını uygun bulmuyor ve sorumluluk kabul etmiyorum.

Bir API'yi Ters Mühendislik ile Çözümlemek

Çözümlemek istediğimiz hizmetin API’sine ulaşmak için kullanabileceğimiz yollara baktığımızda verinin bilgisayarımızda istemci tarafında (client-side) renderlanmasını bekleyebileceğimiz hizmetler uygundur. Örneğin, bir web sitesini incelediğimizde (inspect), gelen veri eğer ki JSON halinde ise, Ağ (network) tabında sürekli veri değişimleri görebiliyorsak, gelen verinin adresini kullanabiliriz. Bir diğer nokta ise mobil uygulamalarda sunucuda renderlanmış veri çok data harcayacağı için genellikle sunucu verisi mobil cihaza JSON halinde gönderilir. Buradan yola çıkarak elimizdeki Android APK dosyasını reverse engineering yöntemi ile çözebiliriz.

Elimizdeki APK dosyasını kaynağına ayrıştırmak (decompile) için Apktool ve Ninjadroid gibi araçları kullanabiliriz. Bu araçlardan Apktool, elimizdeki APK’yi smali’ye ayrıntılı bir biçimde dönüştürmekte, metin dizileri (string) ve kaynaklar (resources) üzerinde daha rahat bir araştırma imkanı sağlarken, NinjaDroid sayesinde ise APK’yi JAR dosyasına dönüştürüp, sonrasında IntelliJ IDEA ya da Fernflower gibi araçlar üzerinden JAR ayrıştırması ile de kimlik doğrulama (authentication) algoritması üzerinde bilgi sahibi olabiliriz.

Bu noktada önemli olan anahtar kelimeleri ayrıştırılmış proje klasöründe aratmak faydalı olacaktır. Bu kelimeler:

  • API
  • http
  • constant
  • secret
  • key
  • auth
  • authentication
  • authorization
  • JSON
  • token
  • OAUTH
  • OkHttpClient
  • Interceptor olarak sıralanabilir. İlgili dosyalardan aşağı yukarı API’nin URL’sini, sorgu örneklerini, istemci yazılımın kimlik sırrını (client secret) bulabilir, ardından da dönüştürülen JAR dosyası üzerinde ilgili kimlik doğrulama algoritmasını (OkHttpClient -ya da başka bir HTTP client kütüphanesi- ve/veya Interceptor içerebilir, bu kelimeleri aramakta fayda vardır) bulup, ilgili algoritmayı taklit edebilirsiniz.

Constants (Sabitler) dosyasında bulduğumuz değerler

Constants (Sabitler) dosyasında bulduğumuz değerler

Kimlik doğrulama algoritması

Kimlik doğrulama algoritması

Öte yandan Wireshark gibi bir ağ izleme aracı ile Android cihazımızı (veya emulator) izleyerek gönderilen ve alınan veriyi izleyebiliriz. Wireshark ile ağımızı dinlerken Android cihazımızın gönderdiği ve yaptığı sorguları dinledikten sonra topladığımız paketlerde CTRL-F/Command-F ile arama çubuğunu açıp, string aramayı seçip API URLmizi (örneğin api.ozankaraali.com) aratıp ilgili paketler üzerinden sorgu URL’inin tamamını ve örnek kullanımını öğrenebilirsiniz (örneğin api.ozankaraali.com/sorguURL?sorgu=birSoru).

Bütün bu bilgiler sayesinde de Postman gibi bir yazılım kullanarak veya dilediğiniz programlama dilini kullanarak elimizdeki ters mühendislik uygulamış olduğumuz API’ye sorgu yollayabilirsiniz. Örnek veriyorum elimdeki API api.ozankaraali.com/sorguURL?sorgu=birSoru olsun ve buraya ulaşmak için APInin istediği headerları ayarladık (normal şartlarda ulaşılmaması için yetkilendirme ve biz bu algoritmayı elimizdeki mobil uygulamadan alarak taklit ettik), yani “Authorization: Bearer <Base64(AnlıkTarih) + İstemciSırrı>” gibi bir header (her zaman böyle değildir, tamamen rastgele bir örnek olup başka bir örnek de OAUTH -1 ya da 2- verilebilir) ile istek yolladığımızda biz de mobil uygulama gibi sorgu yollamış ve cevap almış olduk.

Yukarıda verilen algoritmanın taklidi

Yukarıda verilen algoritmanın taklidi

Sonuç olarak bu yolla herhangi bir web sitesinin ya da bir servisin yayınlanmamış API’sini kullanabilirsiniz (bunun kullanım şartlarında aksi belirtilmediği ve etik dışı kullanmadığınızı varsayıyorum).

Note

Bu makalenin İngilizcesini BURADAN okuyabilirsiniz.

You can read the English version of this article HERE.

Written on July 20, 2018