iOSアプリを砎壊したす パヌト2

最初の郚分では、デヌタの保存ず送信のセキュリティ問題のいく぀かを調べたした。 次に、 実行可胜コヌドの保護に぀いお説明したす 。 実行時にiOSアプリケヌションの機胜を倉曎し、リバヌス゚ンゞニアリングを行いたす。 そしお、もう䞀床芚えおおいおください 私たちの目暙は、芋苊しいクラッカヌになるこずではなく、悪意のあるアクションからアプリケヌションずナヌザヌを保護するこずです。 これを行うには、クラッカヌができるこずを理解する必芁がありたす。



このレッスンを正垞に完了するには、アセンブラヌずは䜕かを理解する必芁がありたす。 この蚘事の著者は、 ARMのチュヌトリアル 英語を読むこずをお勧めしたす。

実際、レッスンの意味を理解するために必芁な知識のレベルは、Googleが途䞭で数分かかるこずです。 さお、蚘事の終わり近くで、アセンブラヌを孊ぶ必芁があるかどうかを決定したす。 :) -箄 あたり

始めたしょう


必芁なもの


これらのツヌルに぀いお倚くを孊んでいただければ幞いです

ランタむム操䜜


前のシリヌズでは、.plistファむルを倉曎しおアカりントの残高を倉曎したした。 では、実行時に倉数ずメ゜ッドを操䜜する方法実行時ず呌ばれる方法を芋おみたしょう。 これを行うには、LLDBデバッガヌを䜿甚したす。
元の蚘事では、すべおの䟋はGDBを䜿甚しおいたすが、
Xcodeを5.0.1翻蚳時の珟圚のバヌゞョンにアップグレヌドした埌、GDBを実行するにはタンバリンず螊る必芁がありたす。 したがっお、チュヌトリアルに負担をかけないために、 LLDBずGDBの間のコマンド察応衚に埓っお、チュヌトリアルをやり盎したした。 -泚 あたり

タヌミナルのiOSシミュレヌタヌにむンストヌルされおいるメむンバンドルフォルダヌ Meme Collector.app を開きたす。 これを行うために迷っおいる堎合は、 最初の郚分を芋おください。

開始䜍眮を占有したす。シミュレヌタは実行されおいたすが、アプリケヌションはむンストヌルされおいたすが、実行されおいたせん。

タヌミナルで、次を入力したす。

 lldb 

デバッガヌは実行䞭です。 次の行には、圌からの招埅状が衚瀺されたす (lldb)

デバッガヌのコマンドを入力したす。
行の先頭に文字(lldb)を蚘述しないので、コピヌするずきに混乱しないようにしたす。

 attach --name "Meme Collector" --waitfor 

attachコマンドは、特定のプロセスに接続するために䜿甚されたす。 ここでは、LLDBに「 Meme Collector 」ず呌ばれる新しいプロセスが開始しお接続するのを埅぀ように䟝頌したす。

したがっお、デバッガは埅機しおいたす。 iOSシミュレヌタヌに進み、埓来のレッスンの最埌の郚分でマルチタスクからアプリケヌションをアンむンストヌルしおから再起動したすIDEからではなく、シミュレヌタヌから実行したす-以降、「再起動」ず呌びたす。

すべおが正しく行われるず、LLDBはシミュレヌタヌのプロセスず䞀緒に楜しみ始めたす。 デバッガヌはプロセスに接続し、実行を䞀時停止しお次のように蚀いたす。

 Process 1427 stopped Executable module set to "/Users/dmitriy/Library/Application Support/iPhone Simulator/7.0.3/Applications/9A72F266-8851-4A25-84E4-9CF8EFF95CD4/Meme Collector.app/Meme Collector". Architecture set to: i486-apple-macosx. 

そしお、新しいコマンドを入力するプロンプト (lldb)

各ViewControllerを衚瀺する前にブレヌクポむントを远加したしょう。 これは、倚くの興味深いこずが通垞起こる堎所です。 倚くの堎合、アプリケヌションロゞックの倧郚分はそこで決定されたす。 たずえば、 viewDidLoadメ゜ッドのすべおの呌び出しにブレヌクポむントを远加したしょう。iOSでは、 UIViewControllerサブクラスがほずんどの堎合viewDidLoadオヌバヌラむドするためです。

タヌミナルで実行

 b viewDidLoad 

メ゜ッド名では倧文字ず小文字が区別されるため、 viewdidloadオプションviewdidload倱敗したす。

これにより、 viewDidLoadず呌ばれるすべおのメ゜ッドC ++およびObjective-Cメ゜ッドを含むにブレヌクポむントが蚭定されたす。 必芁に応じお、特定のObjCセレクタヌに察しお、 -[UIViewController viewDidLoad]などの名前を入力できたすが、このオプションはUIViewControllerクラスの子孫ではUIViewControllerないこずに泚意しおください。

したがっお、LLDBは、ブレヌクポむントに適した15の堎所を芋぀けたず蚀っおいたす。

 Breakpoint 1: 15 locations. 

玠晎らしい。 圌がどこに眮いたのか芋おみたしょう。 次のコマンドを入力したす。

 br l 

これはbreakpoint list略です。必芁に応じお、コマンドの完党なバヌゞョンを曞くこずができたす。

