Перейти к содержанию
Antonshka

imul шифрование

Рекомендуемые сообщения

4 минуты назад, Antonshka сказал:

Запишешь может видео

Прошу прощения - с видео не получиться - болею (в понедельник уже 3 недели ровно будет) голоса практически не осталось, да и головные боли задолбали.

Сейчас попробую прокомментировать скрипт.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
13 минут назад, Antonshka сказал:

вот немного модифицированный твой скрипт

Так подожди у тебя не модифицированный скрипт, а другой подход - ты ищешь непосредственно адрес.
я ищу старшую часть делимого 

 

8 часов назад, Antonshka сказал:

822AC75A_433C7EDD


Твой скрипт лучше. Работает быстрее. Гораздо быстрее.
так что два подхода.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
4 минуты назад, Garik66 сказал:

Так подожди у тебя не модифицированный скрипт, а другой подход - ты ищешь непосредственно адрес.
я ищу старшую часть делимого

Немного короче и работает с быстрыми регистрами. А так он вытек полностью из твоего скрипта.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
4 минуты назад, Antonshka сказал:

Немного короче и работает с быстрыми регистрами. А так он вытек полностью из твоего скрипта.

Ну это нормально - когда кто-то улучшает что-то 👍

Иначе бы до сих пор так ездили:

Спойлер

bfaaee47aebcf720836adbdd81f9986b.gif

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Благодарность @partoftheworlD, за его идею метода перебора.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
2 часа назад, Antonshka сказал:

Немного короче

Не ну если ещё короче :D, то ecx не нужен:

Спойлер

  push eax
  push ebx

Podbor:
  inc ebx
  imul eax,ebx,B05C6C43
  cmp eax,[Value]
  je @f
  jmp Podbor

@@:
  mov [adres],ebx
  mov [Value_EAX],eax
  pop ebx
  pop eax

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
9 часов назад, Garik66 сказал:

Не ну если ещё короче :D, то ecx не нужен:

Работать будет медленнее, так как доступ к регистрам всегда быстрее доступа к памяти.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как я понял, 0.8 секунды слишком много, нужно максимум 0.1 секунды, для комфорта.

Может пусть один регистр увеличивает на 1 с нуля, другой уменьшает на 1 с FFFFFFFF, то есть идут навстречу друг другу. Ещё например третий идет с 7FFFFFFFF до 0, четвертый с 7FFFFFFFF до FFFFFFFF. Итого четыре поисковика в одном потоке. Надо придумать как это реализовать в скрипте AA, максимально коротко и эффективно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
1 час назад, Antonshka сказал:

Может пусть

Разделил на 4, но скорость даже уменьшилась. Я сделал функциями и передаю через один регистр (может тут замедление).

Короче нужно поиграться, но скорее всего лучше не за компактностью скрипта гнаться, а сделать нормально - несколько потоков. (Ну и само собой не на Туториале )

Скрипт: 

Спойлер

{ Game   : Tutorial-i386.exe
  Version: 
  Date   : 2019-03-09
  Author : Garik66

  This script does blah blah blah
}

[ENABLE]
aobscanmodule(INJECT,Tutorial-i386.exe,81 BB 80 04 00 00 E8 03 00 00) // should be unique
alloc(newmem,$1000)
label(code)
label(return)
label(adres)
registersymbol(adres)
label(Value_EAX)
registersymbol(Value_EAX)
label(Value)
registersymbol(Value)
label(Start)
label(Podbor)
label(Podbor1)
label(Exit)
registersymbol(INJECT)

newmem:
  cmp [Value_EAX],0
  jne code
  pushad
  mov ecx,[Value]
  mov edx,0
  mov esi,7fffffff
  mov edi,7FFFFFFE
  mov ebp,FFFFFFFF

Start:
  mov ebx,edx
  call Podbor
  mov edx,ebx
  mov ebx,esi
  call Podbor
  mov esi,ebx
  mov ebx,edi
  call Podbor1
  mov edi,ebx
  mov ebx,ebp
  call Podbor1
  mov ebp,ebx
  jmp Start

Podbor:
  imul eax,ebx,B05C6C43
  cmp eax,ecx
  je Exit
  inc ebx
  ret

Podbor1:
  imul eax,ebx,B05C6C43
  cmp eax,ecx
  je Exit
  dec ebx
  ret

Exit:
  mov [adres],ebx
  mov [Value_EAX],eax
  popad

code:
  cmp [ebx+00000480],000003E8
  jmp return

adres:
  dd 0
Value_EAX:
  dd 0
Value:
 dd 0

