електр🟢нік ✙🟠рчбеч ඞ
так это у тебя пробежка по массиву фором, не?
електр🟢нік ✙🟠рчбеч ඞ
чета со строками мб
електр🟢нік ✙🟠рчбеч ඞ
не, с интами
Max
так это у тебя пробежка по массиву фором, не?
может я чот не понимаю, но я не вижу тут операций со строками. обфускация какая-то, и когда-то цикл должен закончиться, но я не могу представить когда
Max
перед заходом в loop ebx обнуляется
електр🟢нік ✙🟠рчбеч ඞ
бля
електр🟢нік ✙🟠рчбеч ඞ
int i=0; int* a = 0x41cd40 // адрес начала массива while(a[i] != 0){ i++; }
електр🟢нік ✙🟠рчбеч ඞ
вот эквивалентный код
Max
Тогда что означает mov edx, dword [eax*4 - 1]? там же в edx тройка в результате копируется?
електр🟢нік ✙🟠рчбеч ඞ
нет бля
електр🟢нік ✙🟠рчбеч ඞ
по адресу у тебя может лежать любая хуйня
Max
так у меня там -1 лежит
електр🟢нік ✙🟠рчбеч ඞ
-1 это стандартное наебалово от дизассемблера
Max
о как
Max
ахаххахахаха
Max
тогда тут je может вообще не выполняться?
електр🟢нік ✙🟠рчбеч ඞ
может
Max
*активно прозревает*
електр🟢нік ✙🟠рчбеч ඞ
я думаю это структура данных какая-то
електр🟢нік ✙🟠рчбеч ඞ
спереди -1, сзади 0
електр🟢нік ✙🟠рчбеч ඞ
длина в ебх возвращается
Max
наверное. бинарь точно должен сравнить введенное с какой-то строкой, может, она в какой-то структуре данных/массиве
електр🟢нік ✙🟠рчбеч ඞ
это крякми?
Max
да
Max
ладно, спасибо за помощь. попытаюсь разобраться, посижу еще
електр🟢нік ✙🟠рчбеч ඞ
да
скинь плез, давно ничего не крякал
Anonymous
https://youtu.be/5DlzeTcpXNQ
Eugene
@susume_tomorrow , @Aiwan и другие 📢
Aiwan \ (•◡•) / _bot
Ну что, есть идеи? :))
У мя ток стандартная операция, но думаю тебе не это надо
Eugene
У мя ток стандартная операция, но думаю тебе не это надо
Почему ж? Тут ничего сверхъестественного не надо :) Стандартное можно тоже по-разному сделать, особенно знаковое деление.
електр🟢нік ✙🟠рчбеч ඞ
mov rbx,rdx ; preserve rdx xor rdx,rdx ; zero push qword [rcx+8] ; 128bit hi mov rax, [rsp] ; hi div rbx ; rax=quot hi mov [r8+8], rax pop rdx ; hi mov rax, [rcx] ; lo div rbx mov [r8], rax ; quot lo xchg rax, rdx ; rem 32
електр🟢нік ✙🟠рчбеч ඞ
електр🟢нік ✙🟠рчбеч ඞ
я пушу верх делимого и юзаю его дважды
Eugene
А зачем вообще стек юзать? Почему нельзя регистры? Так короче?
Eugene
первый его портит
Так, там остаток, который как раз и должен быть hi делимого ж.
електр🟢нік ✙🟠рчбеч ඞ
Eugene
кстати со стеком ужал до 29 байт
А ты правильность-то проверял? Потому что в том коде явно ошибка была.
електр🟢нік ✙🟠рчбеч ඞ
А ты правильность-то проверял? Потому что в том коде явно ошибка была.
почему? первый раз я делю старшие 64 бита на делитель и сохраняю старшую часть ответа, второй раз я делю всё число, получаю младшие 64 результата и остаток
Eugene
почему? первый раз я делю старшие 64 бита на делитель и сохраняю старшую часть ответа, второй раз я делю всё число, получаю младшие 64 результата и остаток
Ты пробовал тестить? Деление столбиком: 1. делим старшую часть делимого на делитель, получаем старшую часть частного. 2. соединяем остаток с младшей частью, делим на делитель, получаем младшую часть. А ты делишь 2-м этапом это же число, и там разумеется в ряде случаев возникает exception деления, т.к. делимое слишком большое.
електр🟢нік ✙🟠рчбеч ඞ
ага, понял, моя ошибка
Eugene
Я делал такое раньше, сейчас адаптировал под 64 бита и входные/выходные параметрв, получилось 28 байт (сравнил с твоим — один в один, если исправить ошибки, только 2 инструкции местами поменяны 😁) А в знаковом делении косяк, надо думать, как исправить :(
Aiwan \ (•◡•) / _bot
mov rax,-1 m1: add rax, 1 adc qword[r8+8],0 sub qword [rcx],rdx sbb qword [rcx+8],0 jnc m1 inc qword [rcx+8] add [rcx],rdx mov qword[r8],rax ;частное mov rax,qword[rcx] ;остаток 31 байт беззнаковое
Aiwan \ (•◡•) / _bot
но медленный
Eugene
🤣 даже оооооочень медленный :))
Eugene
Кстати, никто не гарантирует, что в [r8+8] изначально будет 0 :)
Eugene
И ещё: inc не меняет CF.
Aiwan \ (•◡•) / _bot
Aiwan \ (•◡•) / _bot
Кстати, никто не гарантирует, что в [r8+8] изначально будет 0 :)
из условия r8 ссылается на память, выделенную только что память винда заполняет нулями, в крайнем случае можно явно записать нули
Eugene
mov al,0ffh inc al
Ага, а старшие части кто менять будет? add rax,1 — 4 байта (на байт больше, чем inc rax)
Eugene
из условия r8 ссылается на память, выделенную только что память винда заполняет нулями, в крайнем случае можно явно записать нули
Я не писал, что эта память ранее не использовалась. Это макет функции, которая должна работать в любом случае 🙂
Aiwan \ (•◡•) / _bot
include 'win64ax.inc' .data val db 0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,00h,00h,00h,00h,00h,00h,00h,00h tchast rb 16 .code start: mov rcx,val mov rdx,0FFFFFFFFFFFFFFFFh mov r8,tchast ;------------------------------------------- mov rax,-1 m1: add rax, 1 adc qword[r8+8],0 sub qword [rcx],rdx sbb qword [rcx+8],0 jnc m1 inc qword [rcx+8] add [rcx],rdx mov qword[r8],rax ;частное mov rax,qword[rcx] ;остаток ;------------------------------------------- ;31 байт invoke ExitProcess,0 .end start
Aiwan \ (•◡•) / _bot
Я не писал, что эта память ранее не использовалась. Это макет функции, которая должна работать в любом случае 🙂
в таком случае надо указывать в условиях задачи начальные значения, и указать будет ли инициализация включаться в итоговый размер кода
Aiwan \ (•◡•) / _bot
val db 00h,00h,00h,00h,00h,00h,00h,00h,01h,00h,00h,00h,00h,00h,00h,00h mov rdx,0FFFFFFFFFFFFFFFAh поменяй проверь
Eugene
в таком случае надо указывать в условиях задачи начальные значения, и указать будет ли инициализация включаться в итоговый размер кода
Неее, это у тебя код, который работает только при определённых условиях (когда переменная под результат обнулена) 🙂
Aiwan \ (•◡•) / _bot
1 целая и 5-6 остаток
Eugene
Вот так проверь :) val db 00h,00h,00h,00h,00h,00h,00h,00h,01h,00h,00h,00h,00h,00h,00h,00h mov rdx,1 Если дождёшься решения :))
Eugene
Будет 0 в качестве частного.
Eugene
Если всё остальное правильно написано
Eugene
Троян!
Aiwan \ (•◡•) / _bot
делаю как могу, ну че ты
Aiwan \ (•◡•) / _bot
яженикаквы
Eugene
add rax,1 поставь и всё, будет на байт больше :)) Но решение забавное, конечно, учитывая, что я не выставлял ограничений на время выполнения 🤣
Aiwan \ (•◡•) / _bot
Aiwan \ (•◡•) / _bot
Будет 0 в качестве частного.
не, не будет adc qword[r8+8],0 скоректирует это
Eugene
не, не будет adc qword[r8+8],0 скоректирует это
А как он скорректирует, если inc не меняет CF, а после jnc CF=0 ? Он может изменить, если CF=1 на входе только... и это будет некорректное изменение.
Eugene
Поэтому inc rax → add rax,1
Aiwan \ (•◡•) / _bot