さお、ここに圌らは

 Current breakpoints: 1: name = 'viewDidLoad', locations = 15, resolved = 15 1.1: where = Meme Collector`-[ViewController viewDidLoad] + 18 at ViewController.m:27, address = 0x0001f482, resolved, hit count = 0 1.2: where = UIKit`-[UIViewController viewDidLoad], address = 0x005d3db5, resolved, hit count = 0 1.3: where = UIKit`-[_UIModalItemsPresentingViewController viewDidLoad], address = 0x0065ab4b, resolved, hit count = 0 1.4: where = UIKit`-[UIKeyboardCandidateGridCollectionViewController viewDidLoad], address = 0x00680729, resolved, hit count = 0 1.5: where = UIKit`-[UIActivityGroupViewController viewDidLoad], address = 0x008d2b6b, resolved, hit count = 0 1.6: where = UIKit`-[UIPrintPanelTableViewController viewDidLoad], address = 0x009be80f, resolved, hit count = 0 1.7: where = UIKit`-[UIPrintStatusViewController viewDidLoad], address = 0x009c8828, resolved, hit count = 0 1.8: where = UIKit`-[UIPrintRangeViewController viewDidLoad], address = 0x009d29ae, resolved, hit count = 0 1.9: where = UIKit`-[_UILongDefinitionViewController viewDidLoad], address = 0x00a10cf4, resolved, hit count = 0 1.10: where = UIKit`-[_UINoDefinitionViewController viewDidLoad], address = 0x00a1249d, resolved, hit count = 0 1.11: where = UIKit`-[UIReferenceLibraryViewController viewDidLoad], address = 0x00a13bd4, resolved, hit count = 0 1.12: where = UIKit`-[_UIFallbackPresentationViewController viewDidLoad], address = 0x00a77877, resolved, hit count = 0 1.13: where = UIKit`-[_UIViewServiceViewControllerOperator viewDidLoad], address = 0x00aba23b, resolved, hit count = 0 1.14: where = UIKit`-[UIActivityViewController viewDidLoad], address = 0x00b4f296, resolved, hit count = 0 1.15: where = UIKit`-[_UITextEditingController viewDidLoad], address = 0x00b9a6ec, resolved, hit count = 0 

実際、ブレヌクポむントを1぀だけ残す必芁があるこずは明らかです-[ViewController viewDidLoad] 、残りはApple Private APIに属しおいるため。 しかし、私たちは興味があるので、それらを残しおください。

アプリケヌションの起動に戻りたしょう 次のコマンドを入力したす。

 c 

これはフルバヌゞョンではcontinueように芋えたす。 アプリケヌションは、 viewDidLoad最初の呌び出したでコヌドの実行を続けviewDidLoad 。

 Process 1427 resuming Process 1427 stopped * thread #1: tid = 0x83c4, 0x0001f482 Meme Collector`-[ViewController viewDidLoad](self=0x08f7c620, _cmd=0x00c50587) + 18 at ViewController.m:27, queue = 'com.apple.main-thread, stop reason = breakpoint 1.1 frame #0: 0x0001f482 Meme Collector`-[ViewController viewDidLoad](self=0x08f7c620, _cmd=0x00c50587) + 18 at ViewController.m:27 24 25 - (void)viewDidLoad 26 { -> 27 [super viewDidLoad]; 28 self.memeDescriptionTextView.clipsToBounds = YES; 29 self.memeDescriptionTextView.layer.cornerRadius = 20.0f; 30 [self.moneyLabel sizeToFit]; 

「そしお今... e-yer ...それは私たちが楜しむ時間ですそうでなければ私はプレヌしたせん」



ViewControllerクラスViewController.mファむルのフレヌムでプロセスを停止したした。 そのため、むンスタンス倉数ずメ゜ッドにアクセスできたす。 かっこいい そしおもっず コヌドセクションは既にメモリにロヌドされおいたす。 したがっお、以䞋を含む他のすべおのクラスにアクセスできたす-泚意 -シングルトヌン。

はい、シングルトヌン。 最初の郚分でこの点を泚意深く調べた堎合、 MoneyManagerず呌ばれる「興味深い」クラスに気付くかもしれたせん。 圌はテストしたいpurchaseCurrencyメ゜ッドを持っおいたすよね :)

(lldb)タヌミナルに入力したす

 call [[MoneyManager sharedManager] purchaseCurrency] 

メ゜ッドを呌び出したした デバッガヌは実行結果を出力したす。

 (BOOL) $0 = YES 

答えがYES堎合、仮想通貚を正垞に「取埗」したこずを意味したす。 ここで著者は、これはむンサむダヌ情報です。私たち、クラッカヌは、それを知るべきではありたせん。-およそあたり。 

LLDBは、Enterキヌを抌しお前のコマンドを繰り返したす。 したがっお、Enterキヌを数回抌しお、Mikhail Mikhalkovをもう少し匷奪したす。

 (lldb) call [[MoneyManager sharedManager] purchaseCurrency] (BOOL) $0 = YES (lldb) (BOOL) $1 = YES (lldb) (BOOL) $2 = YES (lldb) (BOOL) $3 = YES (lldb) (BOOL) $4 = YES (lldb) (BOOL) $5 = YES (lldb) (BOOL) $6 = YES (lldb) (BOOL) $7 = YES (lldb) 

無料コンテンツの賌入は、これたでになく簡単になりたした コマンドを数回入力しおください

 c 

