How to play basketball like a pro

Do you know what I hate most? People who brags their achievements on Facebook. I can chew a gum and walk at the same time. I never bragged about it on Facebook though. Anyway, recently I saw lots of people posting screenshots of FaceBook Messenger’s basketball game scores. (If you don’t know, you can activate the game by sending basketball emoji 🏀 to yourself) I tried to play that game by myself, and found out that this game is pretty hard for me. I am competitive and I like challenges. How about fixing this game so that no matter what, everything will be perfect basket?

Read More »

Develop A Cydia Tweak

Today I am going to talk about how to start with Cydia Tweak development. It is not that hard to start with it. Steps are

  • Get Theos
  • Fix installation errors
  • Develop

Get Theos

Easiest way to get Theos Follow the WIKI page Since I use macOS, I installed with the help of Wiki and it mostly worked. For macOS steps are

  • Install Xcode (AppStore)
  • Install Homebrew
  • Install necessary packages
brew install dpkg ldid
brew install --HEAD hbang/repo/deviceconsole  # (not required, but very useful)
  • Install Theos Refer to WIKI for detailed instuctions.

Fix installation errors

If you are using macOS, after installation you may see following error

dpkg-deb: error: obsolete compression type 'lzma'; use xz instead

Type dpkg-deb --help for help about manipulating *.deb files;
Type dpkg --help for help about installing and deinstalling packages.
make: *** [internal-package] Error 2

In order to fix this error,

brew remove dpkg
brew install --force-bottle https://raw.githubusercontent.com/Homebrew/homebrew-core/7a4dabfc1a2acd9f01a1670fde4f0094c4fb6ffa/Formula/dpkg.rb

Develop

For this exercise I am going to develop a tweak for an app to disable its ads. I am not going to name the app but this app has banner ads, interstitial ads and interstitial video ads whenever you click on something.

Purpose of our tweak is to prevent any ad showing up and remove any views or hide it afterwards. In order to write such tweak, we must decrypt binary, find out classes and develop a plan to disable or remove ad showing functions from those classes.

Decrypt Binary

You can use Clutch or to dumpdecrypted.dylib to dump the binary

Class Dump

You can use classdump  to dump the classes

Planning

I have checked class names for ad,banner and found couple of candidates

@interface AdBannerView : DFPBannerView
{
}

- (void)loadRequest:(id)arg1;
- (id)initWithAdSize:(struct GADAdSize)arg1;
- (id)initWithFrame:(struct CGRect)arg1;

@end

This class is responsible for creating a view for an add. We can actually return nil from initializers but this app crashes if it can’t init the view. Therefore I will disable loadRequest function.

So after analyzing classes of the app, I came up with following list

Class Function
AdBannerView – (void)loadRequest:(id)arg1
MainMenuBase – (void)loadInterstitial
PhoneScreenTeam – (void)showInterstitial
PhoneScreenTeam – (void)loadInterstitial
PhoneScreenOrganization – (void)showInterstitial
PhoneScreenOrganization – (void)loadInterstitial
KrVideoPlayerController – (void)requestAds
KrVideoPlayerController – (void)adsLoader:(id)arg1 adsLoadedWithData:(id)arg2
KrVideoPlayerController – (void)setupAdsLoader

This classes and their functions are responsible for showing ads on the screen such as banner ads or interstitial ads. Basically we want to disable running these functions. If functions is not returning anything, (void) you can generally skip that function. Because function tells that I am not returning anything.

Developing Tweak

Preparation

We are going to use Theos to develop our tweak. Go to any folder of your choice and run following commands

nic.pl

If you get an error it means either you didn’t install the Theos or you didn’t add Theos folder to your path. Please follow WIKI to fix it.

You should see following screen

NIC 2.0 - New Instance Creator
------------------------------
  [1.] iphone/activator_event
  [2.] iphone/application_modern
  [3.] iphone/cydget
  [4.] iphone/flipswitch_switch
  [5.] iphone/framework
  [6.] iphone/ios7_notification_center_widget
  [7.] iphone/library
  [8.] iphone/notification_center_widget
  [9.] iphone/preference_bundle_modern
  [10.] iphone/tool
  [11.] iphone/tweak
  [12.] iphone/xpc_service
Choose a Template (required): 

