2011-07-05 23 views
1

我必須在Mac OSX的運行進程內存中找到一個按鈕的名稱並對其進行更改。在OSX中使用GDB在進程內存中搜索特定的字符串

假設有一個「測試」應用程序,它有一個「你好」按鈕,有什麼辦法可以附加到「測試」應用程序並更改「你好!」按鈕「再見!」?

我認爲這可以使用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來檢索顯示文本的實際窗口,並使其顯示另一個文本(通常通過發送適當的控制消息)。你將需要大量的COW權力(想想:根)來解決這個問題。


爲了回答直接的問題:

通常,這樣的消息是常數(靜態數據),因此存在於數據段

  • 讀取任一

    1. (存儲器來自資源

    這兩者通常是(現在在至少)在只讀內存段中(考慮共享內存映射頁面;這爲內核提供了共享進程間共享二進制對象的映射區域的機會 - 同時它也具有明顯的安全性)。

    上檔,

    strings myprogram | grep 'Hello" 
    

    會告訴你是否可以使用sed,一個hex editor或任何其他合適的編輯器來操縱它甚至開始前的二進制文件。有兩個缺點,我能想到的在這裏:

    1. 它不是動態的(你不能有上飛文本變化)
    2. 它可能會破壞代碼簽名(意味着可執行文件可能會被遭到拒絕OS,因爲它已被修改)。
  • +0

    感謝您的及時答覆! – Matthew

    +0

    但我對是否有可能更改MacOSX中正在運行的應用程序的數據更感興趣。它不一定是固定數據,它也可以是由「測試」應用程序動態生成或由用戶輸入的數據。 – Matthew

    +0

    感謝您的幫助。 – Matthew