- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
- 71
- 72
- 73
- 74
// ПРЕОБРАЗОВАНИЕ КОДА И КОНЕЧНЫЕ АВТОМАТЫ
// ---------------------------------------
// (проектируем очень хуево дизассемблируемый код)
int T[256] =
{
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
// , - 0 1 2 3 4 5 6 7 8 9
0,0,0,0,0,0,0,0,0,0,0,0,2,3,0,0, 1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
};
for(;;)
{
int A;
switch( S )
{
case 0:
switch( T[*c] )
{
case 1: { S=1; A=1; }; break;
default: { S=5; A=2; }; break;
}
break;
case 1:
switch( T[*c] )
{
case 2: { S=0; A=2; }; break;
case 1: { S=1; A=3; }; break;
case 3: { S=2; }; break;
case 4: { S=4; A=2; }; break;
case 0: { S=5; }; break;
}
break;
case 2:
switch( T[*c] )
{
case 1: { S=3; A=4; }; break;
default: { S=5; }; break;
}
break;
case 3:
switch( T[*c] )
{
case 2: { S=0; A=5; }; break;
case 1: { S=3; A=6; }; break;
case 4: { S=4; A=5; }; break;
default: { S=5; }; break;
}
break;
case 4:
A = 7;
break;
case 5:
A = 8;
break;
}
switch( A )
{
case 1: { l=*c-'0'; c++; }; break;
case 2: { store(l,l); c++; }; break;
case 3: { l=l*10+*c-'0'; c++; }; break;
case 4: { h=*c-'0'; c++; }; break;
case 5: { store(l,h); c++; }; break;
case 6: { h=h*10+*c-'0'; c++; }; break;
case 7: { exit(); }; break;
case 8: { error(); }; break;
}
}
j123123 22.06.2016 10:41 # +1
inkanus-gray 22.06.2016 13:18 # +2
http://govnokod.ru/13242
j123123 22.06.2016 13:24 # +1
inkanus-gray 22.06.2016 13:28 # +1
inkanus-gray 22.06.2016 13:39 # 0
j123123 22.06.2016 13:53 # +1
http://stackoverflow.com/a/28670713
inkanus-gray 22.06.2016 14:03 # 0
1. В режиме thumb прыгнуть в середину четырёхбайтовой инструкции.
2. Исполнить одну и ту же цепочку байтов и как thumb, и как ARM (придётся подобрать цепочку, которая имеет смысл в обоих режимах).
3.14159265 22.06.2016 15:02 # 0
Самое интересное заключается в том, что все показанные здесь
преобразования кода возможно осуществлять автоматически,
то есть конвертировать части обычных бинарных программ или сорцов
в конечные автоматы и/или заменять порядок выполнения команд
функцией.
Предположим, что в качестве переменной части состояния автомата
был бы использован не флаг ZF, а, скажем, значение регистра AL.
Тогда для получения всей информации, закодированной в функции,
на каждом шаге пришлось бы анализировать 256 вариантов.
А если бы это был регистр AX, то при проверке первых
двух байт файла на MZ, из текущего состояния было бы 65534 перехода
на одну ветвь исполнения, и 2 перехода на другую ветвь.
При еще больших размерах состояний, перебор всех состояний на
каждом шаге стал бы еще более трудным, и тогда часть программы,
отвечающая за изменение того же exe файла была бы пропущена,
то есть не была бы экстрактирована из функции.
В идеале такая функция должна представлять собой черный ящик,
в него подают текущее состояние - он возвращает следующее,
а получить значение из середины последовательности крайне сложно.
guest 24.06.2016 10:07 # 0
Dummy00001 22.06.2016 11:43 # 0
ЗЫ
> его через какой-то ragel делают
к слову, если ты на встроенщине трахаешься, то тебе ragel может быть даже и понравится - http://www.colm.net/open-source/ragel/
3.14159265 22.06.2016 14:57 # 0
Мне это нравится.
inkanus-gray 22.06.2016 15:31 # +1
bormand 22.06.2016 18:42 # 0
inkanus-gray 22.06.2016 19:48 # 0
3.14159265 22.06.2016 21:38 # 0