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

Как правильно использовать инструкцию repe movsb для 64-битных игр.


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

gmz, вопрос скорее всего снова к тебе (жду помощи, сам не справился).

 

Попытался написать скрипт обхода защиты игры по методу Xipho

Скрытый текст

 

 

, более подробно здесь и здесь, но пока не получилось, так как repe movsb для 64-битных игр. работает не корректно и копия exe файла создаётся не пойми как и не пойми где. 

 

Жду помощи - от знающих.

 

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

Тебе нужна MOVSQ, чтобы перемещать сразу по QWORD (RSI->RDI). MOVSB оперирует байтами. Или я чего-то не понимаю и тогда мне нужно побольше описания и кода.

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

51 минуту назад, keng сказал:

Тебе нужна MOVSQ, чтобы перемещать сразу по QWORD (RSI->RDI). MOVSB оперирует байтами. Или я чего-то не понимаю и тогда мне нужно побольше описания и кода.

Я думаю без разницы каким количеством байт перекидывать, подойдёт любой опкод MOVSB, MOVSW, MOVSD или MOVSQ - они только на скорость передачи влияют,

Проблема именно в чтении адресов в этих  инструкциях:

lea rsi,[TheCrew.exe+1000]
lea rdi,[MemoryCopy]
mov rcx,47A2090
repe movsb

Т.е. для 32-битной игрушки я код написал и он чётко работает.

А в 64-ьитной что-то не то происходит, для проверки написал что-то подобное для  CE-ного 64-битного Туториала, но копию exe файла, так и не нашёл ни где она ни какая она получилась.

 

ЗЫ: Хотя я не пробовал, нужно будет попробовать на выходных.

keng спасибо за идею заранее, может получится.:D

 

Ну на крайняк сделаю копирование с помощью цикла, конечно будет гораздо медленнее, но вернее. :)

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

Мне кажется либо память не выделяется для записи, либо ты пытаешься читать невалидный адрес(с таким кол-вом итераций это вполне вероятно)

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

Хм. То ли я не очень умный, то ли darkbyte слишком ленивый, но СЕ не знает опкода "rep movsq", который копирует qword'ы. Это печально, потому что побайтно копировать - очень долго.

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

Скрытый текст

известный размер:
mov rsi,[from]
mov rdi,[to]
mov ecx,12 / 8
rep movsq
mov ecx,12 & 7
rep movsb
или
mov rsi,[from]
mov rdi,[to]
mov ecx,12 / 4
rep movsd
mov ecx,12 & 3
rep movsb

неизвестный размер:
mov rsi,[from]
mov rdi,[to]
mov ecx,12
mov edx,ecx
shr ecx,3
and edx,7
rep movsq
mov ecx,edx
rep movsb
или
mov rsi,[from]
mov rdi,[to]
mov ecx,12
mov edx,ecx
shr ecx,2
and edx,3
rep movsd
mov ecx,edx
rep movsb

 

дальше... [TheCrew.exe+1000] (который для пропуска хидера) надо нормально прочитать для универсальности.. r12 - база модуля

mov eax,[r12+0x3C] ;e_lfanew
mov ecx,[r12+rax+0x50] ;SizeOfImage
mov edx,[r12+rax+0x54] ;SizeOfHeaders

наверно на СЕ будет так:

mov eax,[TheCrew.exe+0x3C] ;e_lfanew
mov ecx,[TheCrew.exe+rax+0x50] ;SizeOfImage
mov edx,[TheCrew.exe+rax+0x54] ;SizeOfHeaders

 

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

Всем спасибо за отклики. :)

В 18.09.2016в22:07, keng сказал:

У меня вполне корректно работает вот такая версия.

keng, ты переоцениваешь мой уровень - я даже не знаю -  какой прогой открывается расширение .CEA  (или в какой среде это делается). так что не посмотрел, что там написано.

В 18.09.2016в23:08, gmz сказал:

известный размер:

gmz, тоже самое - мой уровень - НОВИЧОК. 

Так что несколько вопросов для уточнения:

1. У меня же вроде известный размер - это размер exe -ника. Правильно?

2. Что это за инструкции 

mov ecx,12 / 4 // Что делает эта инструкция? И как её в СЕ записать?
mov ecx,12 & 3 // Что делает эта инструкция? И как её в СЕ записать?
// Также вопрос - они обе нужны при копировании?

3. 

 

В 18.09.2016в23:08, gmz сказал:

[TheCrew.exe+1000] (который для пропуска хидера)

Обязательно ли пропускать этот хидер или можно тупо копировать весь exe файл, т.е. с самого начала, ну что типа того:

Скрытый текст

push rcx
push rsi
push rdi
lea rsi,[TheCrew.exe]
lea rdi,[MemoryCopy]
xor rcx,rcx
mov ecx,47A2090
repe movsb
pop rdi
pop rsi
pop rcx

 

 

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