Since we are going to develop Tweak we will select 11 Give a project name(My Cool Project), Package name(com.whateveryouwant.mycoolproject), Username. For MobileSubstrate Bundle filter you must write the bundle id of app you write your tweak against. Open Info.plist of your app on your device and find the bundleid of your app. This is very important. Tweak will be only activated for the bundle id you set. You can just hit Enter for other options if you are happy with the defaults.

If everything is made correctly you should have a folder with your Tweak source Tweak.xm and couple of other files and folders inside. Open your terminal and go to that directory and write below

make package

If you don’t get an error, you are ready for actually writing the tweak. If you get an error, please read the beginning of this tutorial to fix possible errors.

Successful compilation will give you a deb file in packages folder.

Writing Code for Tweak

Open Tweak.xm with your editor and write the code for disabling ad functions.

If you read the generated Tweak.xm you can see how to disable functions or how to call original functions from the app. In order to hook a class and you must write block of code something like below

%hook Nameoftheclass

//functions you want to hook

%end

Let’s disable our first add

%hook AdBannerView

- (void)loadRequest:(id)arg1 {

}

%end

So I am hooking AdBannerView class and I basically disable the function by doing nothing at all. Since this is a void function I don’t need to return anything. However some functions may need to return something. For example, after I disabled AdBannerView, tableview had some white cells due to AdBannerView. You can actually be hardcore and find TableDataSource and fix the problem or just hide the cell by setting height to 0. In TableViews, cell’s height is decided by following function

- (CGFloat)tableView:(UITableView*)tableView heightForRowAtIndexPath:(NSIndexPath*)indexPath;

As you see this function is returning CGFloat as the height of the cell. If we return 0 from this function, we will basically hide the cell.

PhoneScreenOrganization has the banners so our hook function will we something like this

%hook PhoneScreenOrganization
- (void)showInterstitial {

}
- (void)loadInterstitial {

}


- (CGFloat)tableView:(UITableView*)tableView heightForRowAtIndexPath:(NSIndexPath*)indexPath {
    CGFloat height = %orig;
    if (height == 50) {
        return 0;
    }
}

%end

If you check the function, first I call original function with %orig; This will call original function will all of its arguments. You can also do something like %orig(arg1,arg2….) with its arguments.

First I get height by asking app to calculate for me. I checked the size of the banner and found out that it is 50. Therefore if calculated height is 50 I am returning 0 to hide it otherwise I am returning the original height.

After you make your package with make package Upload to your device and install the package with Filza or any other way you like. In order to facilitate easy debugging, Theos increases build number and adds debug configuration each time you make a package. When you decide everything is working as expected, you can easily disable the debug mode. Open Makefile and add

FINALPACKAGE=1 to the top of the file.

Tip: You can debug your tweak by adding some NSLog() functions and using deviceconsole.

That is all I guess. I hope this tutorial helps you to get started with Tweak development.

CTF competitions

CTF competitions are fun activities to test your self. However sometimes due to nature of CTF or the vague answers this leads to complete chaos. Yesterday I tried to have some fun with some reversing tasks in https://www.dkhoctf.com I firstly tried first mobile question. I use iOS but binary was in android. My only chance was emulators and static analysis and found out that program gets user input reverse the text and use this text as a key and to decrypt “encrypted” file in raw folder. Upon decryption if the file is correctly decrypted, image is shown. CTF picture was showing a scene from a movie name G.O.R.A When you check that scene you will see that name of the ship “KA-FA 1500”. However, we need to enter it backwards for program to accept. I you enter 0051 AF-AK, program accepts the input and shows us a picture.

It was clearly saying Flag{Uf0_GOr3n_M4sum_K0ylu}. Yay we did it. Did we?

Read More »

App Store Drama

I released my app Find My Parcel about a month ago. I will to try write all the problems I have encountered and how to solve them. Mostly.

When I first released the app, program was getting 10-20 downloads per day. It was not much but it was giving me a feeling that what I did was working. In first days, all reviews were positive. When I first saw my first purchase from UK, I guess  I was jumping to moon back and forth. Then something unexpected happen.

As usual I was checking my stats with Fabric Answers. (I highly recommend integrating Crashlytics and Answers) I saw that my download stats were going crazy. I mean crazy according to me. I was getting like 40 downloads in a minute. What did happen? When I told my brother he told me “Your app is on Turkish App Store’s main page” Whaaaaaaaaaat?

Read More »

App Store Macerası

