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

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


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

В 17.05.2019 в 22:30, Hack сказал:

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

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

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

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?

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

В 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

 

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

  • 1 месяц спустя...
В 19.05.2019 в 19:50, partoftheworlD сказал:

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

Ну, а у вас пк одинаковый с автором ?

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

  • 4 месяца спустя...
×
×
  • Создать...

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

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