21

(198 відповідей, залишених у Системне програмування)

Для закріплення розуміння деяких моментів патчингу FASM'у, мені закортіло додати директиву, котра б розраховувала crc32-хеш (практичної цінності нема, бо усе це елементарним чином робиться макросами, але все ж таки).

Відкриваємо TABLES.INC переходимо до мітки data_directives та додамо нашу команду "crc32". Довжина назви - 5 символів, а так як у кожному розділі усі строкові літерали повинні йти у зростаючому порядку за кількістю символів і алфавітом, то назвемо наш новий підрозділ data_directives_5 (якраз після максимальної data_directives_4, яка описує директиву "file")

data_directives_5:
 db 'crc32',1
 dw data_crc32-instruction_handler

Потім коректуємо саму data_directives наступним чином (що воно значить, приходиться поки тільки догадуватись)

data_directives:
 dw data_directives_2-data_directives,(data_directives_3-data_directives_2)/(2+3)
 dw data_directives_3-data_directives,(data_directives_4-data_directives_3)/(3+3)
 dw data_directives_4-data_directives,(data_directives_5-data_directives_4)/(4+3)
 dw data_directives_5-data_directives,(data_directives_end-data_directives_5)/(5+3)

Далі переходимо до PARSER.INC, і шукаємо процедуру get_data_directive. Так як ми додали один підрозділ (data_directives_5) то у цій процедурі правимо

cmp cl, 4 

на

 cmp cl, 5  

Задумка така:

crc32_MessageBoxA crc32 'MessageBoxA'
  • crc32_MessageBoxA - мітка

  • crc32 - команда

  • 'MessageBoxA' - текст, хеш-суму котрого ми рахуємо

Відкриваємо ASSEMBLER.INC і в кінець додаєм наступний код:

data_crc32:
    lods word[esi]
    cmp al, '('
    jne invalid_argument
    lods dword[esi]         ;розмір строки
    
    push eax

    call get_crc32          ; в esi - текст, в eax - розмір тексту
    stos dword[edi]         ; пишем результат

    pop eax
    add esi, eax            ; пропускаємо усю строку
    inc esi                 ; пропускаємо \0

    jmp instruction_assembled   ; працюємо далі

Відкриваємо SYSTEM.INC та додаємо get_crc32:

get_crc32:
    mov edx, esi
    mov ecx, eax
    xor eax, eax
    test ecx, ecx
    je @4
    not eax

@1: xor al, byte[edx]
    inc edx
    mov bl, 8h

@2: shr eax, 1h
    jae @3
    xor eax, 0xEDB88320

@3: dec bl
    jne @2
    dec ecx
    jne @1
    not eax

@4:
    ret

Якщо поставимо бряк на початок нашої процедури (data_crc32) можемо побачити наступне:

- в esi буфер із виразом

002200F3  28 00 0B 00|00 00 4D 65|73 73 61 67|65 42 6F 78| (....MessageBox
00220103  41 00 00 00|00 00 00 00|00 00 00 00|00 00 00 00| A...............

- в edi буфер-приймач, куди ми запишемо результат, а FASM нам додасть його по місцезнаходженню нашой мітки.

Для перевірки, виконаємо наступний код

use32

mov eax, dword[crc32_MessageBoxA]
mov ecx, dword[crc32_ExitProcess]

crc32_MessageBoxA crc32 'MessageBoxA'       ; 0x572D5D8E
crc32_ExitProcess crc32 'ExitProcess'       ; 0x251097CC

http://i70.сайт-злодій/big/2015/0919/e2/f1edd9777e794ea61a01aaae2bac0fe2.png

Усе працює :)

22

(229 відповідей, залишених у Windows)

Це лише подачка секті опенсорс, не більше.
Мені досі не зрозуміла ця ідеологія (опенсорс): нафіга? Що воно гарантує?

23

(198 відповідей, залишених у Системне програмування)

0xDADA11C7 написав:

похідної від неї спеціалізації

А ще, іноді прокидається совість та боязнь можливого щодо наслідків подібного промислу.

А тому, кількість грошей залежить не від якості, а від продажів.

+1

24

(198 відповідей, залишених у Системне програмування)

cheappi386 написав:

А я вам заздрю, завжди мріяв про подібний "реверс" фан.

У мене теж була така мрія, але коли почало більш-менш щось виходити, це стало схожим на задротство: на фоні інших розвинутих технологій колупати недосконалий x86.. :| інакше не назовеш. Особистого кайфу, з часом, усе менше і менше надходить.

25

(14 відповідей, залишених у Інше)

Прихований текст

