Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/18: Рейтинг темы: голосов - 18, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 25.03.2017
Сообщений: 3

Поиск и изменение HEX в файле

25.03.2017, 22:58. Показов 3579. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите пожалуйста решить проблему
Есть бинарный файл. Размер около 100 Мбайт.
Есть HEX значения которые нужно поменять на другие и сохранить все это в другой файл. 31 31 33 34 -> 31 35 30 30

Вот так считываю файл и получаю HEX строку:
C#
1
2
3
4
5
6
7
8
9
FileStream fs = new FileStream("1.dll", FileMode.Open);
            int hexIn;
            String hex="";
            
          
            for (int i = 0; (hexIn = fs.ReadByte()) != -1; i++)
            {   
                    hex += string.Format("{0:X2}", hexIn);
            }
Далее в ней ищу 31313334, меняю на 31353030
И пытаюсь записать, предварительно конвертируя hex в byte
C#
1
2
3
4
5
6
7
public static byte[] StringToByteArray(string hex)
        {
            return Enumerable.Range(0, hex.Length)
                             .Where(x => x % 2 == 0)
                             .Select(x => Convert.ToByte(hex.Substring(x, 2), 16))
                             .ToArray();
        }

C#
1
File.WriteAllBytes("2.dll", StringToByteArray(hex));
Так вот проблема в том, что конвертации из HEX при таком объеме происходит очень долго. Как можно сделать это быстро? Или может вообще есть куда более просто решение?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.03.2017, 22:58
Ответы с готовыми решениями:

Поиск и замена hex значения в dll файле
Как мне найти и заменить несколько hex значений в dll файле?

Поиск и замена hex значения в dll файле
Как мне найти и заменить несколько hex значений в dll файле?

Поиск hex значения в файле и получение его смещения
Всем доброго времени суток. Есть последовательность в виде b'\x69\x13\x0f' надо найти её в файле и получить все возможные смещения на...

5
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
25.03.2017, 23:06
А зачем туда-сюда конвертировать то? Ищите сразу байты и меняйте их...
0
0 / 0 / 0
Регистрация: 25.03.2017
Сообщений: 3
25.03.2017, 23:23  [ТС]
тогда возникает вопрос как в массиве искать последовательность байт?
у меня очень небольшой опыт в с#.
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
25.03.2017, 23:32
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
using System;
using System.Collections.Generic;
 
    internal static class FindPatterns
    {
        public static uint Find(byte[] data, byte[] patternBytes, string mask)
        {
            if ((data == null) || (data.Length == 0))
            {
                throw new ArgumentNullException("data");
            }
            if ((patternBytes == null) || (patternBytes.Length == 0))
            {
                throw new ArgumentNullException("patternBytes");
            }
            if (mask == string.Empty)
            {
                throw new ArgumentNullException("mask");
            }
            if (patternBytes.Length != mask.Length)
            {
                throw new ArgumentException("Pattern and Mask lengths must be the same.");
            }
            int length = patternBytes.Length;
            int num2 = data.Length - length;
            for (int i = 0; i < num2; i++)
            {
                bool flag = true;
                for (int j = 0; j < length; j++)
                {
                    if (((mask[j] == 'x') && (patternBytes[j] != data[i + j])) || ((mask[j] == '!') && (patternBytes[j] == data[i + j])))
                    {
                        flag = false;
                        break;
                    }
                }
                if (flag)
                {
                    return (uint)i;
                }
            }
            return -1;
        }
 
        public static uint[] FindAll(byte[] data, byte[] patternBytes, string mask)
        {
            List<uint> list = new List<uint>();
            for (int i = 0; i < (data.Length - patternBytes.Length); i++)
            {
                bool flag = true;
                for (int j = 0; j < patternBytes.Length; j++)
                {
                    if (((mask[j] == 'x') && (patternBytes[j] != data[i + j])) || ((mask[j] == '!') && (patternBytes[j] == data[i + j])))
                    {
                        flag = false;
                        break;
                    }
                }
                if (flag)
                {
                    list.Add((uint)i);
                }
            }
            return list.ToArray();
        }
    }