Yaklaşık bir ay önce Kargom Nerde programını yayınladım. Bu yazımda size hangi problemlerle nelerle karşılaştığımı ve bunlara nasıl çözüm bulduğumu veya bulamadığımı anlatacağım. Program ilk yayınlandığı zamanlar günde 20-30 kişi tarafından indiriliyordu. Gelen yorumların hepsi olumluydu. Ben de mutlu mesut iyi bir iş yaprığımı düşünmeye başlamıştım. Hatta ingiltered birisi programı satın aldığında herhalde ağzım kulaklarıma varmıştı. Sonra beklenmeyen bir şey oldu.

Evde klasik her zaman olduğu gibi bugün kaç kişi download etmiş diye bakıyordum. Birden program deli gibi indirilmeye başlandı. Deli gibi dediğim bana göre deli gibi. Birden kullanıcı sayısı 40 olmuştu. Allah Allah, ne olmuştu ki? Kardeşime bunu söylediğimde bana şunu dedi “Abi programın App Store un ana sayfasında” Anaaaaaaaaaa

Read More »

Script kiddies

Today, I got an email to my findmyparcel marketing email address. It was like below,

Dear Customer,

This is to confirm that one or more of your parcels has been shipped.
Please, open email attachment to print shipment label.

Thank you for choosing FedEx,
Thomas Barlow,
FedEx Operation Manager.

First I thought maybe some user entered wrong email and I was about to delete it. Then I looked at email address thomas.barlow@chanchan.wperu.com Yeah right it definitely looks like email address of FedEx Operation Manager. I decided to check what it is just for fun. We open the zip file and we have this file;

Delivery_Notification_00000301441.doc.js

I guess our script kiddie want me to double click that file. Let’s not do that and check what is inside the file.

Read More »

Programcılık Macerası

Gerçek mesleğim öğretmenlik ama uzun zamandır hobi olarak bilgisayarlarla uğraşıyorum. Herhalde bilgisayarlara olan bu ilgimi baştan keşfetmiş olsaydım bir bilgisayarcı olabilirdim. Ama bu da pek mantıklı gözükmüyor çünkü bizim zamanımızda bilgisayar mağazalarının olduğu yerler hep dutluktu.

Aslında orta seviye assembly bilgisine sahibim ve bu bilgi bana programların nasıl çalıştığı konusunda oldukça fazla bilgi veriyor. Fakat assembly de kapsamlı bir program yazabilmek çok zor, bazen imkansız. Çünkü diğer RAD platformlarının sunduğu binlerce kütüphaneden ve bilgiden mahrum kalıyorsunuz. Ben de geçen yaz ciddi bir şekilde C++ diline eğilmeye karar verdim. Bayağı da ilerledim. Kamboçyada öğretmenlik yaparken öğrencilerimle başlattığım İngilizce-Khmerce sözlüğü yazdım. Ama günden güne bu programlama diline olan ilgimi kaybettim. Eğer bir şey ilgimi çekmiyorsa o işle uğraşmak bana zulüm geliyor.

Programı yayınladıktan sonra öğrencilerin bazıları iOS versiyonunu istediler. Bende bu şekilde biraz merak biraz bu tip yeni şeyleri inceleme isteğinden iOS programlama dünyasına daldım. iOS da program yazabilmek için MAC işletim sistemine ihtiyacımız var. Ben şu ana kadar hep PC kullanmıştım. Sadece bir heves için MAC almayı da çok mantıklı bulmadım. Bu yüzden eski HP laptopuma Hackintosh denilen yöntemle Mavericks yükledim. Daha sonra github ve google u kullanarak bir şekilde 1-2 ay içinde iPhone ve iPad lerde çalışan bir programı yazdım. Bittiğinde gerçekten bu bana bir başarma duygusu verdi. Yazdığın programı hemen cep telefonundan erişmek hoşuma gitmişti. Ben de iOS a eğilmeye karar verdim.

Apple tam o sıralar iOS 8 i ve yeni bir programlama dili olan Swift i duyurdu. Objective C nin parantezlerinden bıktığımdan bu yeni dili öğrenmeye karar verdim. Öncelikle 15$ a Udemy de iOS kursu satın aldım. Ben aldım ama sakın siz almayın. Nedeni kursu veren kişi bir Web Developer ve öğrendiği kadar Swift anlatmış. Aşırı derecede kötü kodlar ve buna bağlı alışkanlıkları size öğretiyor. Bunu anlamam biraz uzun sürdü ve sanırım kursun yarısından sonra bıraktım. Eğer video kurslarından ben iyi öğreniyorum diyorsanız, iTunes U da Paul Hegarty in Swift kursu var onu şiddetle tavsiye ederim. Kendisi Apple ın temellerini oluşturan Next Systems de çalıştığı için API lerini tarihini biliyor ve şiir gibi kod yazıyor.