INJECT:
  jmp newmem
  db 90 90 90 90 90
return:

[DISABLE]
INJECT:
  db 81 BB 80 04 00 00 E8 03 00 00

unregistersymbol(Value)
unregistersymbol(Value_EAX)
unregistersymbol(adres)
unregistersymbol(INJECT)
dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: "Tutorial-i386.exe"+24073

"Tutorial-i386.exe"+24061: C9                             -  leave 
"Tutorial-i386.exe"+24062: C3                             -  ret 
"Tutorial-i386.exe"+24063: 00 00                          -  add [eax],al
"Tutorial-i386.exe"+24065: 00 00                          -  add [eax],al
"Tutorial-i386.exe"+24067: 00 00                          -  add [eax],al
"Tutorial-i386.exe"+24069: 00 00                          -  add [eax],al
"Tutorial-i386.exe"+2406B: 00 00                          -  add [eax],al
"Tutorial-i386.exe"+2406D: 00 00                          -  add [eax],al
"Tutorial-i386.exe"+2406F: 00 53 89                       -  add [ebx-77],dl
"Tutorial-i386.exe"+24072: C3                             -  ret 
// ---------- INJECTING HERE ----------
"Tutorial-i386.exe"+24073: 81 BB 80 04 00 00 E8 03 00 00  -  cmp [ebx+00000480],000003E8
// ---------- DONE INJECTING  ----------
"Tutorial-i386.exe"+2407D: 75 2C                          -  jne Tutorial-i386.exe+240AB
"Tutorial-i386.exe"+2407F: 8B 83 68 04 00 00              -  mov eax,[ebx+00000468]
"Tutorial-i386.exe"+24085: B2 01                          -  mov dl,01
"Tutorial-i386.exe"+24087: 8B 8B 68 04 00 00              -  mov ecx,[ebx+00000468]
"Tutorial-i386.exe"+2408D: 8B 09                          -  mov ecx,[ecx]
"Tutorial-i386.exe"+2408F: FF 91 20 02 00 00              -  call dword ptr [ecx+00000220]
"Tutorial-i386.exe"+24095: 8B 83 78 04 00 00              -  mov eax,[ebx+00000478]
"Tutorial-i386.exe"+2409B: B2 00                          -  mov dl,00
"Tutorial-i386.exe"+2409D: 8B 8B 78 04 00 00              -  mov ecx,[ebx+00000478]
"Tutorial-i386.exe"+240A3: 8B 09                          -  mov ecx,[ecx]
}

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Лучше один раз на плюсах собрать, залепить многопоточность и думаю, можно уменьшить скорость выполнения до 0.03.
Вот одним потоком, не помню, что за значение считал.(тест выполнялся на виртуалке)
image.png.74972ff308ed472a5131fc5c2fa56e06.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня получился такой скрипт, с одним потоком.

Спойлер

[ENABLE]
alloc(PLACEImul_Crypt_scr_1,2048)
label(BACKImul_Crypt_scr_1)
label(Imul_Crypt_scr_1_Act)
label(Imul_Crypt_scr_1_Act_Cycle)
label(Imul_Crypt_scr_1_Crypt_Found)

alloc(Imul_Crypt_Checker,100)
registersymbol(Imul_Crypt_Checker)
alloc(Original_Value,100)
registersymbol(Original_Value)
alloc(Original_Value_Crypted,100)
registersymbol(Original_Value_Crypted)


PLACEImul_Crypt_scr_1:
cmp [Imul_Crypt_Checker],#1
je Imul_Crypt_scr_1_Act
cmp [ebx+00000480],000003E8
jmp BACKImul_Crypt_scr_1


Imul_Crypt_scr_1_Act://Imul_Crypt_scr_1_Act
push eax
push ebx
push edx
push ecx
mov ecx,[Original_Value]
push FFFFFFFF
push 7FFFFFFF
push 7FFFFFFF
push 0


Imul_Crypt_scr_1_Act_Cycle://Imul_Crypt_scr_1_Act_Cycle
add [esp],1
imul eax,[esp],B05C6C43
cmp eax,ecx
jne @f
mov ebx,[esp]
jmp Imul_Crypt_scr_1_Crypt_Found
@@:
sub [esp+4],1
imul eax,[esp+4],B05C6C43
cmp eax,ecx
jne @f
mov ebx,[esp+4]
jmp Imul_Crypt_scr_1_Crypt_Found
@@:
add [esp+8],1
imul eax,[esp+8],B05C6C43
cmp eax,ecx
jne @f
mov ebx,[esp+8]
jmp Imul_Crypt_scr_1_Crypt_Found
@@:
sub [esp+c],1
imul eax,[esp+c],B05C6C43
cmp eax,ecx
jne Imul_Crypt_scr_1_Act_Cycle
mov ebx,[esp+c]
jmp Imul_Crypt_scr_1_Crypt_Found


