Garik66 Опубликовано 18 сентября, 2016 Поделиться Опубликовано 18 сентября, 2016 gmz, вопрос скорее всего снова к тебе (жду помощи, сам не справился). Попытался написать скрипт обхода защиты игры по методу Xipho Скрытый текст , более подробно здесь и здесь, но пока не получилось, так как repe movsb для 64-битных игр. работает не корректно и копия exe файла создаётся не пойми как и не пойми где. Жду помощи - от знающих. Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 18 сентября, 2016 Поделиться Опубликовано 18 сентября, 2016 Тебе нужна MOVSQ, чтобы перемещать сразу по QWORD (RSI->RDI). MOVSB оперирует байтами. Или я чего-то не понимаю и тогда мне нужно побольше описания и кода. 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 18 сентября, 2016 Автор Поделиться Опубликовано 18 сентября, 2016 (изменено) 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 спасибо за идею заранее, может получится. Ну на крайняк сделаю копирование с помощью цикла, конечно будет гораздо медленнее, но вернее. Изменено 18 сентября, 2016 пользователем Garik66 Ссылка на комментарий Поделиться на другие сайты Поделиться
Dino Опубликовано 18 сентября, 2016 Поделиться Опубликовано 18 сентября, 2016 Мне кажется либо память не выделяется для записи, либо ты пытаешься читать невалидный адрес(с таким кол-вом итераций это вполне вероятно) 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 18 сентября, 2016 Поделиться Опубликовано 18 сентября, 2016 У меня вполне корректно работает вот такая версия. Проверял на CE 6.5.1 и x64-туториале. memcopy.zip 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 18 сентября, 2016 Поделиться Опубликовано 18 сентября, 2016 Хм. То ли я не очень умный, то ли darkbyte слишком ленивый, но СЕ не знает опкода "rep movsq", который копирует qword'ы. Это печально, потому что побайтно копировать - очень долго. Ссылка на комментарий Поделиться на другие сайты Поделиться
gmz Опубликовано 18 сентября, 2016 Поделиться Опубликовано 18 сентября, 2016 Скрытый текст известный размер: 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 Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 20 сентября, 2016 Автор Поделиться Опубликовано 20 сентября, 2016 Всем спасибо за отклики. В 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 Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 20 сентября, 2016 Поделиться Опубликовано 20 сентября, 2016 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 Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 20 сентября, 2016 Автор Поделиться Опубликовано 20 сентября, 2016 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 Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 20 сентября, 2016 Поделиться Опубликовано 20 сентября, 2016 Аэ. Я так понимаю, что прыжок + нопы изменятся обратно при выключении скрипта, т.е. при активации секции "[DISABLE]". Во-вторых, давай еще раз. Есть кусок игрового кода, который читает определенные участки кода игры и делает с ними что-то волшебное, что нам не очень интересно. При этом, если мы изменяем участки, с которыми происходит волшебство, то игре это не нравится и она быстро заканчивается. Как с этим бороться: При активации скрипта какая-то инструкция у нас изменится - это важно! 0. Выделяем в памяти игры место под весь EXE-файл игры 1. Копируем туда содержимое EXE-файла (текущего, с измененной инструкцией) 2. Находим в сохраненной копии место, которое мы своим скриптом изменили 3. Меняем измененное место на оригинальную инструкцию, как будто там нет никакого перехода 4. Внедряемся в код, который проверяет код игры на изменения 5. Каждый раз вычисляем смещение от оригинального кода игры до инструкции, которую игра хочет проверить, плюс размер 6. Подставляем вместо нужного игре адреса тот, что мы сохранили в п. 0-3 7. Теперь игра ничего не понимает, т.к. ей всегда возвращается "оригинальный" код 8. Спокойно меняем все, что угодно Что из этого у тебя не вышло? Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 20 сентября, 2016 Автор Поделиться Опубликовано 20 сентября, 2016 Собственно вот мой скрипт, который я написал, ещё перед созданием темы: Скрытый текст { 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 т.е. отнимается уже не правильный адрес почему то. Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 20 сентября, 2016 Автор Поделиться Опубликовано 20 сентября, 2016 Можно конечно получить адрес Tutorial-x86_64.exe+1000 и другим способом: Так: mov rdx,INJECT sub rsi,300518 sub rdx,rsi // в этом примере в rsi лежит Tutorial-x86_64.exe+1000 lea rdi,[CopyExeFail] Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 20 сентября, 2016 Автор Поделиться Опубликовано 20 сентября, 2016 (изменено) keng, всё сработало, после того как записал таким образом. Уррряяя!!!! Потом запишу видео. И копия и восстановления копии до оригинала exe файла происходит. ЗЫ: Вот теперь можно уже переходить к обходу защиты в самой игре. Изменено 20 сентября, 2016 пользователем Garik66 Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 20 сентября, 2016 Автор Поделиться Опубликовано 20 сентября, 2016 Вот оригинал: А вот копия, после восстановления кода: Ссылка на комментарий Поделиться на другие сайты Поделиться
gmz Опубликовано 20 сентября, 2016 Поделиться Опубликовано 20 сентября, 2016 1 час назад, Garik66 сказал: 1. У меня же вроде известный размер - это размер exe -ника. Правильно? обновят игру - облом. потому надо читать из хидера. + у тебя и так неправильный размер 1 час назад, Garik66 сказал: 2. Что это за инструкции просто в калькуляторе деление и and... mov ecx,12 / 4 - получаем количество dword для movsd mov ecx,12 & 3 - получаем остаток для movsb 1 час назад, Garik66 сказал: Обязательно ли пропускать этот хидер или можно тупо копировать весь exe файл, т.е. с самого начала, ну что типа того: само собой копируй весь а когда подменяешь адрес, веротно тебе будет нужен правильный размер для его пропуска.. 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 20 сентября, 2016 Автор Поделиться Опубликовано 20 сентября, 2016 1 минуту назад, gmz сказал: обновят игру СЕНКУ БОЛЬШОЙ!!! За неизвестный размер тогда тем более большое спасибо в будущем, если будем обходить новую игру очень поможет. 2 минуты назад, gmz сказал: mov ecx,12 / 4 - получаем количество dword для movsd mov ecx,12 & 3 - получаем остаток для movsb За эту инфу тоже МАГЛОБ!!! теперь будем и по 1 и по два и по 4 и по 8 байт копировать для скорости. Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 20 сентября, 2016 Автор Поделиться Опубликовано 20 сентября, 2016 7 минут назад, gmz сказал: + у тебя и так неправильный размер Если ты про этот размер: В 18.09.2016в20:58, Garik66 сказал: mov rcx,47A2090 то это не мой, а пользователя из темы, которую я давал выше, я просто для примера взял кусочек его скрипта, а ту игру я даже и не качал. Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 5 октября, 2016 Автор Поделиться Опубликовано 5 октября, 2016 Здесь дописал скрипт обхода защиты для игры. Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения