2011-07-05 13 views
1

Mac OSXの実行中のプロセスメモリでボタンの名前を見つけて変更する必要があります。OSXでGDBを使用してプロセスメモリ内の特定の文字列を検索

"テスト"アプリケーションに "Hello"ボタンがある場合、 "テスト"アプリケーションに接続して "Hello!"ボタンを変更する方法はありますか?ボタンを「バイバイ」にしますか?

これは、GDBまたはXcodeを使用して行うことができます。そうでない場合は、どうすればいいですか?

+0

ボタンに表示されるテキストは、ユーザー空間のプロセスにはない可能性が非常に高いです。メモリを変更しても、既に表示され、通常は再描画がバッファされると、表示には影響しません。これが死体/デモのようなものであれば、Photoshopを使用してください! – sehe

答えて

6

編集

あなたは本当にあなたが常にちょうどデバッガのコマンドで仕事ができる(あなたのサンプルが:)示唆するように見えたものに対立するものとして)動的なデータを探していると仮定。このスキャンする(あるいはあなたが単に無駄にメモリ違反を取得します)可能なメモリ範囲の感覚を持っているあなたを必要とします:

使用GDBコマンド、ループ構造とのlibc関数

# assume 0x1234 is a likely base address, say for the heap 
(gdb) set $x=0x1234 
(gdb) set $y = strdup("lookforthistext") 
(gdb) while(0!=memcmp($x++, $y, 15) && $x<0x4321) 
    >end 
(gdb) p $x 
(gdb) x $x 

この例では、最初の一致の領域0x1234 ... 0x4321をスキャンし、出力アドレスを出力/検査します。

アクセス権がある場合は、同様のトリック(strncpy ...?)を使用してメモリを上書きすることができます。 部分文字列.. YMMVの長さを変更するなどの操作を行うと、プログラムが劇的に失敗することがあります。

は(、ロギングをオンに.gdbinitを使用したり、gdbの機能を作成し、悲しいことに、私は後者について少し知っている)スクリプトとしてあなたでっち上げのコマンドを節約考えてみましょう

オリジナルの答え:

あなたは「する必要がありますか?疑わしい。あなたの最善の策は、テキストを表示する実際のウィンドウを取得し、別のテキストを表示させるように(通常は適切な制御メッセージを送信することによって)、オペレーティングシステムのウィンドウ/ UI APIを操作することです。あなたにはたくさんの牛の力が必要です(根:)。通常、このようなメッセージは、定数(静的データ)であり、そのようにデータセグメント内のいずれか

  1. 存在
  2. 読み取り(メモリがある

    :直接の質問に答えるために


    マップされたページ)

どちらも通常、 (メモリマップされたページの共有を考えます。これはプロセス間で共有されたバイナリオブジェクトのマップされた領域を共有する機会を与え、明らかなセキュリティ目的にも役立ちます。逆さまに

strings myprogram | grep 'Hello" 

あなたはそれが起動する前であっても、バイナリを操作するためsedhex editorまたは任意の他の適切なエディタを使用できるかどうかを教えてくれます。私はここの考えることができる2つの欠点があります。それは、動的ではありません

  1. それはコード署名を破ること(あなたがその場でテキストの変更をすることはできません)(実行可能なことを意味することによって拒否される可能性がありますOSが変更されているため)。
+0

すぐにお返事ありがとうございます! – Matthew

+0

しかし、私はMacOSXで実行中のアプリケーションのデータを変更することが可能かどうかについてより興味があります。必ずしも一定のデータである必要はなく、「テスト」アプリケーションによって動的に生成されるデータであってもよいし、ユーザによって入力されたデータであってもよい。 – Matthew

+0

あなたのお手伝いをお待ちしています。 – Matthew

関連する問題