Использование Python для перезаписи раздела ресурсов в программе на C - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть программа на C, в которой есть раздел ресурсов.

IDS_STRING 87 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 

В шестнадцатеричном редакторе это выглядит следующим образом

enter image description here

Я использую такой код в Python для поиска и заменыA:

str = b'\x00A'*40
str1 = b"BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"

if str in file:
    print("A in file")
    f.write(file.replace(str, str1))

Это делает новый файл похожим на это:

enter image description here

Так что мне интересно, почему Aхранится как «41 00», а затем, когда я перезаписываю их, они просто «42».

Это вещь WCHAR?

Я сделал тест, где я загрузил строку и распечатал ее,

This is some text.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

Но потом, когда я использовал свой Python и перезаписал буквы A буквой B, он делает это ..

This is some text.???????????????????????????????????????B

Итак, с моими ограниченными знаниями C, если я хочу поставитьвещи в разделе ресурсов, в которые я должен поместить их как WCHAR?

ОБНОВЛЕНИЕ: Моя главная проблема с этим заключается в том, что у меня есть шестнадцатеричная строка, подобная приведенной ниже:в раздел ресурсов.Но если я делаю это аналогично тому, как я заменяю, то, делая

f.write(file.replace(str, '685308358035803507835083408303508350835083508350835083083508'))

, тогда он помещает его в раздел ресурсов как:

enter image description here

Если это происходит таким образом, это приводит к тому, что вещи ломаются, потому что он захватывает 2 байта за один раз, как кажется.

Причина, по которой я спрашиваю это, заключается в том, что когда я заменяю буквы Aс моим гексом и запустите программу.Это не работает.Но если я помещаю шестнадцатеричный код непосредственно в раздел ресурсов в Visual Studio и запускаю его, он работает.Когда я заменяю на Python, это '34322424 ...', но когда та же строка помещается в раздел ресурсов, это '3400220042004 ....'

2nd UPDATE: Похоже, таблица строк раздела ресурсовсохраняет в 2 байта.

https://docs.microsoft.com/en-us/windows/desktop/debug/pe-format#the-rsrc-section

Resource Directory Strings 
Two-byte-aligned Unicode strings, which serve as string data that is pointed to by directory entries. 

1 Ответ

0 голосов
/ 29 ноября 2018

Похоже на кодировку utf-16.Таким образом, вы можете использовать обычные строки Unicode Python и убедиться, что вы открываете и записываете в файл в текстовом режиме и в кодировке utf16.

Если вы используете двоичный режим, каждый записанный вами символ ascii будет представлен в видеодин байт.Если вы используете текстовый режим, каждый написанный вами символ будет представлен двумя байтами.Если текст, который вы пишете, использует только низкие кодовые точки Юникода, будет множество нулевых байтов.Если вы пишете текст на китайском языке, вам нужны оба байта.

Размещенный вами шестнадцатеричный дамп не отображает спецификацию в начале, поэтому вам, возможно, придется использовать utf-16le вместо utf-16. * 1007.*

with open('foo.txt', 'r', encoding='utf-16le') as fp:
    text = fp.read()

with open('foo.txt', 'w', encoding='utf-16le') as fp:
    fp.write(text.replace('AAAAAA', 'BBBBBB'))
...