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

Быстрый сканер сигнатур на C++/asm

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

Перед началом сканирование - генерируется asm инструкции из полученных сигнатур.

download fast scanner v2.zip

  • Понравилось 1
  • Плюс 1

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


Ссылка на сообщение
Поделиться на другие сайты
В 17.05.2019 в 22:30, Hack сказал:

Перед началом сканирование - генерируется asm инструкции

А зачем? х64 и х86 отличать умеет? Гарантия нахождения нужного кода стопроцентная?

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


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

А зачем? х64 и х86 отличать умеет? Гарантия нахождения нужного кода стопроцентная?

Что зачем? Нет,  100%

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


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

Зачем нужна генерация асм инструкций в сканере сигнатур? Допустим, если сигнатура с маской, то как в этом случае будут генериться инструкции?

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


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

Зачем нужна генерация асм инструкций в сканере сигнатур? Допустим, если сигнатура с маской, то как в этом случае будут генериться инструкции?

Представление что  генерируется.

Сигнатура "11 22 33"


ret:
xor eax,eax
ret 4

next:
inc ecx

start:
cmp ecx,edx ;Если дошли до конца выходим
je  ret

cmp byte ptr [ecx],11
jne next
cmp byte ptr [ecx+01],22
jne next
cmp byte ptr [ecx+02],33
jne next
mov eax,ecx ;Адрес найден
ret 4

Так же прекрасно работает с маской.

 

Но стоит asm улучшенный по скорости.

Спойлер

003B0000 - mov eax,[esp+04]
003B0004 - jmp 003B000C
003B0006 - xor eax,eax
003B0008 - ret 0004 { 4 }
003B000B - inc ecx
003B000C - cmp ecx,edx
003B000E - ja 003B0006
003B0010 - cmp ecx,eax
003B0012 - ja 003B00BE
003B0018 - cmp byte ptr [ecx],11 { 17 }
003B001B - je 003B00C7
003B0021 - cmp byte ptr [ecx+01],11 { 17 }
003B0025 - je 003B007A
003B0027 - cmp byte ptr [ecx+02],11 { 17 }
003B002B - je 003B007D
003B002D - cmp byte ptr [ecx+03],11 { 17 }
003B0031 - je 003B0082
003B0033 - cmp byte ptr [ecx+04],11 { 17 }
003B0037 - je 003B0087
003B0039 - cmp byte ptr [ecx+05],11 { 17 }
003B003D - je 003B008C
003B003F - cmp byte ptr [ecx+06],11 { 17 }
003B0043 - je 003B0091
003B0045 - cmp byte ptr [ecx+07],11 { 17 }
003B0049 - je 003B0096
003B004B - cmp byte ptr [ecx+08],11 { 17 }
003B004F - je 003B009B
003B0051 - cmp byte ptr [ecx+09],11 { 17 }
003B0055 - je 003B00A0
003B0057 - cmp byte ptr [ecx+0A],11 { 17 }
003B005B - je 003B00A5
003B005D - cmp byte ptr [ecx+0B],11 { 17 }
003B0061 - je 003B00AA
003B0063 - cmp byte ptr [ecx+0C],11 { 17 }
003B0067 - je 003B00AF
003B0069 - cmp byte ptr [ecx+0D],11 { 17 }
003B006D - je 003B00B4
003B006F - cmp byte ptr [ecx+0E],11 { 17 }
003B0073 - je 003B00B9
003B0075 - add ecx,0F { 15 }
003B0078 - jmp 003B000C
003B007A - inc ecx
003B007B - jmp 003B00C7
003B007D - add ecx,02 { 2 }
003B0080 - jmp 003B00C7
003B0082 - add ecx,03 { 3 }
003B0085 - jmp 003B00C7
003B0087 - add ecx,04 { 4 }
003B008A - jmp 003B00C7
003B008C - add ecx,05 { 5 }
003B008F - jmp 003B00C7
003B0091 - add ecx,06 { 6 }
003B0094 - jmp 003B00C7
003B0096 - add ecx,07 { 7 }
003B0099 - jmp 003B00C7
003B009B - add ecx,08 { 8 }
003B009E - jmp 003B00C7
003B00A0 - add ecx,09 { 9 }
003B00A3 - jmp 003B00C7
003B00A5 - add ecx,0A { 10 }
003B00A8 - jmp 003B00C7
003B00AA - add ecx,0B { 11 }
003B00AD - jmp 003B00C7
003B00AF - add ecx,0C { 12 }
003B00B2 - jmp 003B00C7
003B00B4 - add ecx,0D { 13 }
003B00B7 - jmp 003B00C7
003B00B9 - add ecx,0E { 14 }
003B00BC - jmp 003B00C7
003B00BE - cmp byte ptr [ecx],11 { 17 }
003B00C1 - jne 003B000B
003B00C7 - cmp byte ptr [ecx+01],22 { 34 }
003B00CB - jne 003B000B
003B00D1 - cmp byte ptr [ecx+02],33 { 51 }
003B00D5 - jne 003B000B
003B00DB - cmp byte ptr [ecx+03],44 { 68 }
003B00DF - jne 003B000B
003B00E5 - cmp byte ptr [ecx+04],55 { 85 }
003B00E9 - jne 003B000B
003B00EF - cmp byte ptr [ecx+05],66 { 102 }
003B00F3 - jne 003B000B
003B00F9 - cmp byte ptr [ecx+06],77 { 119 }
003B00FD - jne 003B000B
003B0103 - cmp byte ptr [ecx+07],-78 { 136 }
003B0107 - jne 003B000B
003B010D - cmp byte ptr [ecx+08],-67 { 153 }
003B0111 - jne 003B000B
003B0117 - cmp byte ptr [ecx+09],-56 { 170 }
003B011B - jne 003B000B
003B0121 - cmp byte ptr [ecx+0A],-45 { 187 }
003B0125 - jne 003B000B
003B012B - cmp byte ptr [ecx+0B],-34 { 204 }
003B012F - jne 003B000B
003B0135 - cmp byte ptr [ecx+0C],-23 { 221 }
003B0139 - jne 003B000B
003B013F - cmp byte ptr [ecx+0D],-12 { 238 }
003B0143 - jne 003B000B
003B0149 - cmp byte ptr [ecx+0E],-01 { 255 }
003B014D - jne 003B000B
003B0153 - mov eax,ecx
003B0155 - ret 0004 { 4 }

 

Есть способ проще и быстрее?

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

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


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

"Быстрый" относительно чего? Хотелось бы увидеть результаты в сравнении с другими сканерами.

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


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

"Быстрый" относительно чего? Хотелось бы увидеть результаты в сравнении с другими сканерами.

Ну CE просканирует за 4 секунды. а этот сканер за 600мс

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


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

а этот сканер за 600мс

Очень долго, у меня без оптимизаций 100-140 мс(среднее 125), с AVX2 - 40-55 мс. На примере Sniper Elite 4 пробовал.

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


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

 Очень долго, у меня без оптимизаций 100-140 мс(среднее 125), с AVX2 - 40-55 мс. На примере Sniper Elite 4 пробовал.

Какие инструкции используются  в AVX2?

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


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

Какие инструкции используются  в AVX2?

https://software.intel.com/sites/default/files/m/d/4/1/d/8/Intro_to_Intel_AVX.pdf

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


Ссылка на сообщение
Поделиться на другие сайты
В 19.05.2019 в 13:08, Hack сказал:

Есть способ проще и быстрее? 

Спойлер

 


mov rax,[.exeBase]
mov ecx,[.exeSize]
add rcx,rax

.Scan:

cmp byte[rax+0],0x31
jnz @f
cmp byte[rax+1],0x31
jnz @f
cmp byte[rax+2],0x31
jnz @f
cmp byte[rax+3],0x31
jnz @f
cmp byte[rax+5],0x31
jnz @f
mov [OptionA],rax
@@:

cmp byte[rax+0],0x32
jnz @f
cmp byte[rax+1],0x32
jnz @f
cmp byte[rax+2],0x32
jnz @f
cmp byte[rax+3],0x32
jnz @f
cmp byte[rax+7],0x32
jnz @f
mov [OptionB],rax
@@:

inc rax
cmp rax,rcx
jnz .Scan

 

только если все сразу. а так обычно спец функция на 0x31 ?? 0x31 0x31 ?? 0x31

 

В 19.05.2019 в 19:50, partoftheworlD сказал:

, с AVX2 - 40-55 мс

1 байт срав. на авх? Lol

 

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


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

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

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

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

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

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

Войти

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

Войти

×

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

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