Imul_Crypt_scr_1_Crypt_Found://Imul_Crypt_scr_1_Crypt_Found
mov [Original_Value_Crypted],ebx
pop [esp]
pop [esp+4]
pop [esp+8]
pop [esp+c]
pop ecx
pop edx
pop ebx
pop eax
mov [Imul_Crypt_Checker],#0
cmp [ebx+00000480],000003E8
jmp BACKImul_Crypt_scr_1


/////////////////////////
"Tutorial-i386.exe"+24073:
jmp PLACEImul_Crypt_scr_1
nop
nop
nop
nop
nop
BACKImul_Crypt_scr_1:
[DISABLE]
dealloc(PLACEImul_Crypt_scr_1)
"Tutorial-i386.exe"+24073:
cmp [ebx+00000480],000003E8

 

Но и он ищет (float)555 более чем за 0,8 секунд.

 

Не помогло даже это

Спойлер

[ENABLE]
alloc(PLACEImul_Crypt_scr_1,10048)
label(BACKImul_Crypt_scr_1)
label(Imul_Crypt_scr_1_Act)
label(Imul_Crypt_scr_1_Act_Cycle)
label(Imul_Crypt_scr_1_Crypt_Found)

alloc(Imul_Crypt_Checker,100)
registersymbol(Imul_Crypt_Checker)
alloc(Original_Value,100)
registersymbol(Original_Value)
alloc(Original_Value_Crypted,100)
registersymbol(Original_Value_Crypted)


PLACEImul_Crypt_scr_1:
cmp [Imul_Crypt_Checker],#1
je Imul_Crypt_scr_1_Act
cmp [ebx+00000480],000003E8
jmp BACKImul_Crypt_scr_1


Imul_Crypt_scr_1_Act://Imul_Crypt_scr_1_Act
push eax
push ebx
push edx
push ecx
mov ecx,[Original_Value]
push 8FFFFFEE
push 87FFFFEF
push 7FFFFFF0
push 77FFFFF1
push 6FFFFFF2
push 67FFFFF3
push 5FFFFFF4
push 57FFFFF5
push 4FFFFFF6
push 47FFFFF7
push 3FFFFFF8
push 37FFFFF9
push 2FFFFFFA
push 27FFFFFB
push 1FFFFFFC
push 17FFFFFD
push FFFFFFE
push 7FFFFFF
push 0


