1 Востаннє редагувалося anakin (24.04.2016 18:00:53)

Re: Використання мови Brainfuck для подолання антивірусного захисту

Інтерпретатор brainfuck

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>


int main(void)
{
    uint8_t *m = calloc(30000, sizeof(uint8_t));
    uint32_t b = 0;

    char *c = "++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.";

    while (*c) {
        *c == '>' && ++m, *c == '<' && --m, *c == '+' && ++*m, *c == '-' && --*m,
        *c == '.' && putchar(*m), *c == ',' && (*m = getchar());
        if (*c == '[' && !*m && ++b) while (b) ++c, *c == '[' && ++b, *c == ']' && --b;
        if (*c == ']' &&  *m && ++b) while (b) --c, *c == '[' && --b, *c == ']' && ++b;

        c++;
    }

    return 0;
}

та на asm, розмір 123 б.

    cinvoke calloc, 30000, 1

    mov esi, eax    ; память
    mov edi, c      ; код
    xor ebx, ebx    ; счетчик вложенности []

    jmp .s
@@: cmp byte[edi], '>'
    jne .1
    inc esi
.1: cmp byte[edi], '<'
    jne .2
    dec esi
.2: cmp byte[edi], '+'
    jne .3
    inc byte[esi]
.3: cmp byte[edi], '-'
    jne .4
    dec byte[esi]
.4: cmp byte[edi], '.'
    jne .5
    movzx eax, byte[esi]
    push eax
    call [putchar]
    pop eax
.5: cmp byte[edi], ','
    jne .6
    call [getchar]
    mov byte[esi], al
.6: cmp byte[edi], '['
    jne .7
    cmp byte[esi], 0
    jne .7
    inc ebx
    jmp .c
.a: inc edi
    cmp byte[edi], '['
    jne .b
    inc ebx
.b: cmp byte[edi], ']'
    jne .c
    dec ebx
.c: test ebx, ebx
    jne .a
.7: cmp byte[edi], ']'
    jne .8
    cmp byte[esi], 0
    je .8
    inc ebx
    jmp .f
.d: dec edi
    cmp byte[edi], ']'
    jne .e
    inc ebx
.e: cmp byte[edi], '['
    jne .f
    dec ebx
.f: test ebx, ebx
    jne .d
.8: inc edi
.s: cmp byte[edi], 0
    jne @b
Подякували: leofun01, 0xDADA11C72

2

Тема: Використання мови Brainfuck для подолання антивірусного захисту

anakin написав:

Інтерпретатор brainfuck

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>


int main(void)
{
    uint8_t *m = calloc(30000, sizeof(uint8_t));
    uint32_t b = 0;

    char *c = "++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.";

    while (*c) {
        *c == '>' && ++m, *c == '<' && --m, *c == '+' && ++*m, *c == '-' && --*m,
        *c == '.' && putchar(*m), *c == ',' && (*m = getchar());
        if (*c == '[' && !*m && ++b) while (b) ++c, *c == '[' && ++b, *c == ']' && --b;
        if (*c == ']' &&  *m && ++b) while (b) --c, *c == '[' && --b, *c == ']' && ++b;

        c++;
    }

    return 0;
}

Дійсно brainfuck.
А для чого там #include<string.h> ?

Подякували: anakin1

3

Re: Використання мови Brainfuck для подолання антивірусного захисту

leofun01 спочатку написав malloc/memset, потім згадав про calloc, а хідер забув потерти.

Подякували: leofun011

4

Re: Використання мови Brainfuck для подолання антивірусного захисту

Мені от що на думку прийшло..

це

++++++++++[>++++++++++++++++++>+>+++++++++++++++++++++++>++++++++++++++++++++>+++++++++++++++++>+++++++++++++++++++<<<<<<-]>++++>++++++++>+++++++++>+++++>+>+++++

=

B8 12 EF CD AB С3

=

mov eax, 0ABCDEF12h
ret

і приклад використання

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>


int entry(void)
{
    uint8_t *m = calloc(7, sizeof(uint8_t)),
            *t = m;
    uint32_t b = 0;

    char *c = "++++++++++[>++++++++++++++++++>+>+++++++++++++++++++++++>++++++++++++++++++++>+++++++++++++++++>+++++++++++++++++++<<<<<<-]>++++>++++++++>+++++++++>+++++>+>+++++";

    while (*c) {
        *c == '>' && ++m, *c == '<' && --m, *c == '+' && ++*m, *c == '-' && --*m;
        if (*c == '[' && !*m && ++b) while (b) ++c, *c == '[' && ++b, *c == ']' && --b;
        if (*c == ']' &&  *m && ++b) while (b) --c, *c == '[' && --b, *c == ']' && ++b;

        c++;
    }

    m = t + 1;

    __asm {
        call m
        push eax
    }

    printf("%08X\n");

    return 0;
}