...これで、蚭定したすべおのブレヌクポむントが終了し、シミュレヌタで結果が評䟡されたす。



悪くないでしょ さお、それに぀いお䜕ができるか芋おみたしょう。

アプリケヌションを䞀時停止しおコマンドラむンに再び戻るには、タヌミナルに切り替えお、そこでCtrl + Cを抌したす。 LLDBデバッガヌは、コマンドを再床実行する準備ができおいたす。

ずりあえずデバッグセッションを終了したしょう qコマンドを入力しおからyを確認しおください

 (lldb) q Quitting LLDB will detach from one or more processes. Do you really want to proceed: [Y/n] y 

開発者の偎に戻りたす。 デバッガヌを介しおアプリケヌションを操䜜したい人を裏切るこずは可胜ですか

ランタむム操䜜に察する保護


幞い、デバッガがコヌドに接続されおいるかどうかを確認する方法がありたす しかし、1぀の問題がありたす。 このチェックは、この特定の時間にデバッガが接続されおいるかどうかを刀断したす。 ハッカヌクラッカヌ、詐欺垫などは、このチェックの埌、アプリケヌションが危険を認識しなくなったずきに、アプリケヌションに接続できたす。 この問題は、少なくずも2぀の方法で解決できたす。

  1. チェックが継続的に実行されるように、実行ルヌプにチェックを含めたす。
  2. セキュリティに぀いお最も懞念しおいるコヌドの最も重芁な郚分にチェックを入れたす。

通垞、最初のオプションは望たしくありたせん。 その䟡栌は、デバむスを加熱するための貎重なプロセッサ時間の無駄です。 2番目の方法に行きたしょう。

゚レガントな゜リュヌションの1぀は、 MoneyManagerシングルトンでデバッガのアクティビティをチェックするこずです。 たずえば、デバッグが行われおいるず刀断した堎合、クラスの静的むンスタンスの代わりにnilを返したす。

拡匵モヌド
Objective-Cでは、これを簡単に行うこずができたす。 Objective-Cのメ゜ッドは本質的にメ゜ッドではなく、 メッセヌゞです。 これは、空のオブゞェクトにメッセヌゞを送信するこずは絶察に安党であるこずを意味したす-それは䜕もしたせん。 コヌドはクラッシュしたせん。

さお、最埌に、コヌドを操䜜したしょう お気に入りのIDEたたはXcodeでプロゞェクトを開き、MoneyManager.mファむルに移動したす。 ここでは、アプリケヌションがどの構成で構築されおいるかを確認するプリプロセッサマクロを远加し、リリヌスの堎合はデバッガが実行されおいるかどうかを確認したす。 開始するず、 nilを返したす。 それ以倖の堎合は、すべおが通垞どおり行われたす。

sharedManagerクラスのsharedManagerメ゜ッドの先頭に3行を远加したす。

 #ifndef DEBUG SEC_IS_BEING_DEBUGGED_RETURN_NIL(); #endif 

これで、メ゜ッドは次のようになりたす。



SEC_IS_BEING_DEBUGGED_RETURN_NIL()は、デバッガがアプリケヌションに接続されおいる堎合にnilを返す暙準プリプロセッサマクロの呌び出しです。

泚このマクロは、リリヌス構成でのみ䜿甚可胜です。 最初の郚分で私たちをフォロヌしおいる堎合は、すでにリリヌスに切り替えおいるはずです。
念のため、思い出させおください
Xcode 補品>スキヌム>スキヌムの線集...  ⌘< -巊偎の[実行...]、右偎の[情報]> [ビルド構成リリヌス]タブを遞択したす。

AppCode 実行>構成の線集... >構成リリヌス。


拡匵モヌド
プリプロセッサマクロの代わりに、ObjCメ゜ッドたたはC関数を蚘述する方が良いず蚀う人がいるかもしれたせん。 しかし マクロを䜿甚する非垞に具䜓的な理由がありたす。 すべおのメ゜ッドの名前をスパむしたり、振る舞いを倉曎したりできるこずを既に知っおいるので先を芋おこれが次に行いたす-これを知っおいるので、チェックを非衚瀺にしたすたずえば、シングルトンメ゜ッド内。 䞀般に、クラッカヌがセキュリティチェックを芋぀けおパッチを圓おるのははるかに難しくなりたす。マクロの堎合、アセンブラをいじる必芁がありたす。

IDEからアプリケヌションを起動したすリリヌス構成を遞択するのを忘れおいたせんか

Xcode 実行 ⌘R
AppCode デバッグ Ctrl + D

[実行]を遞択するず、XcodeはLLDBデバッガヌを自動的に有効にしたす。 結果口座残高は衚瀺されたせん 確かに、どこかにありnil 



たた、AppCodeには、2぀の異なるコマンドがありたす。Runコマンドはデバッガヌを接続したせん。Debugコマンドは接続したす。 䟿利に。

最終的に私たちの保護が機胜するこずを確認するには、チェックしおください今すぐ䜕かを賌入できたすか MoneyManager䜿甚できたせん。぀たり、䜿甚できたせん。

IDEの[ 停止 ]ボタン四角をクリックしお、アプリケヌションを停止したす。 LLDBデバッガヌも停止したす。 シミュレヌタヌに切り替えお、そこからアプリケヌションを実行したす。 アプリケヌションは通貚を衚瀺したす、なぜなら デバッガヌが接続されおいたせん。

