Re: Низькорівнева всячина
The world's leading source for technical x86 processor information.
цей сайт використовую як підказку коли потрібно щось дізасемблерувати, назразок типу коли в IDA дамп байтів
Ви не увійшли. Будь ласка, увійдіть або зареєструйтесь.
Ласкаво просимо вас на україномовний форум з програмування, веб-дизайну, SEO та всього пов'язаного з інтернетом та комп'ютерами.
Будемо вдячні, якщо ви поділитись посиланням на Replace.org.ua на інших ресурсах.
Для того щоб створювати теми та надсилати повідомлення вам потрібно Зареєструватись.
Український форум програмістів → Системне програмування → Низькорівнева всячина
Сторінки Попередня 1 2 3 4 5 … 10 Наступна
Для відправлення відповіді ви повинні увійти або зареєструватися
The world's leading source for technical x86 processor information.
цей сайт використовую як підказку коли потрібно щось дізасемблерувати, назразок типу коли в IDA дамп байтів
Тре було 32-байтовий масив сконвертити у строковий вигляд і навпаки, і я не знав про CryptBinaryToString, і тому створив велик наведений нижче:
format pe console
section '.code' import readable writeable executable
include 'win32ax.inc'
library msvcrt, 'msvcrt.dll'
import msvcrt,\
printf, 'printf',\
getchar, 'getchar'
proc print, buf
locals
frmt db '%02X', 0
endl
mov esi, [buf]
xor ecx, ecx
@@: movzx eax, byte[esi]
push ecx
cinvoke printf, addr frmt, eax
pop ecx
inc ecx
inc esi
cmp ecx, 32
jne @b
cinvoke printf, next_line
ret
endp
proc strkey_to_uint, s, u
mov esi, [s]
mov edi, [u]
xor ecx, ecx
@@: push ecx
mov eax, ecx
shr eax, 1
xor ecx, ecx
.end_step:
mov dl, byte[esi + ecx]
sub dl, '0'
cmp dl, 9
jng .is_num
push 'A' - 10
jmp .is_chr
.is_num:
push '0'
.is_chr:
mov dl, byte[esi + ecx]
pop ebx
sub dl, bl
cmp ecx, 0
jne .next_step
shl edx, 28
inc ecx
jmp .end_step
.next_step:
mov ebx, edx
and ebx, 0xF0000000
shr ebx, 24
or edx, ebx
mov byte[edi + eax], dl
pop ecx
add ecx, 2
add esi, 2
cmp ecx, 64
jl @b
ret
endp
proc uint_to_strkey, s, u
mov esi, [u]
mov edi, [s]
xor ecx, ecx
@@: push ecx
mov cl, 4
.end_step:
mov al, byte[esi]
shr al, cl
and al, 0xF
cmp al, 9
jng .is_num
push 'A' - 10
jmp .is_chr
.is_num:
push '0'
.is_chr:
pop edx
add eax, edx
mov byte[edi], al
inc edi
cmp cl, 4
jne .next_step
xor cl, cl
jmp .end_step
.next_step:
pop ecx
inc ecx
inc esi
cmp ecx, 32
jl @b
mov byte[edi], 0
ret
endp
entry $
stdcall strkey_to_uint, key_str, buf_uint8
stdcall print, buf_uint8
cinvoke printf, key_str
cinvoke printf, next_line
stdcall uint_to_strkey, buf_char, buf_uint8
cinvoke printf, buf_char
cinvoke getchar
xor eax, eax
ret
key_str db '1122334455667788990011223344556677889900112233445566778899001122', 0
next_line db 13, 10, 0
buf_uint8 rb 32
buf_char rb 64 + 1
Ну і до пари на C, навіщо добру пропадать?
typedef enum _KEY_CONV_MODE {
KEY_ERROR = -1,
KEY_OK,
STRKEY_TO_UINT,
UINT_TO_STRKEY
} KEY_CONV_MODE;
int convert_key(char *s, uint8_t *u, KEY_CONV_MODE m) {
switch (m) {
int i;
case STRKEY_TO_UINT:
if (strlen(s) != 64)
return KEY_ERROR;
for (i = 0; i < 64; i += 2)
u[i / 2] = (s[i] - (s[i] - '0' <= 9 ? '0' : 'A' - 10)) * 16 + s[i + 1] - (s[i + 1] - '0' <= 9 ? '0' : 'A' - 10);
break;
case UINT_TO_STRKEY:
for (i = 0; i < 32; i++)
*s++ = (u[i] >> 4) % 16 + ((u[i] >> 4) % 16 <= 9 ? '0' : 'A' - 10),
*s++ = u[i] % 16 + (u[i] % 16 <= 9 ? '0' : 'A' - 10);
*s = '\0';
break;
default:
return KEY_ERROR;
}
return KEY_OK;
}
Використання RtlGenRandom на прикладі генератору паролів:
format pe console
section '.code' import readable writeable executable
include 'win32ax.inc'
library msvcrt, 'msvcrt.dll',\
advapi32, 'advapi32.dll'
import msvcrt,\
printf, 'printf',\
getchar, 'getchar'
import advapi32,\
RtlGenRandom, 'SystemFunction036'
proc xrand, min, max
locals
pRandomBuffer rd 1
endl
invoke RtlGenRandom, addr pRandomBuffer, 4
cmp eax, 0
je .err
mov eax, [pRandomBuffer]
xor edx, edx
mov ecx, [max]
div ecx
mov eax, edx
add eax, [min]
jmp .fin
.err:
xor eax, eax
dec eax
.fin:
ret
endp
proc rand_char, buf, num
locals
c db '0aA'
endl
mov edi, [buf]
xor ecx, ecx
@@: push ecx
push 3
push 0
call xrand
lea esi, [c]
add esi, eax
cmp eax, 0
je .is_num
push 26
jmp .is_chr
.is_num:
push 10
.is_chr:
push 0
call xrand
mov dl, [esi]
add dl, al
mov byte[edi], dl
pop ecx
inc edi
inc ecx
cmp ecx, [num]
jl @b
mov byte[edi], 0
ret
endp
entry $
xor ecx, ecx
@@: push ecx
stdcall rand_char, rand_buf, 32
cinvoke printf, frmt_str, rand_buf
pop ecx
inc ecx
cmp ecx, 40
jl @b
cinvoke getchar
xor eax, eax
ret
frmt_str db '%s', 13, 10, 0
rand_buf rb 32 + 1
треба робити УКР. ресурс по reverse engineering software
А цей ресурс чим вам не догодив?
Боїться що коли ресурс приверне увагу, адмін запанікує та всіх здасть.
Зараз настає час дрібних вікі-проєктів і сект навколо них, а тоді вже колись з'явиться ресурс на основі захищеної мережі, зміненим в бік системності правописом, форумним рушієм з покращеною категоризацією, власними відомими розробками, гривня матиме таке ж ходження, як і вівериця.
Є старенька стаття на ксакепі, під назвою "Морфим, не отходя от кассы: Мутация кода во время компиляции". Так ось там розписано про чудові можливості макросів FASM'у, за допомогою яких ми можемо дуже гарно обфускувати сирці.
Основою подібних речей - є генерація випадкових чисел. У тій статті використовувався лінійний конгруентний метод, початковим значенням котрого, є вбудована фішка FASM для отримання timestamp, а саме - %t. Той алгоритм - копія deprecated функції у crt - rand() (натомість, радять використовувати rand_s(), бекендом якої, у windows, є RtlGenRandom).
Значить розвивав я цю тему, пітончик мені генерував FASM'ом різні exe.. морфило доволі непогано. Але потім я запримітив наступне:
use32
min = 0xFFFF
max = 0xFFFFFFFF
rept 10 {
mov eax, min + %t mod max
}
видає:
mov eax, 0x55E18A39
mov eax, 0x55E18A39
mov eax, 0x55E18A39
mov eax, 0x55E18A39
mov eax, 0x55E18A39
mov eax, 0x55E18A39
mov eax, 0x55E18A39
mov eax, 0x55E18A39
mov eax, 0x55E18A39
mov eax, 0x55E18A39
Фіговий seed. Через подібну лажу, виникали "пробіли" (колізії) при генерації. Вирішення? або ж треба ставити sleep() на кожній ітерації, або.. тоді я не додумав - додати функціонал до самого FASM.
Версія FASM, яку ми будемо доповнювати - 1.71.39
Відкриваємо PARSER.INC шукаємо наступне:
cmp al,'t'
je get_timestamp_id
після нього пишемо:
cmp al, 'r'
je get_rnd_id
шукаємо:
get_org_origin_id:
mov eax,3
ret
після пишемо:
get_rnd_id:
mov eax, 4
ret
Відкриваємо EXPRCALC.INC і шукаємо:
cmp eax,3
je org_origin_label
після нього пишемо:
cmp eax, 4
je rnd_label
шукаємо:
timestamp_label:
call make_timestamp
make_qword_label_value:
stos dword [edi]
mov eax,edx
stos dword [edi]
add edi,0Ch
jmp calculation_loop
після нього пишемо
rnd_label:
call make_rnd
stos dword [edi]
xor eax,eax
stos dword [edi]
add edi,0Ch
jmp calculation_loop
У FASM.ASM додаєм нову API:
dd 0,0,0,rva advapi_name,rva advapi_table
advapi_table:
RtlGenRandom dd rva _RtlGenRandom
dd 0
advapi_name db 'advapi32.dll', 0
_RtlGenRandom dw 0
db 'SystemFunction036', 0
у секції зі змінними (section '.data'), додаєм
pRandomBuffer rd 1
Відкриваємо SYSTEM.INC, та у кінці додаєм наступну процедуру:
make_rnd:
push 4
push pRandomBuffer
call [RtlGenRandom]
cmp eax, 0
je .err
mov eax, [pRandomBuffer]
jmp .fin
.err:
xor eax, eax
dec eax
.fin:
ret
Компілюємо. Запускаємо наступний код:
use32
min = 0xFFFF
max = 0xFFFFFFFF
rept 10 {
mov eax, min + %r mod max
}
маємо:
mov eax, 0xAEE20D07
mov eax, 0x475732CE
mov eax, 0x91EDBD28
mov eax, 0x19F13DFD
mov eax, 0xDA4ED476
mov eax, 0xF6563F6F
mov eax, 0xE3C7984B
mov eax, 0xA6C7CB04
mov eax, 0xDCB228FA
mov eax, 0xF4FD6E45
Інша справа
Як ви могли помітити, задля своєї забаганки, ми забронювали %r
А чому ви не використовували попереднє значення псевдорандому для генерації наступного?
А чому ви не використовували попереднє значення псевдорандому для генерації наступного?
І не такі милиці було пороблено. Джерело ентропії у даному випадку і для подібної задачі - дуже невдале, а при одночасному запуску декількох процесів FASM - виникає повна або часткова колізія. Працює через раз, що є неприпустимо.
quez написав:А чому ви не використовували попереднє значення псевдорандому для генерації наступного?
І не такі милиці було пороблено. Джерело ентропії у даному випадку і для подібної задачі - дуже невдале, а при одночасному запуску декількох процесів FASM - виникає повна або часткова колізія. Працює через раз, що є неприпустимо.
Логічно.
В кінці кінців ви використовуєте RtlGenRandom, який
generates a pseudo-random number.
Чому не викликати її в виконуваному файлі? Це костиль, чи зроблено для зручності, чи просто шукали на свою голову задач?
quez, сенс у використанні випадкового значення на стадії препроцессингу (макроси).
Так, це не погана задача для ознайомлення з нутрощами подібних проектів, спортивний інтерес, ну і для зручності - RtlGenRandom все ж таки краще, аніж я би ліпив коників із суміші декількох технологій, тим паче працює "на стороні" - краще і придумати не можна.
а при одночасному запуску декількох процесів FASM - виникає повна або часткова колізія. Працює через раз, що є неприпустимо.
Дякую за ваш внесок, бачу працюєте в промислових масштабах До речі, щойно вийшла мова FASM2 й нині розробка мови асемблера для будь-якої залізяки дуже легка справа, бо нова макромова FASM2 добре для цього прилаштована. Найепічніші нововведення:
Також до дистрибутиву додається асемблери для 8051, 8086, Java Bytecode, avr, dcpu-16 писані макромовою FASM2 і приклади роботи з ними
оператор присвоєння з можливістю скасування нового значення і відновлення попереднього
Навіть не знаю, для чого це може бути використано, окрім як для внесення багів до програми.
Вірним шляхом крокує Томаш.
Тільки не вистачає найпримітивнішого I/O для повноцінного щастя. Раз він робить ставку на макроси у ядрі і тільки, було б дуже доречно.
quick sort
format pe console
section '.code' import readable writeable executable
include 'win32ax.inc'
library msvcrt, 'msvcrt.dll'
import msvcrt,\
printf, 'printf',\
getchar, 'getchar'
proc print, arr, n
locals
frmt_byte db '%d%s', 0
left_bracket db '[', 0
delim_comma db ', ', 0
right_bracket db ']', 13, 10, 0
endl
cinvoke printf, edx, addr left_bracket
mov esi, [arr]
xor ecx, ecx
@@: push ecx
mov edx, [n]
dec edx
cmp ecx, edx
jne .comma
lea edx, [right_bracket]
push edx
jmp .next
.comma:
lea edx, [delim_comma]
push edx
.next:
movzx eax, byte[esi]
cinvoke printf, addr frmt_byte, eax
add esp, 4
pop ecx
inc ecx
add esi, 4
cmp ecx, [n]
jne @b
ret
endp
proc qsort, arr, left, right
mov edx, [right]
mov ebx, [left]
mov edi, [arr]
@02:
mov ecx, ebx
lea eax, [edx + ebx]
mov esi, edx
mov eax, eax
test eax, eax
jns @03
add eax, 1
@03:
sar eax, 1
mov eax, dword[eax * 4 + edi]
jmp @05
@04:
inc ecx
@05:
cmp dword[ecx * 4 + edi], eax
jl @04
jmp @07
@06:
dec esi
@07:
cmp dword[esi * 4 + edi], eax
jg @06
cmp ecx, esi
jg @09
mov ebx, dword[ecx * 4 + edi]
mov dword[ebp + 8], ebx
mov ebx, dword[esi * 4 + edi]
cmp dword[ebp + 8], ebx
jle @08
mov dword[ecx * 4 + edi], ebx
mov ebx, dword[ebp + 8]
mov dword[esi * 4 + edi], ebx
@08:
inc ecx
dec esi
cmp ecx, esi
jle @05
@09:
mov ebx, dword[ebp + 12]
cmp ecx, edx
jge @10
stdcall qsort, edi, ecx, edx
@10:
cmp ebx, esi
jge @11
mov edx, esi
jmp @02
@11:
ret
endp
entry $
stdcall print, arr, arr_sz
stdcall qsort, arr, 0, arr_sz - 1
stdcall print, arr, arr_sz
cinvoke getchar
xor eax, eax
ret
arr dd 99, 88, 77, 66, 55, 44, 33, 22, 11
arr_sz = ($ - arr) / 4
[99, 88, 77, 66, 55, 44, 33, 22, 11]
[11, 22, 33, 44, 55, 66, 77, 88, 99]
Питання до пана 0xDADA11C7 бо він крипт шпрехає: на "ринку" є попит морфу smali-байткоду?
на ринку попит є на комплексні рішення, якби там був попит на окремі послуги, то третина ринку б озолотилася. Крипт андроїдних застосунків в сенсі? Так, попит є і платять більше ніж за звичайний крипт для вінди.
Я тут низькорівневий кібуц хочу створити для навчання початківців і мистецтва, стукну вам невдовзі з пропозицією.
Крипт андроїдних застосунків в сенсі?
і криптор і пакер є сенс, вже питали на ехелабі
. Крипт андроїдних застосунків в сенсі?
elf ARM чи байткод?