Як гадаєте, це занадто?

Подякували: 0xDADA11C7, leofun012

5

Re: Використання мови Brainfuck для подолання антивірусного захисту

Мені подобається, тільки я стрічки планую таким чином створювати. Ви не хвилюйтеся через це збочення, бо я ще гірше вигадував - оскільки все одно  доведеться вбудовувати в криптора алгоритм для нормалізації ентропії(BASE85/BASE64), то чому б не додати до брайнфакоподібної машини зчитування констант у вигляді BASE85/BASE64.

Подякували: anakin1

6 Востаннє редагувалося anakin (25.04.2016 11:31:12)

Re: Використання мови Brainfuck для подолання антивірусного захисту

Заради підсумку цієї дурниці опишу генератор fuck-коду із native-масиву.

native  => fuck => native

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>


#define A '>'
#define B '<'
#define C '+'
#define D '-'
#define E '['
#define F ']'


/* RC4 */
static uint8_t code[] = {
    0x55, 0x89, 0xE5, 0x81, 0xEC, 0x04, 0x01, 0x00, 0x00, 0xC7, 0x45, 0xFC, 0x00, 0x01, 0x00, 0x00, 
    0x8D, 0xBD, 0xFC, 0xFE, 0xFF, 0xFF, 0x89, 0xFE, 0x31, 0xC9, 0x31, 0xC0, 0xAA, 0x40, 0x3B, 0x45, 
    0xFC, 0x75, 0xF9, 0x31, 0xFF, 0x8A, 0x1C, 0x0E, 0x01, 0xDF, 0x89, 0xC8, 0x31, 0xD2, 0x8B, 0x5D, 
    0x0C, 0xF7, 0xF3, 0x8B, 0x45, 0x08, 0x8A, 0x1C, 0x10, 0x01, 0xDF, 0x89, 0xF8, 0x8B, 0x5D, 0xFC, 
    0xF7, 0xF3, 0x89, 0xD7, 0x8A, 0x1C, 0x0E, 0x86, 0x1C, 0x3E, 0x88, 0x1C, 0x0E, 0x41, 0x3B, 0x4D, 
    0xFC, 0x75, 0xD2, 0x31, 0xC9, 0x31, 0xC0, 0x31, 0xFF, 0x50, 0x41, 0x89, 0xC8, 0x31, 0xD2, 0x8B, 
    0x5D, 0xFC, 0xF7, 0xF3, 0x89, 0xD1, 0x8A, 0x1C, 0x0E, 0x01, 0xDF, 0x89, 0xF8, 0x8B, 0x5D, 0xFC, 
    0xF7, 0xF3, 0x89, 0xD7, 0x8A, 0x1C, 0x0E, 0x86, 0x1C, 0x3E, 0x88, 0x1C, 0x0E, 0x8A, 0x04, 0x0E, 
    0x02, 0x04, 0x3E, 0x8B, 0x5D, 0xFC, 0xF7, 0xF3, 0x8A, 0x1C, 0x16, 0x58, 0x03, 0x45, 0x10, 0x30, 
    0x18, 0x2B, 0x45, 0x10, 0x40, 0x3B, 0x45, 0x14, 0x75, 0xBF, 0xC9, 0xC2, 0x10, 0x00
};


void make_bf(uint8_t *c)
{
    size_t i = 0;

    for (size_t j = 0; j < 10; c[i++] = C, ++j);

    c[i++] = E;

    for (size_t k = 0; k < sizeof(code); ++k) {
        c[i++] = A;

        for (size_t j = 0; j < (code[k] - code[k] % 10) / 10; ++j)
            c[i++] = C;
    }

    for (size_t j = 0; j < sizeof(code); c[i++] = B, ++j);

    c[i++] = D, c[i++] = F;

    for (size_t k = 0; k < sizeof(code); ++k) {
        c[i++] = A;

        for (size_t j = 0; j < code[k] % 10; ++j)
            c[i++] = C;
    }

    printf("%s\n", c);
}


void make_nt(uint8_t *c, uint8_t *m)
{
    uint32_t b = 0;

    while (*c) {
        *c == A && ++m, *c == B && --m, *c == C && ++*m, *c == D && --*m;
        if (*c == E && !*m && ++b) while (b) ++c, *c == E && ++b, *c == F && --b;
        if (*c == F &&  *m && ++b) while (b) --c, *c == E && --b, *c == F && ++b;

        c++;
    }
}

int main(void)
{
    uint8_t *c = calloc(10000, sizeof(uint8_t));
    make_bf(c);

    // ---------------------------------------------------------

    uint8_t *m = calloc(sizeof(code) + 1, sizeof(uint8_t)), *rc4 = m;
    make_nt(c, m);

    // ---------------------------------------------------------

    uint8_t buf[] = { 0x7D, 0xF8, 0xB5 };   // => { 0x11, 0x11, 0x11 }
    uint8_t key[] = "secret key";

    ((void(*)(uint8_t*, uint32_t, uint8_t*, uint32_t))++rc4)(key, strlen(key), buf, sizeof(buf));

    // ---------------------------------------------------------

    for (size_t i = 0; i < sizeof(buf); printf("%02X ", buf[i]), ++i);

    return 0;
}

