Re: Низькорівнева всячина
так
Ви не увійшли. Будь ласка, увійдіть або зареєструйтесь.
Ласкаво просимо вас на україномовний форум з програмування, веб-дизайну, SEO та всього пов'язаного з інтернетом та комп'ютерами.
Будемо вдячні, якщо ви поділитись посиланням на Replace.org.ua на інших ресурсах.
Для того щоб створювати теми та надсилати повідомлення вам потрібно Зареєструватись.
Український форум програмістів → Системне програмування → Низькорівнева всячина
Сторінки Попередня 1 2 3 4 5 6 7 … 10 Наступна
Для відправлення відповіді ви повинні увійти або зареєструватися
Це пекло, доповнювати недокументований код на асмі
Застряг на нерозумінні, як отримати адресу на дані під час підготовки їх до запису в готовий файл щоб з ними щось можна було зробити (в моєму випадку це було пакування та шифрування). Тобто:
s db '11111111111111'
my_operator s ; по s неможливо отримати адресу на дані ('11111111111111')
купа нелогічних літералів.. хоч би один коментар!
Тому про про більш складні речі (аллокатор) нічого не обіцяю Мене вже тіпає...
Це пекло, доповнювати недокументований код на асмі
Застряг на нерозумінні, як отримати адресу на дані під час підготовки їх до запису в готовий файл щоб з ними щось можна було зробити (в моєму випадку це було пакування та шифрування). Тобто:s db '11111111111111' my_operator s ; по s неможливо отримати адресу на дані ('11111111111111')
купа нелогічних літералів.. хоч би один коментар!
Тому про про більш складні речі (аллокатор) нічого не обіцяю Мене вже тіпає...
А я вам заздрю, завжди мріяв про подібний "реверс" фан.
А я вам заздрю, завжди мріяв про подібний "реверс" фан.
У мене теж була така мрія, але коли почало більш-менш щось виходити, це стало схожим на задротство: на фоні інших розвинутих технологій колупати недосконалий x86.. інакше не назовеш. Особистого кайфу, з часом, усе менше і менше надходить.
У мене теж була така мрія, але коли почало більш-менш щось виходити, це стало схожим на задротство: на фоні інших розвинутих технологій колупати недосконалий x86.. інакше не назовеш. Особистого кайфу, з часом, усе менше і менше надходить.
Я вас цілком розумію, проте це через відсутність співпраці між кодерами та похідної від неї спеціалізації. А тому, кількість грошей залежить не від якості, а від продажів. В умовах псевдосоцальної держави щось (навколо)наукове приречене бути на узбіччі суспільства.
похідної від неї спеціалізації
А ще, іноді прокидається совість та боязнь можливого щодо наслідків подібного промислу.
А тому, кількість грошей залежить не від якості, а від продажів.
+1
Для закріплення розуміння деяких моментів патчингу 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
Усе працює
Пропоную вам трошки доповнити цю роботу і викласти в розділ статті, бо дуже цікаву і гідну річ робите. Доповніть принаймні тим що компілер фасм'а на фасмі написаний.
Цей розділ замість нотатника.
Якщо це треба/актуально не тільки мені, то планую зарелізити мод з усіма доповненнями подібного роду, а також мануал з висновками по нутрощам проекту. Хотілося б саме FASMG: там і структура більш охайна, і коментарів трохи є.
Цей розділ замість нотатника.
Цю тему я для цього і створив, але прошу вас трішки розширити нотатку.
Якщо це треба/актуально не тільки мені, то планую зарелізити мод з усіма доповненнями подібного роду, а також мануал з висновками по нутрощам проекту.
Було б дуже добре!
Хотілося б саме FASMG: там і структура більш охайна, і коментарів трохи є.
Погоджуюся, але те що є для звичайного FASM`у теж варте уваги.
Є задумка зробити практичніше - вбудувати скриптовий двигун (луа чи пайтон).
Що б ви за його допомогою робили (ну окрім файлового I/O)? Накидайте ідей.
Що б ви за його допомогою робили (ну окрім файлового I/O)? Накидайте ідей.
Я б багато чого робив би по-людськи: шифрування, пакування ресурсів, людський імпорт функцій, . І взагалі з такими можливостями я б написання софту перевів би ближче до предмету софту, якщо ви розумієте про що я
Є задумка зробити практичніше - вбудувати скриптовий двигун (луа чи пайтон).
Ваш шлях не менш цікава річ, ніж кінцевий результат, тому викладайте що маєте.
Kane
Ви бачили мову/фреймворк ABAKIS? Цікавезна штукенція! Створена за допомогою фасмівських препроцесора і директив. Правда автор все одно пропатчив фасм з метою додавання директив ?if, ?while, ?x.
Приклад уживання цього фреймворку:
; ABAKIS EXAMPLE. SEE \INCLUDE\
include 'z.inc'
text t(64), s(64), f='LOG.TXT'
text m(64)='NOItUlOVe ReLBmESsa SikaBa'
function test.text
text.copy t, m
say t
text.reverse t
text.upper t
text.attach.c t, '!'
endf
function test.number
say.n 4294967295
say.h 0ABCDEF12h
say.h 0FFFFFFFFh
say.b 11110000111100001111b
endf
function test.memory
locals p
try p=allocate 33
memory.zero p, 33
memory.set p, '1234', 32
say p
destroy p
endf 1
function test.file
locals n
get n=text.n t
try create f
write t, n
close
try open f
read s, n
say s
close
execute f
endf 1
function test.io
test.memory
if false
say 'Memory allocation error'
return 0
end
test.file
if false
say 'File I/O error'
return 0
end
endf 1
function main
test.text
test.number
try test.io
endf
Мені багато чого неподобається, але автор добре абстрагувався від машинного коду та має системні знання з фасмівської мови компіляції.
ABAKIS бачив, вражає.
Існують думки, як ви кажете, щодо курсу розробки "до предмету софту", але досі не знаю як зробити краще та простіше. Ходить думка, зрозуміти як воно працює (FASM), та переписати на тому ж c++, ну а там усі плюхи які тільки прийдуть до розуму.. Або брати курс, та рухатись за розвитком FASMG. Гарно треба обмізкувати, все таки "грандіозне", у якомусь плані, діло коїться.
Які маєте думки на рахунок автоматичного відокремлення даних від коду? Писати емулятора задля аналізу?
Технічний вибір тут не найголовніше, бо така велика розробка має бути виправдана планами на майбутнє і деякою кількістю потенційних якісних споживачів(кодерів, а не замовників кінцевого продукту). Вибір технології не має великого значення, хоч на ноді, хоч на рубі, все одно доведеться розбиратися з роботою компіляторів. "Грандіозним" це діло може стати лише за умови спеціалізації і злагодженої роботи учасників. Щодо "предмету софту", то я за кодогенерацію з "формул" і (багато)модульну систему зі змінними модулями на одному інтерхвейсі. Під "формулами" я розумію опис (зазвичай чужих) програмних структур в пам'яті процесів та потрібних для перехоплення функцій. Вони повинні мати добрі засоби візуалізації. Кінцевий згенерований джерельний код не повинний містити натяки на його генерацію фреймворком, щоби мати змогу застосовувати його і для цивільних проєктів.
Якщо ви про цей проєкт, то автоматичного відокремлення нам не потрібно, бо ручного досить щоби запустити повний технологічний цикл з кодогенерацією (що означає найшвидші оновлення в софті, бо данні зворотнього розробника швидше втіляться в код), і наномітами.
Поспіхом писав, у думках срач, тому забув розкрити суть останнього речення. Я думав про модуль для морфу коду - поставив мітки start/end і гоу мета- полі- гіперсексі- морфні збочення над кодом. Подумки розвив тему у відокремлення подібного модуля, і згадав одвічну проблему - як відрізнити код і дані? Окрім написання емулятора, задля максимального аналізу коду, нічого не надумав. Які ваші думки? Знаю, що остаточного рішення від усіх проблем нема, але як би максимально збільшити вірогідність успішного виконання.. коротше треба багато базікати аби розвивати подібні фантазії.
Один фіг, построчно треба зубрити кода фасма, тому придумувати собі інші варіанти рішення задачі, аби типу змахлювати/упростити працю - нє нада.
Я думаю що навіть FASMG вже може щось таке робити, якщо визначити макросами нову "платформу" з генерацією криптованого коду. При чому крипторежим можливо вмикати/вимикати на будь-яких ділянках коду. Хочеш - криптуй все з початку виконання без якогось спеціального прологу, а хочеш - уживай пролог/епілог для маленьких ділянок особливо важливого коду(генерація серійних номерів, наприклад) з генерацію окремих віртуальних машин. Дані од коду одрізнимо за опкодом
Для криптування треба визначитися з інтерхвейсами, щоби мутація коду могла бути багатошаровою. Одне це вже має створити перепони для аверів у геометричній прогресії. Найпростіший приклад -- спочатку ми переставляємо місцями/заміняємо опкоди х86 процесора, а потім вже віртуалізуємо за допомогою ВМ, а потім можемо вже мофити пікод ВМ, замінюючи опкоди, а потім вже образ ВМ -- частину переходів у замінити на якусь подобу наномітів. Та вони сказяться в своїй конторі од такого "щастя".