我必須在Mac OSX的運行進程內存中找到一個按鈕的名稱並對其進行更改。在OSX中使用GDB在進程內存中搜索特定的字符串
假設有一個「測試」應用程序,它有一個「你好」按鈕,有什麼辦法可以附加到「測試」應用程序並更改「你好!」按鈕「再見!」?
我認爲這可以使用GDB或Xcode來完成。如果沒有,我該怎麼做?
我必須在Mac OSX的運行進程內存中找到一個按鈕的名稱並對其進行更改。在OSX中使用GDB在進程內存中搜索特定的字符串
假設有一個「測試」應用程序,它有一個「你好」按鈕,有什麼辦法可以附加到「測試」應用程序並更改「你好!」按鈕「再見!」?
我認爲這可以使用GDB或Xcode來完成。如果沒有,我該怎麼做?
編輯
假設你真正需要的動態數據(而不是你的樣品似乎什麼建議:)),你總是可以只使用調試命令的工作。這將需要你有可能的內存範圍的感覺掃描(或者你只是得到無用內存違規):
# 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權力(想想:根)來解決這個問題。
爲了回答直接的問題:
通常,這樣的消息是常數(靜態數據),因此存在於數據段
這兩者通常是(現在在至少)在只讀內存段中(考慮共享內存映射頁面;這爲內核提供了共享進程間共享二進制對象的映射區域的機會 - 同時它也具有明顯的安全性)。
上檔,
strings myprogram | grep 'Hello"
會告訴你是否可以使用sed
,一個hex editor或任何其他合適的編輯器來操縱它甚至開始前的二進制文件。有兩個缺點,我能想到的在這裏:
顯示在按鈕中的文本很可能不在用戶空間進程中 - 更改內存不會影響顯示器,一旦它已被顯示並且重繪通常被緩衝。如果這是一種事後/演示的事情,請使用Photoshop! – sehe