Військомати завжди були в компетенції військових частин, потім (~2 роки тому) приліпили туди міліцію, зараз, ніби, вже без них. Якщо не приймаєш повісток - твоє діло переходить в іншу кімнату - "розшук", але це гучно сказано, бо всім пофіг, і ніхто нікого не шукає. Повістки автоматом усім шлють, персональних кураторів на кожне діло там нема. Звісно не треба кудись рипатись під час призовів, мало чого. Таких як ви пане - навалом, у них рук не вистачить усіх проконтролювати. Не без казусів звичайно (як приклад, погрози судом інвалідам та давно померлим особам), або вже попадання під роздачу, но то рідкість. Ті хто треба - усі на місці, як Саакашвілі казав, боротьбу з корупцією у нас лиш на паперах видно))

26

(198 відповідей, залишених у Системне програмування)

Це пекло, доповнювати недокументований код на асмі *FACEPALM*
Застряг на нерозумінні, як отримати адресу на дані під час підготовки їх до запису в готовий файл щоб з ними щось можна було зробити (в моєму випадку це було пакування та шифрування). Тобто:

s db '11111111111111'
my_operator s     ; по s неможливо отримати адресу на дані ('11111111111111')

купа нелогічних літералів.. хоч би один коментар!
Тому про про більш складні речі (аллокатор) нічого не обіцяю :D Мене вже тіпає...

27

(198 відповідей, залишених у Системне програмування)

Ги, щось типу LLVM IR, де якось так:

%1 = add i32 2, 4
%2 = mul i32 %1, 12

Тобто усе із % на початку (%1, %2) - локальні змінні, які потім розподіляє LLVM. Ви мали на увазі, зробити подібне у FASM?

28

(198 відповідей, залишених у Системне програмування)

З приводу розподілу регістрів - ви маєте на увазі "віртуальні осередки", які формують якусь нашу мову, і цю мову ми потім розподіляємо на реальні регістри якогось проца?

29

(10 відповідей, залишених у C++)

reverse2500, а що за конференція?
Я якраз почав освоювати цей доволі перспективний інструмент.

30

(198 відповідей, залишених у Системне програмування)

0xDADA11C7, із LLVM бавились?

Оригінал:

Прихований текст

http://habrastorage.org/getpro/habr/post_images/1cd/191/8df/1cd1918df35fc3a6415ea062a870bf75.png

Обфускація № 1:

Прихований текст

http://habrastorage.org/getpro/habr/post_images/059/514/fbc/059514fbc8ed18c7ed3886bcd7e0f013.png

Обфускація № 2:

Прихований текст

http://habrastorage.org/getpro/habr/post_images/002/f9d/8f7/002f9d8f7663fcabff249b136a7741ab.png

Обфускація № 3:

Прихований текст

http://habrastorage.org/getpro/habr/post_images/9a4/75d/584/9a475d584ddddfa551002f3488f76f9e.png

_http://домен агресора/post/213259/

Звичайно хотілося б елегантніше за допомогою одного fasm, але ККД у порівнянні із вищенаведеним.. Дехто заїкався, що від детекту деякими АВ програми у пам'яті, можна захиститися лишень морфингом сирців, або ж щось по типу McSema писати. Що ви гадаєте про детект у пам'яті?

31

(10 відповідей, залишених у C++)

koala написав:

Я не розумію, чому там два рази dword ptr [esp+0Ch] було.

push Caption
push Text

а потім просто розраховує місцезнаходження на тому ж стеку на фоні зміщення (виникає після чергового push), тобто:

0x0012FF7C + 0xC = Caption
0x0012FF78 + 0xC = Text

0012FF74  /00402008   @.  ; ASCII "text"
0012FF78  |00402000  . @.  ; ASCII "caption"    ; другий push    dword ptr [esp+0Ch]
0012FF7C  |00000000  ....                       ; перший push    dword ptr [esp+0Ch]
0012FF80  \00401024  $@.  ; /RETURN from main.00401000 to main.main_EP+0F
0012FF84  /00402008   @.  ; |Arg1 = ASCII "text"
0012FF88  |00402000  . @.  ; \Arg2 = ASCII "caption"

Регулюється усе ключами. Це, будувалось із /Os.

koala написав:

І, до речі, оптимізований код - якраз без зайвого виклику.

Була бажана оптимізація за розміром коду.

32

(10 відповідей, залишених у C++)

Як завжди: усе просто!!!

/Ob0                   Disable inlining