RC4 матиме такий вигляд ^_^

++++++++++[>++++++++>+++++++++++++>++++++++++++++++++++++>++++++++++++>++++++++++++
+++++++++++>>>>>+++++++++++++++++++>++++++>+++++++++++++++++++++++++>>>>>++++++++++
++++>++++++++++++++++++>+++++++++++++++++++++++++>+++++++++++++++++++++++++>+++++++
++++++++++++++++++>+++++++++++++++++++++++++>+++++++++++++>++++++++++++++++++++++++
+>++++>++++++++++++++++++++>++++>+++++++++++++++++++>+++++++++++++++++>++++++>+++++
>++++++>+++++++++++++++++++++++++>+++++++++++>++++++++++++++++++++++++>++++>+++++++
++++++++++++++++++>+++++++++++++>++>+>>++++++++++++++++++++++>+++++++++++++>+++++++
+++++++++++++>++++>+++++++++++++++++++++>+++++++++++++>+++++++++>+>++++++++++++++++
++++++++>++++++++++++++++++++++++>+++++++++++++>++++++>>+++++++++++++>++>+>>+++++++
+++++++++++++++>+++++++++++++>++++++++++++++++++++++++>+++++++++++++>+++++++++>++++
+++++++++++++++++++++>++++++++++++++++++++++++>++++++++++++++++++++++++>+++++++++++
++>+++++++++++++++++++++>+++++++++++++>++>+>+++++++++++++>++>++++++>+++++++++++++>+
+>+>++++++>+++++>+++++++>+++++++++++++++++++++++++>+++++++++++>++++++++++++++++++++
+>++++>++++++++++++++++++++>++++>+++++++++++++++++++>++++>+++++++++++++++++++++++++
>++++++++>++++++>+++++++++++++>++++++++++++++++++++>++++>+++++++++++++++++++++>++++
+++++++++>+++++++++>+++++++++++++++++++++++++>++++++++++++++++++++++++>++++++++++++
++++++++++++>+++++++++++++>++++++++++++++++++++>+++++++++++++>++>+>>+++++++++++++++
+++++++>+++++++++++++>++++++++++++++++++++++++>+++++++++++++>+++++++++>++++++++++++
+++++++++++++>++++++++++++++++++++++++>++++++++++++++++++++++++>+++++++++++++>+++++
++++++++++++++++>+++++++++++++>++>+>+++++++++++++>++>++++++>+++++++++++++>++>+>++++
+++++++++>>+>>>++++++>+++++++++++++>+++++++++>+++++++++++++++++++++++++>+++++++++++
+++++++++++++>++++++++++++++++++++++++>+++++++++++++>++>++>++++++++>>++++++>+>++++>
++>++++>++++++>+>++++++>+++++>++++++>++>+++++++++++>+++++++++++++++++++>+++++++++++
+++++++++>+++++++++++++++++++>+><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
<<<<<<<<<<<<<<<<<<<<<<<<-]>+++++>+++++++>+++++++++>+++++++++>++++++>++++>+>>>++++++
+++>+++++++++>++>>+>>>+>+++++++++>++>++++>+++++>+++++>+++++++>++++>+++++++++>+>++++
+++++>++>>++++>+++++++++>+++++++++>++>+++++++>+++++++++>+++++++++>+++++>++++++++>++
++++++>++++>+>+++>+++++++>>+++++++++>>+++++++++>+++>++>+++++++>+++>+++++++++>++++++
+++>++++++++>++++++++>++++++++>++++++>+>+++>+++++++>++++++++>+++++++++>+++>++>+++++
++>+++>+++++++>+++++>++++++++>++++++++>++++>++++>++++++++>++>++++++>++++++++>++++>+
++++>+++++++++>+++++++>++>+++++++>>+++++++++>+>+++++++++>++>+++++++++>+++++>>+++++>
+++++++>>+++++++++>>+++++++++>+++>++>+++++++>+++>+++++++>+++++++++>++++++++>+++++++
+>++++>+>+++>+++++++>++++++++>+++++++++>+++>++>+++++++>+++>+++++++>+++++>++++++++>+
+++++++>++++>++++>++++++++>++>++++++>++++++++>++++>++++++++>++++>++++>++>++++>++>++
+++++++>+++>++>+++++++>+++>++++++++>++++++++>++>++++++++>+++>+++++++++>++++++>+++++
+++>++++>+++>+++++++++>++++++>++++>+++++++++>+++++++++>>+++++++>+>+>++++>++++++>
Подякували: 0xDADA11C71