- 1
https://youtu.be/hB6eY73sLV0?t=241
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
Всего: 335
+70
https://youtu.be/hB6eY73sLV0?t=241
Исполнение произвольного кода(в данном случае Flappy Bird) в Super Mario World. Запись инструкций в память происходит посредством прыжков в нужных координатах.
−47
int hardinfo_updata( struct UPINFO * headinfo, struct HARDINFO * hardinfo )
{
char sbuf[128] ;
int sn_len = 0 ;
char *psn ;
printf("%s\n",__FUNCTION__ ) ;
memset( sbuf, 0xFF, 128 ) ;
if( strcmp( hardinfo->flag, "hardinfo") != 0 )
{
psn = (char *)hardinfo ;
sn_len = *psn ;
psn += 1;
memcpy( sbuf, psn , 127 ) ;
}
else
{
sn_len = hardinfo->sn_len ;
memcpy(sbuf, hardinfo->sn, 128 ) ;
}
memcpy( hardinfo, &(headinfo->hardinfo), sizeof( struct HARDINFO ) ) ;
hardinfo->sn_len = sn_len ;
if( hardinfo->sn_len > 128 ) hardinfo->sn_len = 128 ;
memcpy( hardinfo->sn, sbuf, hardinfo->sn_len ) ;
memset( 0x30008000, 0xFF, 0x20000 ) ;
memcpy( 0x30008000, hardinfo, sizeof( struct HARDINFO ) ) ;
memset( sbuf, 0xFF, 128 ) ;
sprintf( sbuf, "%s %x %x\0", "nand erase 80000 80000 ;nand write 0x30008000", 0x80000, 0x20000) ;
run_command( sbuf,0);
memset( sbuf, 0, 128 ) ;
sprintf( sbuf, "%s %x\0", "nand read 0x31000000 80000 ", 0x20000 ) ;
run_command(sbuf, 0 ) ;
if( memcmp( 0x30008000, 0x31000000, sizeof( struct HARDINFO) ) != 0 )
{
printf("bootloader data crc error\n") ;
return 0 ;
}
else
{
printf("update hardinfo is ok\n") ;
}
return 1 ;
}
CRC через memcpy. Из пропатченного китайцами u-boot
−49
bool decode_hex(void *p, size_t max_len, const char *hexstr, size_t *out_len_)
{
static const unsigned char hexdigit_val[256] = {
['0'] = 0,
['1'] = 1,
['2'] = 2,
['3'] = 3,
['4'] = 4,
['5'] = 5,
['6'] = 6,
['7'] = 7,
['8'] = 8,
['9'] = 9,
['a'] = 0xa,
['b'] = 0xb,
['c'] = 0xc,
['d'] = 0xd,
['e'] = 0xe,
['f'] = 0xf,
['A'] = 0xa,
['B'] = 0xb,
['C'] = 0xc,
['D'] = 0xd,
['E'] = 0xe,
['F'] = 0xf,};
if (!p || !hexstr)
return false;
if (!strncmp(hexstr, "0x", 2))
hexstr += 2;
if (strlen(hexstr) > (max_len * 2))
return false;
unsigned char *buf = p;
size_t out_len = 0;
while (*hexstr) {
unsigned char c1 = (unsigned char) hexstr[0];
unsigned char c2 = (unsigned char) hexstr[1];
unsigned char v1 = hexdigit_val[c1];
unsigned char v2 = hexdigit_val[c2];
if (!v1 && (c1 != '0'))
return false;
if (!v2 && (c2 != '0'))
return false;
*buf = (v1 << 4) | v2;
out_len++;
buf++;
hexstr += 2;
}
if (out_len_)
*out_len_ = out_len;
return true;
}
https://gist.github.com/aido/9490244#file-der_test-L16 оптимизция!
−49
#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 **))
По сути, надо чтобы функция в качестве аргумента принимала указатель того же типа, что и та сама функция, а такое рекурсивное определение типа в Си нельзя делать
−17
(x) {
if F(x,x) then { for(;;) }
}
http://www.michurin.net/computer-science/halting-problem.html
Неразрешимость проблемы остановки имеет много доказательств. В терминах функций её очень просто доказать от противного.
Допустим, у нас уже есть решение — функция F, которая принимает на вход некую функцию (вернее строку с текстом функции, байт-кодом или иной записью функции) и некие данные и отвечает на вопрос: «остановится ли функция-первый-аргумент, при работе с данными-вторым-аргументом, или будет работать вечно?»
Давайте создадим функцию P(x), такого вида (на C-образном языке):
P(x) {
if F(x,x) then { for(;;) }
}
+6
> var x = new String("eval(x.toString())");
undefined
> eval(x.toString());
RangeError: Maximum call stack size exceeded
Yo dawg, I heard you like evaluation. So I put evaluation in your evaluation so you could evaluate while you evaluate
Жаль что nodejs не осиливает заоптимизировать это как бесконечный цикл
0
//...
/* See if this is something like X * C - X or vice versa or
if the multiplication is written as a shift. If so, we can
distribute and make a new multiply, shift, or maybe just
have X (if C is 2 in the example above). But don't make
something more expensive than we had before. */
if (SCALAR_INT_MODE_P (mode))
{
rtx lhs = op0, rhs = op1;
wide_int coeff0 = wi::one (GET_MODE_PRECISION (mode));
wide_int coeff1 = wi::one (GET_MODE_PRECISION (mode));
if (GET_CODE (lhs) == NEG)
{
coeff0 = wi::minus_one (GET_MODE_PRECISION (mode));
lhs = XEXP (lhs, 0);
}
else if (GET_CODE (lhs) == MULT
&& CONST_SCALAR_INT_P (XEXP (lhs, 1)))
{
coeff0 = std::make_pair (XEXP (lhs, 1), mode);
lhs = XEXP (lhs, 0);
}
else if (GET_CODE (lhs) == ASHIFT
&& CONST_INT_P (XEXP (lhs, 1))
&& INTVAL (XEXP (lhs, 1)) >= 0
&& INTVAL (XEXP (lhs, 1)) < GET_MODE_PRECISION (mode))
{
coeff0 = wi::set_bit_in_zero (INTVAL (XEXP (lhs, 1)),
GET_MODE_PRECISION (mode));
lhs = XEXP (lhs, 0);
}
if (GET_CODE (rhs) == NEG)
{
coeff1 = wi::minus_one (GET_MODE_PRECISION (mode));
rhs = XEXP (rhs, 0);
}
else if (GET_CODE (rhs) == MULT
&& CONST_INT_P (XEXP (rhs, 1)))
{
coeff1 = std::make_pair (XEXP (rhs, 1), mode);
rhs = XEXP (rhs, 0);
}
else if (GET_CODE (rhs) == ASHIFT
&& CONST_INT_P (XEXP (rhs, 1))
&& INTVAL (XEXP (rhs, 1)) >= 0
&& INTVAL (XEXP (rhs, 1)) < GET_MODE_PRECISION (mode))
{
coeff1 = wi::set_bit_in_zero (INTVAL (XEXP (rhs, 1)),
GET_MODE_PRECISION (mode));
rhs = XEXP (rhs, 0);
}
if (rtx_equal_p (lhs, rhs))
{
rtx orig = gen_rtx_PLUS (mode, op0, op1);
rtx coeff;
bool speed = optimize_function_for_speed_p (cfun);
coeff = immed_wide_int_const (coeff0 + coeff1, mode);
tem = simplify_gen_binary (MULT, mode, lhs, coeff);
return (set_src_cost (tem, mode, speed)
<= set_src_cost (orig, mode, speed) ? tem : 0);
}
}
https://gcc.gnu.org/viewcvs/gcc/trunk/gcc/simplify-rtx.c?view=markup&pathrev=232689#l2062 здоровенная такая функция из недр GCC, в которой делаются оптимизации, это сродни символьным вычислениям вообще говоря
https://godbolt.org/g/vcEqe7 но похоже эта хрень работает плохо, не смогло оно выявить тождественность умножения сдвигами и обычного умножения, сведя операции к return 1 в случае функции test1. Но я естественно находил и примеры кода, которые GCC смог успешно "редуцировать" своим оптимизатором, а clang тупил. Говно тут в том, что вместо того, чтобы впилить нормальную систему символьных вычислений, там нагородили какого-то ебучего говна... Хотя может быть я чего-то не понимаю в компиляторах. Надо будет дракона почитать
−48
# define l2cn(l1,l2,c,n) { \
c+=n; \
switch (n) { \
case 8: *(--(c))=(unsigned char)(((l2)>>24L)&0xff); \
case 7: *(--(c))=(unsigned char)(((l2)>>16L)&0xff); \
case 6: *(--(c))=(unsigned char)(((l2)>> 8L)&0xff); \
case 5: *(--(c))=(unsigned char)(((l2) )&0xff); \
case 4: *(--(c))=(unsigned char)(((l1)>>24L)&0xff); \
case 3: *(--(c))=(unsigned char)(((l1)>>16L)&0xff); \
case 2: *(--(c))=(unsigned char)(((l1)>> 8L)&0xff); \
case 1: *(--(c))=(unsigned char)(((l1) )&0xff); \
} \
}
https://github.com/openssl/openssl/blob/6218a1f57e7e25a6b9a798f00cf5f0e56a02ff31/crypto/des/des_locl.h#L151
Интересно, на кой им делать там &0xff если оно в unsigned char скастовано и лишние биты там уже обрезаны? Или они там предполагают что unsigned char может быть не 8-битным? И вообще, это какая-то херня, почему б просто не узнать endian и не сделать memcpy предварительно развернув байты в случае необходимости? Другого макроговна там тоже хватает
0
<div style="color: red; width: 100%; height:14pt; font-weight: bold;">STOP RUSSIAN AGGRESSION AGAINST
<span style="position: absolute; color: yellow; text-shadow: 1px 1px darkred;">
<span style="position: absolute; height: 50%; color: blue; overflow: hidden;">UKRAINE!</span>UKRAINE!</span>
</div>
Какой хитрый дизайнерский ход! Это было обнаружено на http://vxheaven.org/
пороюсь еще в исходниках вирусни которую там выкладывают, наверняка там много говна
предлагаю добавить html в список допустимых языков на говнокоде
+6
Что вообще за херня, почему для каждого язычка(рантайма) делают свой пакетный менеджер? pip, npm, cabal, Quicklisp, opam, nuget, NPMчо там еще?
И притом все они считают что для языка %LanguageName% всенепременно надо писать пакетный менеджер на нем самом.
Вот например когда я что-то устанавливл через pip, какая-то там херня требует openssl-devel. И узнаю я это только по ошибкам компиляции, ну т.е. там какая-то поебень криптографическая вызывается из питона, оно при установке компилирует через GCC некое говно которое инклудит какое-то .h говно от openssl, но поскольку этого .h нет, оно обламывается на этапе компиляции. Какого хера я про это должен узнавать только на этапе компиляции блядь? Какого хера я должен вручную разруливать эти говнозависимости? А если например будет программа на руби которая использует программу на лиспе, которая использует программу на хаскеле использующую программу на окамле, то что мне, всю эту поеботу тоже руками разруливать по цепочке?
https://blog.versioneye.com/2014/01/15/which-programming-language-has-the-best-package-manager/