14
« : 14 Сентября 2019, 19:01:45 »
В С++ на уровне машинного кода в конструктор строки (или в ООП вариант strcat) передается указатель на начало строки, длина строки и указатель на объект-строку. В итоге имеем:
- где-то длина не указывается, там только адрес поменять.
- где-то длина указывается где-то рядом, там просто поменять
- где-то длина прописывается одной и той же инструкцией для нескольких строк (там где идет ветвление, например). Вариант с втыканием strlen прорабатывался, но оказалось что есть строки, которые не заканчиваются нулем, и универсальное решение не получилось. Но это тоже решаемо - в новой секции вставляется кусок кода с указанием длины, делается на него переход, потом переход обратно в основной код (после куска кода, прописывающего длину). Для подобных правок (и для следующего пункта) как раз нужен дизассемблерный движок.
- где-то строка собирается по кусочкам серией операций mov. Нужно этот код зачистить, заменить простым циклом. Отдельно нужно обработать случаи, когда две (или более) серии мувов пересекаются между собой.
Вариант с отдельной секцией хорош тем, что туда можно дописать и строки, и свои куски кода (тот же strlen, если его не получается