既に述べたように、起動時だけでなく、通垞は任意の時点でデバッガをプロセスに接続できたす。 タヌミナルで実行

 ps aux | grep "Meme Collector" 

このコマンドの出力には、「Meme Collector」ずいうフレヌズが衚瀺される名前のすべおのプロセスのリストが含たれたす。

 dmitriy 2008 0,0 0,0 2432784 636 s001 S+ 1:05 0:00.00 grep Meme Collector dmitriy 2001 0,0 0,4 857416 32240 ?? S 1:04 0:00.65 /Users/dmitriy/Library/Application Support/iPhone Simulator/7.0.3/Applications/9A72F266-8851-4A25-84E4-9CF8EFF95CD4/Meme Collector.app/Meme Collector 

2行目がシミュレヌタヌのアプリケヌションフォルダヌに察応しおいるこずがわかりたす。 このプロセスの数に泚意しおください2列目。 私の堎合、これは2001幎の数字です。

端末から-pスむッチを指定しおLLDBを実行し、番号でプロセスに接続したす。

 lldb -p {  } 

たずえば、「lldb -p 2001」ず入力する必芁がありたす。

LLDBが開始し、プロセスぞの接続が成功したこずを報告したす。

 Attaching to process with: process attach -p 2001 Process 2001 stopped Executable module set to "/Users/dmitriy/Library/Application Support/iPhone Simulator/7.0.3/Applications/9A72F266-8851-4A25-84E4-9CF8EFF95CD4/Meme Collector.app/Meme Collector". Architecture set to: i486-apple-macosx. 

LLDBの実行䞭にMoneyManagerシングルトンにMoneyManagerみおください。

 call [[MoneyManager sharedManager] purchaseCurrency] 

通貚を「賌入」しようずするず、 NOが返されたす。぀たり、通過したせん。

そしおsharedManagerオブゞェクトの説明を印刷しおみおください。 次のコマンドを入力したす。

 po [MoneyManager sharedManager] 

そしお、この説明には䜕が含たれおいたすか

  nil 

達成するために必芁なもの シングルトンは、少なくずもわかりやすい結果を返さず、賌入プロセス䞭に゚ラヌメッセヌゞを衚瀺したせん。 クラッカヌnil単玔で理解できない。

次のコマンドを䜿甚しお、アプリケヌションの実行を継続したす。

 c 

[通貚の賌入]ボタンを䜿甚しお、アカりントを法的に補充しおください。 䜕も起こりたせん 結局のずころ、LLDBはただプロセスに接続されおいたす。



プロセスからデバッガヌを切断したす。Ctrl+ Cを抌しおから、 qコマンドを入力したす。 [通貚の賌入]ボタンが再び機胜したす。

デバッガヌの確認に加えお、より厳密なアプロヌチを取るこずができたす。 ptrace関数は、可胜な限り GDB / LLDBをアプリケヌションに接続しないようにするのに圹立ちたす。

これを行うには、IDEに戻っおmain.mを開きたす。 1぀のヘッダヌファむルを远加したす。

 #include <sys/ptrace.h> 

そしお、 main関数の先頭たでの3行

 #ifndef DEBUG ptrace(PT_DENY_ATTACH, 0, 0, 0); #endif 

ptrace関数は、GDBやLLDBが行うように、デバッガヌで䞀般的にプロセスに接続するために䜿甚されたす。 ptraceぞの呌び出しを远加したした。これは、特別なパラメヌタヌPT_DENY_ATTACHを䜿甚しお、オペレヌティングシステムに他のプロセス぀たり、デバッガヌがアプリケヌションに接続しないように芁求したす。

IDEからアプリケヌションを実行したす。

Xcode アプリケヌションが起動しおいないようです。 䜕が起こっおいるの すぐに消える黒い画面が衚瀺されたす-このアプリケヌションはメモリにロヌドされ、実行を開始したす。 同時に、XcodeはLLDBを接続するこずを望んでいたすが、iOSはそれを蚱可せず、デバッガヌプロセスを終了したす。 「デバッガヌが完了するず、Xcodeは「アプリケヌションが終了したので、停止したす」ず考えたす。 最埌のフレヌズはワむルドに聞こえたすが、そのように機胜したす。 -泚 あたり

AppCode  実行 ⌘Rコマンドを䜿甚するず、アプリケヌションが正垞に起動し、 デバッグコマンドCtrl + Dを䜿甚するず、Xcodeのようにクラッシュしたす。

そしお、シミュレヌタヌから正しく起動したす。 䞊蚘のように、デバッガヌを今すぐ接続しおみおください。

 lldb -p {  Meme Collector} 

結果は予枬可胜です

 Attaching to process with: process attach -p 3435 error: attach failed: process did not stop (no such process or permission problem?) 

これは、habrを読んだ幌児がアプリケヌションで遊んでしたうのを防ぐ良いツヌルです。 しかし、それはあごひげを生やしたハッカヌを止めたせん。 続行する前に、 ptrace関数を呌び出しお倉曎するずプロセスが停止したす。



䞀般的に、あたりにも快適に感じるこずはありたせん。 ハッカヌは、特に実行時にObjCアプリケヌションを操䜜するために、 Cycript JavaScriptを連想させるスクリプト蚀語の䜿甚を奜みたす。 私たちが行ったデバッガ保護は、Cycriptからあなたを保護したせん。 前の蚘事で䌚話を始めた方法を思い出しおください。
安党なアプリケヌションはありたせん

バむナリを準備しおいたす


バむナリファむルの倉曎に進む前に、それをパヌツに分解する方法ず、その内容を確認したしょう。

特定の抂念を説明するために、バむナリ内の特定のアドレスを定期的に参照したす。 私のようなバヌゞョンのコンパむラたずえば、新しいXcodeに付属がない堎合は、リリヌスの代わりにデバッグ構成をコンパむルするか、プロゞェクトに自分で倉曎を加えたす。アドレスは異なる堎合がありたす。 これは気にしないかもしれたせん-アむデアを理解するためにプレれンテヌションに埓っおください。

OS XおよびiOSの実行可胜ファむル圢匏はMach-Oず呌ばれたす。 原則ずしお、バむナリは、バむナリの堎所ずデヌタに関するすべおの情報を含むヘッダヌで始たりたす。 この情報の埌には、セグメントごずにファむルをマヌクアップする方法を瀺すロヌドコマンドが続きたす。 さらに、これらのコマンドは特別なフラグを定矩したす。たずえば、ファむル内のバむナリデヌタが暗号化されるかどうかです。

各セグメント セグメントには、1぀たたは耇数のセクション セクションがありたす。 2぀のタむプのセクションに泚目する䟡倀がありたす。


Appleには、英語の優れたMach-O圢匏のリファレンスもありたす 。 -泚 あたり

次に、 Meme Collectorバむナリを調べお、すべおの動䜜を確認したす。 芋出しから始めたしょう。 タヌミナルのメむンバンドルフォルダヌ「Meme Collector.app」に、次のように入力したす。

 otool -h "Meme Collector" 

このコマンドは、Meme Collectorバむナリ実行可胜ファむルのヘッダヌを出力したす。 このようなもの

 Meme Collector: Mach header magic cputype cpusubtype caps filetype ncmds sizeofcmds flags 0xfeedface 7 3 0x00 2 25 3372 0x01000085 

拡匵モヌド
0xfeedface0xFEEDFACEは16進数のアドレスか...英語のフレヌズですよね りィキペディアの回答。 -泚 あたり

泚ファむルには25個のロヌドコマンド cmds があり、それらは3372バむト sizeofcmds を占有したす。 これらのコマンドを芋おみたしょう

 otool -l "Meme Collector" 

この前に、⌘Kを抌しおタヌミナルりィンドりをクリアできたす。スクロヌルするず䟿利です。- 泚 

たくさんの行を取埗したす。 これらの行から予備的な準備がなくおも、セグメントずセクションをメモリにロヌドする順序に関する倚くの興味深いこずがわかりたす。 しかし、この研究はこのチュヌトリアルの範囲を超えおいたす; 独立した研究のために最も奜奇心の匷い読者にお任せしたしょう。

そしお、レッスンを続けたす。 __objc_classnameずいう ⌘F セクションを芋぀けお、 offset泚意しおください。これは、アプリケヌションが占有する仮想メモリの先頭に察するこのセクションの「䜍眮」たたは「シフト」です。

拡匵モヌド
offsetに぀いお 最も奜奇心、盛な、おそらく、すでにaddrずoffset違いを理解しおいるのは、なぜこの違いはどこでも0x1000 = 4096バむトに等しいのでしょうか ただ読んでいない堎合は、非垞に興味深いペヌゞである__PAGEZERO 詳现を__PAGEZERO読みください。

ここで、 __objc_classnameセクションのシフトは159942バむト10進数です。 䞋の画像では、巊偎に赀の䞋線が匕かれおいたす。

タヌミナルに移動したす。 新しいタヌミナルりィンドり ⌘N を開き、同じフォルダヌ「Meme Collector.app」から以䞋を実行したす。

 strings -o "Meme Collector" 

stringsコマンドはバむナリファむル内の行を怜玢し、 -oフラグは各行にファむルの先頭からの盞察䜍眮を曞き蟌みたす。

さお、159942には䜕がありたすか クラス名 赀で匷調衚瀺されおいたす。論理的に、 __objc_classnameセクションを探しおいたした。



このセクションのすぐ䞊には、 __objc_methnameセクションがあり、140887から始たりたす。ここでは、 initメ゜ッドで始たるメ゜ッド名青で匷調衚瀺がありinit 。

拡匵モヌド
initメ゜ッドが最初に来るのはなぜだろうか

メ゜ッド名が終わるずころで、クラス名はすぐに始たりたす。 __objc_classnameセクションは、 __objc_methnameセクションの盎埌に__objc_methnameたす。 ブヌトコマンドでは、それらは次々に実行され、メモリに順次ロヌドされたす。

したがっお、ロヌドコマンドを䜿甚するず、Mach-Oバむナリの混を敎理するこずができたす。 この知識で私たちは進みたす... tadaaam コヌドセクションの修正に。

重砲逆アセンブラヌずリバヌス゚ンゞニアリング


深刻な銃を発射する準備はできおいたすか 最埌に、アプリケヌションバむナリファむルを倉曎する方法を孊習したす。

あなたはおそらくあなたの人生でしばしばフレヌズを聞くでしょうアプリケヌションは「ハッキングされおいたす」。 これは、誰かがアプリケヌションを修正しお、... mmm ...開発者が意図したものずは異なる動䜜をするこずを意味したす。 たずえば、登録を求めたせん。 したがっお、私たち著者および翻蚳者は、私たちの仕事があなたに圹立぀こずを心から願っおいたす。 アプリケヌションを保護するためだけに。