Bir şeyi öğrenmenin bence iki yolu var; 1) Öğretmek 2) Pratik. Benim gibi bir öğretmenden Swift öğrenecek birini bulamadığım için ben de ufak tefek bir şeyler yazmaya karar verdim. İlk başta önceden bahsettiğim kursa bağlı programlar yazdım ama o programlar gerçek hayatta hiç bir kullanımı olmayan Kedi Yaşı(Kedi canını yisinler) hesaplaması gibi ya çok basit programlardı veya Hava Durumu gibi çok genel fikirlerdi. Kardeşime yardım olması bakımından bende interaktif bir belediye uygulaması yazmaya başladım. İşte bu aşamada artık bir şeyler öğrenmeye başlamıştım. En basit şeylerin günlerimi aldığı zamanlardı. Stackoverflow sağ olsun uzun sürdü ama çok büyük deneyim kazandım.

Sonradan sadece kendi isteğim doğrultusunda bir program yazmaya karar verdim. App Store un öne çıkan uygulamalar kısmında Deliveries diye bir programı görmüştüm. Program 10-15 tane kargo şirketini destekleyen bir kargo takip programı. Program oldukça basit olmasına rağmen ilk program olduğundan aşırı derece de rağbet görüyordu. Ben de Kargo ile alakalı Türkiyede bir program yazılmış mı diye baktım ama bulamadım. Aslında varmış ama ben İngilizce App Store kullandığımdan arama sonuçlarında çıkmıyordu. Bu gazla programı geliştirmeye başladım. Yüzlerce kargo şirketi olduğundan sadece Türkiyedeki bütün firmalar ve yurtdışındaki belli başlı firmalara odaklandım. 2015 Ocak ayında başladım ve programın App Store da gözükmesi Ağustos ayını buldu. Şubat ayında Swift 1.2 çıktığında bana bayağı bir baş ağrısı vermişti. O kadar kodu yeniden düzenlemem gerekti. Program aslında Nisan gibi bitti daha doğrusu ben öyle zannettim. iOS 7 üstü bütün cihazları desteklememe rağmen sadece iPhone 5S ve iPhone 6 ile test etmiştim. Meğerse ne kadar bug varmış 🙂 iOS 7 de programı açtığımda program anında göçmüştü. Mayısa kadar programı çalışır hale getirmekle uğraştım.

Bundan sonraki aşama App Store a yüklemek. Öncelikle App Store a paşa paşa yıllık 99$ bayılmanız gerekiyor. Benim için bu uzun zaman aldı. Çünkü önce bankadan debit hesabı açtırdım. Fakat “güvenli” bankamız debit kart ile 3D güvenlik olmayan yerlerden alışveriş yaptırtmıyor. Belki bir gün bu ismi bende mahfuz “güvenli” bankamızın iOS programının ne kadar “güvenli” olduğu ile akalalı bir yazı yazabilirim. Neyse en sonunda Ağustos gibi App Store da iki programım yayınlanmaya başlandı. Yazdığım kargo takip programı Kargom Nerde bana çok şeyler öğretti. Öncelikle Swift dilini öğrenmeme yardımcı oldu. Daha sonra Software Testing in gerçekten önemli bir şey olduğunu anladım. Eskiden her bir kargo şirketini manuel olarak test ediyordum(Çaylak alarmı!!!). Şu an ben de artık Unit Testing yapıyorum. Eylül 2015 gibi Swift 2 dili çıkacak ve yine yeni şeyler öğrenmem ve eski yazdığım kodları tekrar dan düzenlemem gerekecek. Fakat bu sürekli yeni şeyleri öğrenebilme hali beni gerçekten motive ediyor. Bu yazıyı yazma nedenim günlük 20 kişiye varan devasa kitleme şu mesajı vermek:
Yeni bir şey öğrenmek için eğer ölmediyseniz hala geç kalmış sayılmazsınız.

Linkler:
Kargom Nerde: http://www.mustafadur.com/findmyparcel/indextr.html
Stanford Swift Kursu: https://itunes.apple.com/us/course/developing-ios-8-apps-swift/id961180099