CEA - это CE Auto Assembler script:

"Memory View" -> "Auto Assemble" -> "File"-> "Open"

 

Spoiler

newmem:
cmp [memcopy],0
jne skip
push rcx
push rsi
push rdi

lea rsi,[Tutorial-x86_64.exe+1000]
lea rdi,[memcopy]
mov rcx,3E8
rep movsb

pop rdi
pop rsi
pop rcx

skip:
cmp [rbx+00000790],000003E8
jmp returnhere

memcopy:
dd 0

 

 

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

26 минуты назад, keng сказал:

CEA - это CE Auto Assembler script:

"Memory View" -> "Auto Assemble" -> "File"-> "Open"

Сенк.

Прикольно, что я тоже именно на этой инструкции Туториала пытаюсь сделать скрипт.

Проверил твой скрипт, действительно в 

memcopy

копия 1000 байт создалась, у меня скрипт почти такой же, но я пытался весь exe файл сохранить, плюс восстановить  10 байт, которые изменяются при активации скрипта (ну т.е. сам прыжок + 5 нопов). И у себя я не нашёл, где копия и где в ней место инъекции, хотел посмотреть как это:

jmp newmem
nop
nop
nop
nop
nop

замениться обратно на это:

cmp [rbx+00000790],000003E8

 

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

Аэ. Я так понимаю, что прыжок + нопы изменятся обратно при выключении скрипта, т.е. при активации секции "[DISABLE]". Во-вторых, давай еще раз. Есть кусок игрового кода, который читает определенные участки кода игры и делает с ними что-то волшебное, что нам не очень интересно. При этом, если мы изменяем участки, с которыми происходит волшебство, то игре это не нравится и она быстро заканчивается. Как с этим бороться:

 

При активации скрипта какая-то инструкция у нас изменится - это важно!

 

0. Выделяем в памяти игры место под весь EXE-файл игры

1. Копируем туда содержимое EXE-файла (текущего, с измененной инструкцией)

2. Находим в сохраненной копии место, которое мы своим скриптом изменили

3. Меняем измененное место на оригинальную инструкцию, как будто там нет никакого перехода

4. Внедряемся в код, который проверяет код игры на изменения

5. Каждый раз вычисляем смещение от оригинального кода игры до инструкции, которую игра хочет проверить, плюс размер

6. Подставляем вместо нужного игре адреса тот, что мы сохранили в п. 0-3

7. Теперь игра ничего не понимает, т.к. ей всегда возвращается "оригинальный" код

8. Спокойно меняем все, что угодно

 

Что из этого у тебя не вышло?

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

Собственно вот мой скрипт, который я написал, ещё перед созданием темы:

Скрытый текст

{ Game   : Tutorial-x86_64.exe
  Version: 
  Date   : 2016-09-17
  Author : Garik66

  This script does blah blah blah
}

[ENABLE]
aobscanmodule(INJECT,Tutorial-x86_64.exe,81 BB 90 07 00 00 E8 03 00 00) // should be unique
alloc(newmem,$1000,"Tutorial-x86_64.exe"+2AA99)
alloc(CopyExeFail,3147032)
//label(AlreadyCopy)
label(code)
label(return)
registersymbol(INJECT)

newmem:
  cmp [CopyExeFail],0                 // Проверяем, есть ли уже копия
  jne code//AlreadyCopy

// Блок копирования
  push rdx
  push rsi
  push rdi
  push rcx
  lea rsi,[Tutorial-x86_64.exe+1000] // Адрес exe файла +1000
  lea rdi,[CopyExeFail]              // Адрес нашей копии ехе файла
  mov rcx,300518                     // Размер ехе файла в hex`е
  repe movsb


// Блок восстановления копии до оригинала ехе файла.
  mov rdx,INJECT
  sub rdx,Tutorial-x86_64.exe+1000
  lea rdi,[CopyExeFail]
  mov [rdi+rdx],0790bb81
  mov [rdi+rdx+4],03e80000
  mov [rdi+rdx+8],38750000
  pop rcx
  pop rdi
  pop rsi
  pop rdx

/*AlreadyCopy:
// Блок проверки -находится ли наш адрес внутри скопированного блока памяти
  cmp rdx,Tutorial-x86_64.exe
  jb code
  cmp rdx,Tutorial-x86_64.exe+300518
  ja code

// Блок подмены адреса игры для инструкции проверки на адрес копии exe файла.
  sub rdx,Tutorial-x86_64.exe
  add rdx,CopyExeFail*/

code:
  cmp [rbx+00000790],000003E8
  jmp return

CopyExeFail:
  dq (double)0

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

[DISABLE]
INJECT:
  db 81 BB 90 07 00 00 E8 03 00 00

unregistersymbol(INJECT)
dealloc(CopyExeFail)
dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: "Tutorial-x86_64.exe"+2AA99

