Простой способ изменить заголовок пакета tcp в скомпилированном исполняемом файле?

У меня есть исполняемый файл (написанный, вероятно, на С++), который подключается к серверному программному обеспечению с использованием сокетов TCP и Windows (win sock api).

Затем отправляет пакет с заголовком (например, заголовок — это два байта 0x0064), логином и паролем. А затем начинается его взаимодействие с сервером.

Я хочу изменить заголовок логин-пакета, например, с 0x0064 на 0x0065.

Конечно, я всегда могу изменить его на своем ПК с помощью сниффера, такого как WPE (редактор пакетов winsock), или я могу написать dll с помощью Microsoft Detours с оболочкой функции отправки сокета и внедрить ее перед запуском программы, но мне придется проверять каждый пакет, который будет отправлен, чтобы знать, что он имеет заголовок 0x0064 и это именно тот пакет, который я хочу изменить.

Итак, мой вопрос: есть ли какой-нибудь простой способ найти переменную с этим заголовком пакета (я полагаю, они просто жестко закодировали ее при сборке пакета, как в sprintf), и просто изменить один байт в HEX-редакторе, не изучая ассемблер? Может быть, есть хороший пример учебника/crackme с решением, которое объяснит, как это сделать?

Любой совет будет полезен. Спасибо!


person splattru    schedule 23.02.2013    source источник
comment
Проблема не в изменении байта. Проблема заключается в том, чтобы найти правильный байт для изменения. Если исполняемый файл небольшой, то, если повезет, вы можете найти нужное место для редактирования с помощью шестнадцатеричного поиска байтов 0x64 0x00 (архитектура x86/x86-64 имеет обратный порядок байтов). Тогда вы просто замените этот конкретный 0x64 на 0x65. Иногда модифицировать исполняемые файлы так просто, но обычно нет, и тогда вам действительно нужно использовать отладчик и/или дизассемблер, а использование любого из них требует хотя бы некоторого базового понимания рассматриваемого языка ассемблера (в данном случае x86 или x86- 64).   -  person nrz    schedule 23.02.2013
comment
Я полностью понимаю, что задача состоит в том, чтобы найти правильный байт. К сожалению, я не слишком знаком с дизассемблированием, поэтому, может быть, есть простые руководства/примеры взлома/учебники с задачей, похожей на мою, с чего я могу начать?   -  person splattru    schedule 23.02.2013
comment
Учебная программа низкого уровня для C и C++ могут оказаться полезными. Это упоминается в недавнем вопросе SO по строке">stackoverflow.com/questions/15034247/ .   -  person nrz    schedule 23.02.2013