C#
1
2
3
4
5
6
7
8
9
var data = File.ReadAllBytes(...);
uint offset = FindPatterns.Find(data, new byte[] { 0x31, 0x31, 0x33, 0x34 }, "xxxx");
// после перезаписываете в файле по найденным смещениям новые байты...
using (FileStream fStream = File.Open(path, FileMode.Open))
{
    byte[] newBytes = new byte[] { 0x31, 0x35, 0x30, 0x30 };
    fStream.Position = offset;
    fStream.Write(newBytes, 0, newBytes.Length);
}
1
1152 / 860 / 263
Регистрация: 30.04.2009
Сообщений: 3,603
26.03.2017, 00:30
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
        static void Main(string[] args)
        {
            byte[] sourceBytes = StringHexToByteArray("31313334");
            byte[] targetBytes = StringHexToByteArray("31353030");
            
            BinaryReplace("tmp.dll", sourceBytes, "tmp_patched.dll", targetBytes);
        }
 
        public static void BinaryReplace(string sourceFile, byte[] sourceSeq, string targetFile, byte[] targetSeq)
        {
            FileStream sourceStream = File.OpenRead(sourceFile);
            FileStream targetStream = File.Create(targetFile);
            
            try
            {
                int b;
                long foundSeqOffset = -1;
                int searchByteCursor = 0;
 
                while ((b=sourceStream.ReadByte()) != -1)
                {
                    if (sourceSeq[searchByteCursor] == b)
                    {
                        if (searchByteCursor == sourceSeq.Length - 1)
                        {
                            targetStream.Write(targetSeq, 0, targetSeq.Length);
                            searchByteCursor = 0;
                            foundSeqOffset = -1;
                        }
                        else 
                        {
                            if (searchByteCursor == 0)
                            {
                                foundSeqOffset = sourceStream.Position - 1;
                            }
 
                            ++searchByteCursor;
                        }
                    }
                    else
                    {
                        if (searchByteCursor == 0)
                        {
                            targetStream.WriteByte((byte) b);
                        }
                        else
                        {
                            targetStream.WriteByte(sourceSeq[0]);
                            sourceStream.Position = foundSeqOffset + 1;
                            searchByteCursor = 0;
                            foundSeqOffset = -1;
                        }
                    }
                }
            }
            finally
            {
                sourceStream.Dispose();
                targetStream.Dispose();
            }
        }
 
        public static byte[] StringHexToByteArray(String hex)
        {
            int NumberChars = hex.Length;
            byte[] bytes = new byte[NumberChars / 2];
            for (int i = 0; i < NumberChars; i += 2)
                bytes[i / 2] = Convert.ToByte(hex.Substring(i, 2), 16);
            return bytes;
        }
0
0 / 0 / 0
Регистрация: 25.03.2017
Сообщений: 3
26.03.2017, 00:55  [ТС]
Someone007, Спасибо, помогло
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.03.2017, 00:55
Помогаю со студенческими работами здесь

Поиск в текстовом файле и его изменение
Есть файл .тхт, примерно такой структуры: cost 200/комент weight 3.0/комент и ище много других параметров. нужно найти...

Редактирование hex значений в файле
Всем привет. Не знаю как сделать то что на 2 скриншотах. На 1 до, на втором - после. В какую сторону копать? А то руками замучился...

Изменение нужного байта, hex редактор
Запустил *.exe, нашел через читЕнджи нужный адрес 4d215c, кликнул на него и показало *.exe+d215c - я так понял это смещение. Открыл Hex...

Hex редактирование - замена строк в файле
Есть файл (вернее 3d модель) в котором нужно сменить имя текстуры, при помощи Free Hex Editor Neo это можно спокойной делать: грузите...

Поиск hex в строке
Привет. У меня задан hex массив str2 = {0x79, 0x65, 0x6C, 0x6C}; как найти эту последовательность в файле?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru