- 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
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int digits(char **arr_ptr, void **func_ptr)
{
char *a = *arr_ptr;
if (*a == '9')
{
if ( *(func_ptr-1) == NULL )
{
return 0;
}
else
{
*a = '0';
return ( *(int(*)(char **, void **)) *(func_ptr-1) )(arr_ptr-1,func_ptr-1);
}
}
(*a)++;
return 1;
}
int az_AZ(char **arr_ptr, void **func_ptr)
{
char *a = *arr_ptr;
if (*a == 'z')
{
*a = 'A';
return 1;
}
if (*a == 'Z')
{
if ( *(func_ptr-1) == NULL )
{
return 0;
}
else
{
*a = 'a';
return ( *(int(*)(char **, void **)) *(func_ptr-1) )(arr_ptr-1,func_ptr-1);
}
}
(*a)++;
return 1;
}
int main(void)
{
char a[] = "$#hui"; // $ - azAZ ; # - 1234567890
size_t len = strlen(a);
char **char_ptr_arr = malloc(sizeof(char *) * len);
char **char_ptr_arr_p = char_ptr_arr;
void **func_ptr = malloc(sizeof(void *) * (len+1));
func_ptr[0] = NULL;
void **func_ptr_p = func_ptr+1;
char *i = a;
while (*i != 0)
{
if (*i == '$')
{
*char_ptr_arr_p = i;
char_ptr_arr_p++;
*func_ptr_p = (void *)az_AZ;
func_ptr_p++;
*i = 'a';
}
else if (*i == '#')
{
*char_ptr_arr_p = i;
char_ptr_arr_p++;
*func_ptr_p = (void *)digits;
func_ptr_p++;
*i = '0';
}
i++;
}
printf("%s ", a);
while (( *(int(*)(char **, void **)) *(func_ptr_p-1) )(char_ptr_arr_p-1,func_ptr_p-1) != 0 )
{
printf("%s ", a);
}
printf("%s\n", a);
fflush(stdout);
free(char_ptr_arr);
free(func_ptr);
return 0;
}
Перебиралка всех кобенаций паролей по маске на сишке, где функции через стек из указателей на функции друг друга вызывают через воиды.
http://govnokod.ru/20137#comment333406 отсюда:
Надо конечно typedef всунуть для функции, но там жопа с рекурсивным определением функции X = (int()(char **, X **))
По сути, надо чтобы функция в качестве аргумента принимала указатель того же типа, что и та сама функция, а такое рекурсивное определение типа в Си нельзя делать
LispGovno 06.06.2016 22:31 # +1
Ой я тебя умаляю, в си все можно
j123123 06.06.2016 22:35 # 0
guestinho 06.06.2016 22:37 # 0
разве что такие опкоды, которые транслятор тупо не знает.
LispGovno 06.06.2016 22:42 # 0
guestinho 06.06.2016 22:45 # 0
j123123 06.06.2016 23:01 # 0
Тут меняется этот с0 c1 c2 байтик
вот зная особенности кодирования инструкций, можно эффективно из них в рантайме собирать код. Кроме того, есть такие инструкции, которые напрямую не написать на асме. Например mov rax, 0 может быть разной длины. Разное числн нулей
guestinho 06.06.2016 23:39 # 0
j123123 06.06.2016 23:56 # 0
inkanus-gray 07.06.2016 13:33 # +1
http://govnokod.ru/13242
j123123 07.06.2016 14:35 # +1
inkanus-gray 07.06.2016 14:40 # 0
Я пока не могу найти применения трюка с байтом mod-R/M (типа замены mov rax, 1 на mov rcx, 1), кроме как для написания самомодифицирующегося кода или для сокращения кода компилятора (скорее всего, последнее будет экономией на спичках).
j123123 07.06.2016 17:13 # 0
j123123 08.06.2016 03:59 # +2
http://www.masmforum.com/board/index.php?topic=1622.msg12575#msg12575
Можно в rasm2 протестировать (из http://radare.org/r/ ) через консолечку
Ассемблеру нельзя сказать, чтоб он эту длинную говноинструкцию с нулями сделал
bormand 12.06.2016 05:08 # 0
А зачем нахуя она тебе?
Ради места, в которое потом можно будет воткнуть что-то ненулевое?
inkanus-gray 12.06.2016 09:51 # 0
1. Ради выравнивания следующей инструкции, чтобы НОПы почём зря не вставлять.
2. А вдруг у инструкций разной длины пирфоманс разный? Например, на некоторых процессорах INC EAX быстрее, чем ADD EAX, 1, а на некоторых наоборот; на некоторых LOOP @1 быстрее, чем DEC ECX; ECXZ @1, а на некоторых наоборот и т. п.
gost 07.06.2016 13:53 # +4
- Кастуй указатели на функцию, блять, на, кастуй указатели.
- Как я кастовать-то буду?!
- Вот так вот, быстро, (*)(*)(*)(*)*! Кастуй!
guesto 07.06.2016 22:45 # +2