IDA Demoず、 Hex FiendなどのHEX゚ディタヌをダりンロヌドしたす。 IDAは、ハッカヌがバむナリを孊習するずきに最も頻繁に䜿甚するツヌルです。 これは非垞に匷力な逆アセンブラ、デバッガ、デコンパむラです。 そしお、フルバヌゞョンはそれほど高䟡ではありたせん。

しかし、玄15秒前に聞いたプログラムを賌入する準備ができおいない堎合、IDAは機胜が制限されたデモ版を提䟛したす。 デモ版には、孊習できるアセンブラファむルの皮類が限られおいたす。たた、コヌドを倉曎する機胜は無効になっおいたす。

ただし、x86アセンブラヌ型がありたす。そしお、すべおの倉曎を別のプログラム-Hex Fiendで手動で行いたす。
拡匵モヌド
« 
 x86? ARM?» — . , iOS- ARM-. x86. , , .

IDAをむンストヌルしお実行したす。䞖界初のプログラマヌであるAda Lovelaceに歓迎されおい

たす。Goボタンを抌しおください。タヌミナルでは、はい、はいただバンドルフォルダヌMeme Collector.appにいたす。次のコマンドを入力しお、このフォルダヌをFinderに衚瀺したす。

 open -R . 

最埌のポむントを忘れないでください。ここのドット蚘号は「珟圚のフォルダヌ」を意味したす。

次に、開いたFinderりィンドりで、右クリック> パッケヌゞの内容を衚瀺



OS Mavericksはロシア語でバンドルを「パッケヌゞ」ず呌びたすが、この名前は私には情報がないようです。- 泚

バンドルパッケヌゞ内には、実行可胜ファむルがありたす。Meme Collector、IDAりィンドりにドラッグしおダむアログボックスを衚瀺したす。



実際、IDAはこのバむナリがi386アヌキテクチャの実行可胜ファむルであるず刀断したした。

蚭定は䞊蚘の蚭定に察応しおいる必芁がありたす䜕も倉曎する必芁はないず思いたす-[ Let's go ]をクリックしたす。OK逆アセンブラヌは、ファむルを小さな断片に解析し、そのスキヌムマッピングを䜜成したす-䞊蚘で行ったこず、しかし...蚀い方...より専門的に。 :)

「Objective-C 2.0構造が怜出されたした。それらを解析し、メ゜ッドの名前を倉曎したすか "-はい、答えたす。 「近接ビュヌ」に぀いお質問する堎合は、いいえず答えたす。

IDAがバむナリファむルの凊理を完了するず、もちろん、ショックを受けおメむン画面が衚瀺されたす。 IDAりィンドりが䞋のりィンドりずあたり䌌おいない堎合は、巊パネルで関数名を芋぀けおstartクリックし、矎しいフロヌチャヌトが衚瀺されるたでスペヌスバヌを抌したす:(


私の堎合、1぀のスペヌスでは䞍十分でしたが、䜕回かEnterキヌを抌さなければなりたせんでしたが、䜕が䜕なのかすぐにわかりたす-およそPer

そしお、XcodeたたはAppCodeでプロゞェクトを開きたす。プレれンテヌションを枛らすために、コヌドを少し芋おいきたす。

開くMoneyManager.mずメ゜ッドを芋おみたしょうbuyObject:

 - (BOOL)buyObject:(id<PurchasableItemProtocol>)object { NSUInteger totalMoney = self.money.unsignedIntegerValue; NSUInteger cost = [object cost].unsignedIntegerValue; if (totalMoney < cost) { return NO; } _money = @(totalMoney - cost); return [self saveState]; } 

アルゎリズムを孊ぶ、それは非垞に簡単です。むンスタンス倉数に_money十分な支払いがない堎合、関数は戻りNO、トランザクションは完了したせん。賌入を蚱可/犁止するこの条件文は、1぀のブヌル倀に䟝存しおいたす。ナヌザヌには十分なお金がありたすか ストア内の䞀郚の人々の行動を思い出させたすか- 玄

このテストを回避する堎合アセンブラヌ甚語で「ゞャンプオヌバヌ」-奜きなものを賌入できた堎合、倀_moneyは賌入時の芁玠ずは芋なされなくなりたす。

これで、逆アセンブラで同じコヌドが芋぀かりたした。 IDAに戻り、[関数]パネルで任意の関数をクリックしおこのパネルをアクティブにするだけ、Ctrl + Fを抌したすたたはメニュヌから[ 線集 ] > [クむックフィルタヌ]。入力ボックスが衚瀺され、関数を怜玢したす。buyObject:



そう、芋぀かった、メ゜ッドの名前をダブルクリックする必芁がありたす。 IDAには逆アセンブラりィンドりが衚瀺され、条件付きステヌトメントずコヌド分岐を完党に実蚌したす。アセンブラスクヌルコヌスの



知識がなくおも、゜ヌスコヌドからは、緑色の「右」矢印がたさにハッカヌに行きたい堎所であるず想定できたす。そこで倚くのアクションが実行されたす。赀い矢印「巊」の䞋の短いコヌドは、より簡朔な「」に䌌おいたす。アセンブラを少しロヌドしたす。䞊のブロックの䞀番䞋にある条件挔算子「ゞャンプ」を芋おみたしょう。そこから2぀の矢印赀ず緑が出たす。それはbuyObject:return nil

jnb、「以䞋でない堎合はゞャンプ」「未満」の堎合は移動を意味したす。どうやら、この呜什を「垞にゞャンプ」-呜什に眮き換える必芁がありたすjmp。

指瀺を眮き換えるには、それを芋぀ける必芁がありたす。オペランドをダブルクリックしたすjnb。黄色で匷調衚瀺されたす。次に、スペヌスバヌを抌しおテキストモヌドに切り替えたす。

これは同じ情報ですが、線圢圢匏です。コマンドで行番号を芋぀けたすjnbこの行は匷調衚瀺されおいたす



私の堎合、アドレスは0x00018D88でした。他のアドレスを䜿甚できたす。

オペランドコヌド「jnb short」は0x73??、疑問笊が衚瀺される盞察オフセットをバむト単䜍で瀺す堎所です。オペランドコヌドを0xEB??-無条件ゞャンプコヌド " に倉曎する必芁がありたすjmp short「同じバむト数の堎合。オペランドコヌドはどこで入手したしたかたずえば、Intel Software Developer's Manualからちなみに、゚キサむティングな読み物です

ダりンロヌドただダりンロヌドしおいない堎合Hex Fiend。たずえば、フォルダにコピヌしおむンストヌルしたす/Applications。 ただバンドルフォルダヌ「Meme Collector.app」にいるず仮定しおコマンドを入力したす

 open -a "/Applications/Hex Fiend.app/" "Meme Collector" 

りィンドりが開き、バむナリが衚瀺されたす。いいですね ここにありたす-私たちの友人__objc_classnameず他のセクション。私たちの前には、明らかに実行可胜ファむルのヘッダヌがありたす。


タヌミナルに入力したす

 otool -l "Meme Collector" | grep -a10 "sectname __text" 

前に芋たように、otool -lバむナリファむルをメモリにロヌドするコマンドを衚瀺したす。コヌドセクション「テキスト」セクションに関心があるため、コマンドで怜玢領域を絞り蟌みgrepたす。次のようなものを埗たした

  segname __TEXT vmaddr 0x00001000 vmsize 0x0002e000 fileoff 0 filesize 188416 maxprot 0x00000007 initprot 0x00000005 nsects 11 flags 0x0 Section sectname __text segname __TEXT addr 0x00002970 size 0x0001dec3 offset 6512 align 2^4 (16) reloff 0 nreloc 0 flags 0x80000400 reserved1 0 reserved2 0 

ここでは、セクションの開始アドレスaddr0x00002970、およびシフトoffset-6512 10進数が衚瀺されたす。IDAを取埗し、コヌドが開始する開始アドレスが正確に0x2970であるこずを確認できたす。そのためには、最䞊郚たでスクロヌル「線圢」圢匏する必芁がありたす。特定の倀は異なる堎合がありたすが、意味は同じです。

いいね算術を行う時間呜什のオフセットjnb「テキスト」セクションで芋぀かったをバむナリファむル内の絶察倀に再蚈算する必芁がありたす。 IDAで芋぀かったアドレスのバむトを倉曎しようずするず、おそらくどこかでクラッシュをキャッチしたす。それらは䞀臎したせん。

気が散らないように、次の匏を甚意したした。

{バむナリファむル内のコマンドの絶察䜍眮} =
{コマンドアドレス}-{テキストセクションの開始アドレス} + {テキストセクションのシフト}

私の堎合

コマンドアドレスjnb= 0x18D88IDAから
テキストセクションの開始アドレス= 0x2970of otool
テキストセクションのシフト= 10進数6512of otool

蚈算機を取埗し、メニュヌから切り替えたす[衚瀺]> [プログラマヌ甚 ] 10進数ず16進数を入力するずきは、目的の番号システムに切り替えるこずを忘れないでください。

私が埗た
0x18D88-0x2970 + 6512 = 0x17D88

拡匵モヌド
«Advanced Mode» , 0x1000 (0x18D88 – 0x17D88).

蚈算が正しいこずが刀明した堎合、これはjnbIDA で確認した呜什のアドレスになりたす。 Hex Fiendで、⌘Lたたは[線集]> [オフセットぞゞャンプ ]メニュヌを抌しお、アドレス入力フィヌルドを開きたす。アドレス倀を入力したす16進圢匏で入力する堎合0xは、最初に忘れないでください。

うヌん、䜕らかの理由で10進数の行番号。さお、再蚈算しおみたしょう0x17D88 = 97672、぀たり97664の䜍眮から、さらに8バむトを右に数える必芁がありたす。 8バむト= 16桁の16進数= 2぀の4バむトワヌド。ご芧のずおり、Hex Fiendは単語に埓っおバむナリ「テキスト」をグルヌプ化したす。


最初の2぀の単語をスキップし、3番目の単語の先頭で-ここに-操䜜コヌドを挿入したす0x7304。0x73-呜什コヌド、および0x04-オフセット、プロセッサが前方に「ゞャンプ」するバむト数。

正しい0x73侊0xEB慎重に1 [Backspace]を抌しはすぐに1バむト= 2進数の文字を削陀したす。ファむルを保存⌘Sしお閉じたす。シミュレヌタを開き、メモリからアプリケヌションを削陀しお、再床実行したすIDEからではなく、シミュレヌタから再コンパむルしないように。お金がなくなるたでミヌムを買う。 「お金」よりも高䟡な補品を賌入しようずしたずきに䜕が起きたしたか

はい、「ナヌザヌはお金を持っおいたすか」ずいう条件のチェックを本圓に捚おたした。お金がなくおも、トランザクションは実行されたす。そしお小さなボヌナス笊号なしの倀_money「ルヌプ」は、メモリ内の数倀の衚珟の特性により、負ではなく10 32玄40億匱になりたす。

リバヌス゚ンゞニアリング保護


どうやっお自分を守るのですか芚えおいる、私は蚀った「䜕も安党ではありたせん。」このステヌトメントはここでも機胜したす。リバヌス゚ンゞニアリングは非垞に難しい堎合がありたすが、攻撃者が深刻な堎合、攻撃者を止めるこずはできたせん。あなたの唯䞀の望みは、攻撃者をあたりにも混乱させお、このビゞネスを攟棄し、他のアプリケヌションを砎壊するこずです。

1぀の方法は、プリプロセッサを介しお重芁なクラスずメ゜ッドの名前を倉曎するこずです。IDEでプロゞェクトを開き、ファむル「Meme Collector-Prefix.pch」を芋぀けたす。行を远加したす。

 #define MoneyManager DS_UIColor_Theme 

このコヌドは、出珟するすべおの「MoneyManager」を、クラッカヌにずっおあたり面癜くない名前「」に眮き換えたすDS_UIColor_Theme。

このアプロヌチは、䜕も壊さないように现心の泚意を払っお䜿甚する必芁がありたす。遞択した新しい名前がアプリケヌションのどこにも芋぀からないこずを100確認する必芁がありたす。そうしないず、混乱しおしたい、アプリケヌションで䞍可解なこずが起こり始めたす。

通垞、実行可胜ファむルには、アドレスから関数やメ゜ッドの読み取り可胜な名前ぞのマッピングが保存されおいるシンボルテヌブルがありたす。そしお今、コヌドを混同する別の方法は、プロゞェクトをビルドした埌にキャラクタヌテヌブルを削陀するこずです。 Objective-Cメッセヌゞは単䞀の関数で凊理されるため、これはCおよびC ++関数の非衚瀺に適しおいたすobjc_msgSend()。MoneyManager.mを再床

開きたす 次のC関数を先頭に远加したす。

 BOOL aSecretFunction(void) { return YES; } 

次に、アプリケヌションを再床コンパむルしたす。シンボルテヌブルでこの関数の存圚を確認しおください。タヌミナルから

 nm "Meme Collector" | grep aSecretFunction 

このコマンドnmは、文字の衚を衚瀺し、grep関数名でフィルタヌしたす。ここにありたす

 00018b8f t _aSecretFunction 

iOSアプリケヌションから文字テヌブルを削陀する簡単な方法は、プロゞェクト蚭定で2぀のオプションを芋぀けるこずですDeployment PostprocessingずStrip Linked Product、



そしおYesに蚭定次に、プロゞェクトを「クリヌン」する必芁がありたすXcodeProduct> CleanたたはAppCodeRun> Cleanそしお再コンパむルしたす。次に、タヌミナルに移動しお同じコマンドを実行したす。

 nm "Meme Collector" | grep aSecretFunction 

いいねを参照したキャラクタヌを削陀したしたaSecretFunction()。これで、クラッカヌはコヌド内の重芁なポむントを芋぀けるためにより倚くの時間を費やす必芁がありたす。

次は


攻撃者ができるこずを確認したした


アプリケヌションを䜜成するずき、これらのこずを芚えおおくこずが重芁です。アプリケヌションをより安党にするためにどれだけの劎力を費やすかを考えおください。セキュリティずは䜕ですかこれは垞に、リ゜ヌス時間、ナヌザヌの問題のレベル、およびハッキングの可胜性の間のバランスです。

IOSアプリのセキュリティは深刻なトピックです。あなたはただ倚くを孊ぶこずができたす。これたでのずころ、衚面に少しだけ傷を付けたした。デバッガヌおよびその他の分析ツヌルの機胜の党範囲は、さらに深いずころにありたす。このトピックに興味がある堎合は、テストデバむスのゞェむルブレむクに぀いお考えるこずをお勧めしたす。ファむルシステムは、研究のための豊富な食品を提䟛したす。

英語に問題がない堎合は、iOSアプリケヌションのハッキングず保護を確認しおください。著者Jonathan Zdziarski。それは少し時代遅れですがAppleアプリケヌションの暗号化メカニズムの倉曎をグヌグルで調べる必芁がありたす、この蚘事の著者はiOSずセキュリティに関する圌のお気に入りの本の1぀です。
さらに2冊の本
ハッキングThe Art of Exploitation、2nd Edition by Jon Erickson
Mac OS X and iOS InternalsTo the Apple's Core by Jonathan Levin
フォヌラム
http://www.woodmann.com
http://www.reddit.com/r/ReverseEngineering
コヌドむンゞェクションに関する蚘事
http : //blog.timac.org/?p=761

著者はコメント、および翻蚳で蚘述できたす。dev @x128.ruメヌルに曞き蟌みたす。

Source: https://habr.com/ru/post/J199130/


All Articles