這是不可能的,除非你的字符串不會改變位置&的長度。
所以爲了讓它成爲可能:在你的例子中,讓你的「大小」用於獲取更新很大的URL(想想:512個字符,最後爲空)。這樣,你有一些空間來更新字符串。
爲什麼不可能使用可變大小的字符串?那麼我可以用一個小的x86彙編代碼片斷來解釋一下:
PUSH OFFSET test.004024F0
假設;在test.004024F0
的偏移量處是可變大小的字符串。現在考慮的變化:
我想插入一個字符串,它比原來的字符串,它是在004024F0
存儲串以前更長:這使得004024F0
到一個新的價值,讓我們說:004024F5
(新字符串,在此條目之前,比原始長度長5個字符)。
您認爲很簡單:搜索全部004024F0
並將其替換爲004024F5
? 錯了。 004024F0
也可以是一個常規的「指令」(準確地說:ADD BYTE PTR DS:[EAX+24],AL; LOCK ...
)。如果這條指令恰好在你的代碼中,它將被錯誤的代碼所取代。
那麼,你可能會想,那麼尋找那個PUSH
指令呢? 錯誤:有幾乎無限制的方式來「推」。例如,MOV EAX, 004024F0; MOV ESP, EAX; ADD ESP, 4
。也有可能計算字段:MOV EAX, 00402000; ADD EAX, 4F0; ...
。所以這使得它「幾乎是無限的」。
但是,如果您使用靜態大小的字段;您不必更改引用字符串的代碼。如果您保留了特定字段的足夠空間,那麼您可以輕鬆地編寫比原始字符串更長的字符串,因爲字符串的大小是通過查找第一個「空字節」來計算的;用空值填充剩餘的場。
如果使用靜態大小的字段,但在編譯時很難找到「文件中的位置」。考慮到大量的時間花在竊取你自己的應用程序;您可以編寫修改.exe
的代碼,並將新的字符串值存儲在指定的偏移量處。這個文件偏移量在編譯時是不知道的,你可以使用OllyDbg這樣的工具來修補這個文件偏移量。這使得可執行文件修補自己:-)
謝謝大家,我想即將使用外部文件,而不是註冊表,或將註冊表是一個更好的主意? – extintor 2010-05-20 18:33:59
它取決於運行更新程序的用戶權限。我在迴應中提到,您始終可以寫入用戶配置單元,但普通用戶無法寫入「c:\ program files」。 – mdma 2010-05-20 23:36:24