"Tutorial-x86_64.exe"+2AA83: C3                             -  ret 
"Tutorial-x86_64.exe"+2AA84: 00 00                          -  add [rax],al
"Tutorial-x86_64.exe"+2AA86: 00 00                          -  add [rax],al
"Tutorial-x86_64.exe"+2AA88: 00 00                          -  add [rax],al
"Tutorial-x86_64.exe"+2AA8A: 00 00                          -  add [rax],al
"Tutorial-x86_64.exe"+2AA8C: 00 00                          -  add [rax],al
"Tutorial-x86_64.exe"+2AA8E: 00 00                          -  add [rax],al
"Tutorial-x86_64.exe"+2AA90: 53                             -  push rbx
"Tutorial-x86_64.exe"+2AA91: 48 8D 64 24 E0                 -  lea rsp,[rsp-20]
"Tutorial-x86_64.exe"+2AA96: 48 89 CB                       -  mov rbx,rcx
// ---------- INJECTING HERE ----------
"Tutorial-x86_64.exe"+2AA99: 81 BB 90 07 00 00 E8 03 00 00  -  cmp [rbx+00000790],000003E8
// ---------- DONE INJECTING  ----------
"Tutorial-x86_64.exe"+2AAA3: 75 38                          -  jne Tutorial-x86_64.exe+2AADD
"Tutorial-x86_64.exe"+2AAA5: 48 8B 8B 60 07 00 00           -  mov rcx,[rbx+00000760]
"Tutorial-x86_64.exe"+2AAAC: BA 01 00 00 00                 -  mov edx,00000001
"Tutorial-x86_64.exe"+2AAB1: 48 8B 83 60 07 00 00           -  mov rax,[rbx+00000760]
"Tutorial-x86_64.exe"+2AAB8: 48 8B 00                       -  mov rax,[rax]
"Tutorial-x86_64.exe"+2AABB: FF 90 40 04 00 00              -  call qword ptr [rax+00000440]
"Tutorial-x86_64.exe"+2AAC1: 48 8B 8B 80 07 00 00           -  mov rcx,[rbx+00000780]
"Tutorial-x86_64.exe"+2AAC8: BA 00 00 00 00                 -  mov edx,00000000
"Tutorial-x86_64.exe"+2AACD: 48 8B 83 80 07 00 00           -  mov rax,[rbx+00000780]
"Tutorial-x86_64.exe"+2AAD4: 48 8B 00                       -  mov rax,[rax]
}

 

 Проблема, что вот эта строчка:

sub rdx,Tutorial-x86_64.exe+1000

Выглядит в отладчике при активации скрипта так:

sub rdx,0000000000001000

т.е. отнимается уже не правильный адрес почему то. 

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

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

Tutorial-x86_64.exe+1000

и другим способом:

Так:

  mov rdx,INJECT
  sub rsi,300518 
  sub rdx,rsi           // в этом примере в rsi лежит Tutorial-x86_64.exe+1000
  lea rdi,[CopyExeFail]

 

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

keng, всё сработало, после того как записал таким образом. Уррряяя!!!!;)

Потом запишу видео. 

И копия и восстановления копии до оригинала exe файла происходит.

 

ЗЫ: Вот теперь можно уже переходить к обходу защиты в самой игре.

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

1 час назад, Garik66 сказал:

1. У меня же вроде известный размер - это размер exe -ника. Правильно?

обновят игру - облом. потому надо читать из хидера.

+ у тебя и так неправильный размер :D

 

1 час назад, Garik66 сказал:

2. Что это за инструкции 

просто в калькуляторе деление и and...
mov ecx,12 / 4 - получаем количество dword для movsd
mov ecx,12 & 3 - получаем остаток для movsb

 

1 час назад, Garik66 сказал:

Обязательно ли пропускать этот хидер или можно тупо копировать весь exe файл, т.е. с самого начала, ну что типа того:

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

 

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

1 минуту назад, gmz сказал:

обновят игру

СЕНКУ БОЛЬШОЙ!!! :)

За неизвестный размер тогда тем более большое спасибо в будущем, если будем обходить новую игру очень поможет.

2 минуты назад, gmz сказал:

mov ecx,12 / 4 - получаем количество dword для movsd
mov ecx,12 & 3 - получаем остаток для movsb

За эту инфу тоже МАГЛОБ!!!:) теперь будем и по 1 и по два и по 4 и по 8 байт копировать для скорости.  

 

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

7 минут назад, gmz сказал:

+ у тебя и так неправильный размер :D

Если ты про этот размер:

В 18.09.2016в20:58, Garik66 сказал:

mov rcx,47A2090

то это не мой, а пользователя из темы, которую я давал выше, я просто для примера взял кусочек его скрипта, а ту игру я даже и не качал. 

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

  • 3 недели спустя...
×
×
  • Создать...

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

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