.text:00401000 sub_401000      proc near               ; CODE XREF: start+Ap
.text:00401000
.text:00401000 lpText          = dword ptr  4
.text:00401000 lpCaption       = dword ptr  8
.text:00401000
.text:00401000                 push    0               ; uType
.text:00401002                 push    [esp+4+lpCaption] ; lpCaption
.text:00401006                 push    [esp+8+lpText]  ; lpText
.text:0040100A                 push    0               ; hWnd
.text:0040100C                 call    MessageBoxA
.text:00401012                 retn    8
.text:00401012 sub_401000      endp
.text:00401012
.text:00401015
.text:00401015 ; =============== S U B R O U T I N E =======================================
.text:00401015
.text:00401015 ; Attributes: noreturn
.text:00401015
.text:00401015                 public start
.text:00401015 start           proc near
.text:00401015                 push    offset Caption  ; "caption"
.text:0040101A                 push    offset Text     ; "text"
.text:0040101F                 call    sub_401000
.text:00401024                 push    0               ; uExitCode
.text:00401026                 call    ExitProcess
.text:00401026 start           endp

33

(10 відповідей, залишених у C++)

А чого воно тоді не використовується? Oo Студія, наприклад, це оптимізувала.

call 00401000

34

(229 відповідей, залишених у Windows)

Щодо свого 209-го питання - вся "проблема" у лінкері. За'nop'ити відповідні call'и (що пише debug, та супутні дані) вдалося, але залишилася проблема із розміром секції.. коротше простіше використати сторонній лінкер))

35

(10 відповідей, залишених у C++)

reverse2500 написав:

а якої версії clang ?

clang version 3.7.0 (tags/RELEASE_370/final)
Target: i686-pc-windows-msvc
Thread model: posix

36

(10 відповідей, залишених у C++)

Доброго дня, панове.
Компілюю за допомогою clang наступний код:

#include <windows.h>

class Test {
public:
    void f(const char*, const char*);
};

void Test::f(const char *a, const char *b) {
    MessageBoxA(0, a, b, 0);
}

int main() {
    Test t;
    t.f("text", "caption");

    ExitProcess(0);
}

воно мені згенерувало наступне:

.text:00401000                 push    0
.text:00401002                 push    dword ptr [esp+0Ch]
.text:00401006                 push    dword ptr [esp+0Ch]
.text:0040100A                 push    0
.text:0040100C                 call    MessageBoxA
.text:00401012                 retn    8
.text:00401015
.text:00401015 ; =============== S U B R O U T I N E =======================================
.text:00401015
.text:00401015                 public start
.text:00401015 start           proc near
.text:00401015                 push    0               ; uType
.text:00401017                 push    offset Caption  ; "caption"
.text:0040101C                 push    offset Text     ; "text"
.text:00401021                 push    0               ; hWnd
.text:00401023                 call    MessageBoxA
.text:00401029                 push    0               ; uExitCode
.text:0040102B                 call    ExitProcess
.text:0040102B start           endp

Що це за шматок починаючи із 00401000 і до 00401012 ? Це наслідок, що він в активній розробці (фронтенд частина), і поки не займається подібними дрібницями (оптимізація)?

37

(198 відповідей, залишених у Системне програмування)

0xDADA11C7 написав:

Я маю ще одне питаннячко по FASM`у, я б хотів побачити ще виділення регістрів в ассемблері, бо GCC має інтерхвейс взаємодії вбудованого асемблеру з аллокатором регістів, але я б хотів навпаки  *JOKINGLY* Маєте якісь думки з цього приводу?

Я навіть не знаю що це.

38

(14 відповідей, залишених у Статті)

Заперечити нема чого, важко усвідомити.

0xDADA11C7 написав:

або руйнувати постмодерн, або бути його архітектором.

Що вибрали ви?

39

(14 відповідей, залишених у Статті)

Я мав на увазі мотивацію, що якщо я не буду працювати - я туди попаду. А я туди не хочу. Де тут ідея?

40

(14 відповідей, залишених у Статті)

0xDADA11C7 написав:

якби вам не подобалося, то ви б тут і не балакали б

"створити якийсь рух" - в моєму розумінні це "коло за інтересами", так ось таке коло було, при чому приймалися різні рішення і думки часто не сходилися, і через це ти постійно відчував дискомфорт. Мабуть фігова була організація дійства, хз. А тут я добровільно вбиваю нудьгу: хочу - роблю, не хочу - ні, мені це й справді подобається.

0xDADA11C7 написав:

Якби ви мені розповіли про те, як гроші допоможуть досягнути мені моєї мрії - побачити розмотані партноменклатурні кишки (та їхніх сраколизів) на огорожі їхніх же осель, то я б посилено з ранку до ночі думав би про гроші, спав би думав і їв би думав  *YES*

То ви що, ідейний?) Мені іноді важко вас зрозуміти.