Imul_Crypt_scr_1_Act_Cycle://Imul_Crypt_scr_1_Act_Cycle
add [esp],1
imul eax,[esp],B05C6C43
cmp eax,ecx
jne @f
mov ebx,[esp]
jmp Imul_Crypt_scr_1_Crypt_Found
@@:
add [esp+4],1
imul eax,[esp+4],B05C6C43
cmp eax,ecx
jne @f
mov ebx,[esp+4]
jmp Imul_Crypt_scr_1_Crypt_Found
@@:
add [esp+8],1
imul eax,[esp+8],B05C6C43
cmp eax,ecx
jne @f
mov ebx,[esp+8]
jmp Imul_Crypt_scr_1_Crypt_Found
@@:
add [esp+C],1
imul eax,[esp+C],B05C6C43
cmp eax,ecx
jne @f
mov ebx,[esp+C]
jmp Imul_Crypt_scr_1_Crypt_Found
@@:
add [esp+10],1
imul eax,[esp+10],B05C6C43
cmp eax,ecx
jne @f
mov ebx,[esp+10]
jmp Imul_Crypt_scr_1_Crypt_Found
@@:
add [esp+14],1
imul eax,[esp+14],B05C6C43
cmp eax,ecx
jne @f
mov ebx,[esp+14]
jmp Imul_Crypt_scr_1_Crypt_Found
@@:
add [esp+18],1
imul eax,[esp+18],B05C6C43
cmp eax,ecx
jne @f
mov ebx,[esp+18]
jmp Imul_Crypt_scr_1_Crypt_Found
@@:
add [esp+1C],1
imul eax,[esp+1C],B05C6C43
cmp eax,ecx
jne @f
mov ebx,[esp+1C]
jmp Imul_Crypt_scr_1_Crypt_Found
@@:
add [esp+20],1
imul eax,[esp+20],B05C6C43
cmp eax,ecx
jne @f
mov ebx,[esp+20]
jmp Imul_Crypt_scr_1_Crypt_Found
@@:
add [esp+24],1
imul eax,[esp+24],B05C6C43
cmp eax,ecx
jne @f
mov ebx,[esp+24]
jmp Imul_Crypt_scr_1_Crypt_Found
@@:
add [esp+28],1
imul eax,[esp+28],B05C6C43
cmp eax,ecx
jne @f
mov ebx,[esp+28]
jmp Imul_Crypt_scr_1_Crypt_Found
@@:
add [esp+2C],1
imul eax,[esp+2C],B05C6C43
cmp eax,ecx
jne @f
mov ebx,[esp+2C]
jmp Imul_Crypt_scr_1_Crypt_Found
@@:
add [esp+30],1
imul eax,[esp+30],B05C6C43
cmp eax,ecx
jne @f
mov ebx,[esp+30]
jmp Imul_Crypt_scr_1_Crypt_Found
@@:
add [esp+34],1
imul eax,[esp+34],B05C6C43
cmp eax,ecx
jne @f
mov ebx,[esp+34]
jmp Imul_Crypt_scr_1_Crypt_Found
@@:
add [esp+38],1
imul eax,[esp+38],B05C6C43
cmp eax,ecx
jne @f
mov ebx,[esp+38]
jmp Imul_Crypt_scr_1_Crypt_Found
@@:
add [esp+3C],1
imul eax,[esp+3C],B05C6C43
cmp eax,ecx
jne @f
mov ebx,[esp+3C]
jmp Imul_Crypt_scr_1_Crypt_Found
@@:
add [esp+40],1
imul eax,[esp+40],B05C6C43
cmp eax,ecx
jne @f
mov ebx,[esp+40]
jmp Imul_Crypt_scr_1_Crypt_Found
@@:
add [esp+44],1
imul eax,[esp+44],B05C6C43
cmp eax,ecx
jne @f
mov ebx,[esp+44]
jmp Imul_Crypt_scr_1_Crypt_Found
@@:
add [esp+48],1
imul eax,[esp+48],B05C6C43
cmp eax,ecx
jne Imul_Crypt_scr_1_Act_Cycle
mov ebx,[esp+c]
jmp Imul_Crypt_scr_1_Crypt_Found


Imul_Crypt_scr_1_Crypt_Found://Imul_Crypt_scr_1_Crypt_Found
mov [Original_Value_Crypted],ebx
pop [esp]
pop [esp+4]
pop [esp+8]
pop [esp+C]
pop [esp+10]
pop [esp+14]
pop [esp+18]
pop [esp+1C]
pop [esp+20]
pop [esp+24]
pop [esp+28]
pop [esp+2C]
pop [esp+30]
pop [esp+34]
pop [esp+38]
pop [esp+3C]
pop [esp+40]
pop [esp+44]
pop [esp+48]
pop ecx
pop edx
pop ebx
pop eax
mov [Imul_Crypt_Checker],#0
cmp [ebx+00000480],000003E8
jmp BACKImul_Crypt_scr_1


/////////////////////////
"Tutorial-i386.exe"+24073:
jmp PLACEImul_Crypt_scr_1
nop
nop
nop
nop
nop
BACKImul_Crypt_scr_1:
[DISABLE]
dealloc(PLACEImul_Crypt_scr_1)
"Tutorial-i386.exe"+24073:
cmp [ebx+00000480],000003E8

 

 

Изменено пользователем Antonshka

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
7 минут назад, Antonshka сказал:

У меня

@Antonshka, ты и в первом своем скрипте и  в этих выкидываешь значения.

Я имею ввиду, что inc ebx ( в других скриптах add..................) стоят не там:

Podbor:
 // inc ebx               // его нужно ставить не здесь
  imul eax,ebx,B05C6C43
  cmp eax,ecx
  je @f
  inc ebx                 // а вот здесь
  jmp Podbor

  

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Можно сделать 2 скрипта, для быстрого и для точного сканирования.

 

В первом пожертвовав точностью увеличиться скорость, достаточно сделать итератор i+=4/i+=8, скорость увеличиться в 2-4 раза.

Ну, а второй точный, это то, что сейчас у тебя есть.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Только что, partoftheworlD сказал:

Можно сделать 2 скрипта

А лучше найти игровое шифрование, не думаю что разрабы так же методом перебора делают.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Только что, Garik66 сказал:

А лучше найти игровое шифрование, не думаю что разрабы так же методом перебора делают.

 

У них может быть свой инструмент с определенной формулой, который при сброке самостоятельно константы шифрует.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
2 минуты назад, Garik66 сказал:

@Antonshka, ты и в первом своем скрипте и  в этих выкидываешь значения.

Имеешь в виду то, что пропускается поиск для изначальных значений?

Например для 0 когда оно сразу увеличивается на 1, или для 7FFFFFFF когда оно сразу уменьшается на 1 и проверяется уже уменьшенное число?

Если ты об этом, то верно подмечено!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
16 минут назад, Antonshka сказал:

Не помогло даже это

ЗЫ:

я думаю из-за того что юзаешь стек, т.е. несмотря что разделил поиск теряешь на обращении к нему. 

Только что, Antonshka сказал:

Если ты об этом

да

4 минуты назад, partoftheworlD сказал:

У них может быть свой инструмент с определенной формулой, который при сброке самостоятельно константы шифрует.

Эт понятно, но для конкретного случая (для игры) самый быстрый по скорости конечно будет найти способ шифрования. И на самом деле очень интересно как они это сделали.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
15 минут назад, Garik66 сказал:

ЗЫ:

я думаю из-за того что юзаешь стек, т.е. несмотря что разделил поиск теряешь на обращении к нему. 

да

После многих опытов у меня сложилось впечатление - множество операций всему виной. Переместить, сложить, увеличить, сравнить - вот на что уходит время. Но так ли это на самом деле, об этом точно скажут специалисты.

Изменено пользователем Antonshka

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Проверил, скрипт 1 быстрее скрипта 2, в 4-5 раза.

 

Скрипт 1

Спойлер

  push eax
  push ebx
  push ecx
  push edx
  mov ecx,[Value]

Podbor:
  inc ebx
  imul eax,ebx,B05C6C43
  cmp eax,ecx
  je @f
  jmp Podbor

@@:
  mov [adres],ebx
  mov [Value_EAX],eax
  pop edx
  pop ecx
  pop ebx
  pop eax

 

 

Скрипт 2

Спойлер

  push eax
  push ebx
  push ecx
  push edx
  mov ecx,[Value]
  push 0

Podbor:
  inc [esp]
  imul eax,[esp],B05C6C43
  cmp eax,ecx
  je @f
  jmp Podbor

@@:
  mov ebx,[esp]
  mov [adres],ebx
  mov [Value_EAX],eax
  pop [esp]
  pop edx
  pop ecx
  pop ebx
  pop eax

 

 

Изменено пользователем Antonshka

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
14 минут назад, Antonshka сказал:

inc ebx

 

14 минут назад, Antonshka сказал:

inc [esp]

:D так и не переместил

@Antonshka, на LUA напиши (благо ты его хорошо знаешь) и интервал таймера самый быстрый сделай.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
12 минут назад, Garik66 сказал:

:D так и не переместил

@Antonshka, на LUA напиши (благо ты его хорошо знаешь) и интервал таймера самый быстрый сделай.

Забыл переместить.

То зацикливание которое мы делали в АА скрипте - работает на частоте процессора, с такой же частотой будет работать "while do" в луа скрипте. Такое предположение.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
2 минуты назад, Antonshka сказал:

работает на частоте процессора

Точно(я сначала подумал что с частотой инструкции, на которой мы делали инъекцию) - не подумал.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Предложу вот такой вариант, если кто-то сможет попробовать, то отпишитесь, что там по скорости.

 

 

 

Tutorial-i386.CT

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
8 минут назад, partoftheworlD сказал:

Предложу вот такой вариант, если кто-то сможет попробовать, то отпишитесь, что там по скорости.

Tutorial-i386.CT

(Float)555 - около секунды.

В скрипте необычный порядок высвобождения стека, опечатка?

Спойлер

  push esi
  push edi
  push ebx
  push ecx
  push edx

  mov esi, [tmp]
  mov edi, [constant]
  mov ebx, [value]

  mov ecx, esi
  imul ecx, edi
  lea  eax, [edi+ecx]
  cmp  ecx, ebx
  je Done
  lea edx, [esi+1]
Loop:
  mov ecx, eax
  mov esi, edx
  lea edx, [edx+1]
  add eax, edi
  cmp ebx, ecx
  jne Loop
  mov [tmp], ecx

Done:
  mov [result],esi
  pop esi
  pop edi
  pop ebx
  pop ecx
  pop edx

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
6 минут назад, Antonshka сказал:

В скрипте необычный порядок высвобождения стека, опечатка?

Не, просто копипаста😄

 

tmp == 0x10000000, потому что значения никогда не бывают меньше, так что смысла от 0 до  0x10000000 перебирать нет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

×

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.