Antonshka Опубликовано 24 ноября, 2019 Поделиться Опубликовано 24 ноября, 2019 Привет всем. Я к вам с интересной задачей. Раньше с таким не сталкивался. В одной игре характеристики машины находятся в одном блоке памяти. Этот блок памяти контролируется только одной инструкцией Repe movsb, она и читает, она и записывает. Мне нужно взять под контроль всего лишь несколько разных адресов этого копируемого блока. Как мне быть? У меня есть одна идея, но я не знаю насколько она хороша, я её еще даже и не опробовал. Может ваши будут лучше, и я их применю. Или вы мою улучшите. Моя идея такая, может быть 1 - заменить значение RCX перед копированием на такое, чтобы скопировался блок только до нужного мне адреса, 2 - сделать какие-нибудь манипуляции со значением нужного мне адреса, ради чего собственно это всё 3 - к RSI и RDI прибавить размер уже скопированного блока и прибавить размер нужного мне адреса (4 байта например) 4 - записать в RCX размер оставшегося и еще не скопированного блока минус размер нужного адреса 5 - снова вызвать копирование. И так для всех нужных мне адресов. Причем расположив все процедуры копирования остатков блоков в порядке нужных мне адресов. Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 24 ноября, 2019 Поделиться Опубликовано 24 ноября, 2019 57 минут назад, Antonshka сказал: Как мне быть? Я бы попробовал не посредственно, после объявления rcx, rdi и rsi, и началом цикла писать в нужный тебе адрес Repe movsb копирует (если мне не изменяет память) из адреса rdi в rsi по-байтно. тогда так: mov byte ptr [rdi+5],#66 -записать в шестой байт блока 66, ну и т.д. Сам я не пробовал. Ссылка на комментарий Поделиться на другие сайты Поделиться
Antonshka Опубликовано 24 ноября, 2019 Автор Поделиться Опубликовано 24 ноября, 2019 5 минут назад, Garik66 сказал: Я бы попробовал не посредственно, после объявления rcx, rdi и rsi, и началом цикла писать в нужный тебе адрес Repe movsb копирует (если мне не изменяет память) из адреса rdi в rsi по-байтно. тогда так: mov byte ptr [esi+5],#66 -записать в шестой байт блока 66, ну и т.д. Сам я не пробовал. Да, отличная идея. В этой игре, когда Repe movsb пишет в нужные мне адреса, тогда RSI это источник, а RDI приемник. Когда эта инструкция читает из нужных мне адресов. тогда RSI это бывший RDI, а RDI уже новый приемник (не бывший RSI). Можно, как ты говоришь, перед тем как эта инструкция начнет считывание блока, записать потоком в котором находится инструкция Repe movsb в нужные мне адреса нужные мне значения. Все равно ведь их ничто не изменить, до тех пор пока эта же инструкция не станет записывающей. Но я сейчас подумал, оказалось что мне немного не выгодно использовать инструкцию Repe movsb для манипуляций над значениями нужных мне адресов. Все дело в том, что мод который я делаю должен сохранять на диск значения в этих некоторых адресах. А затем, по надобности, этот же мод должен записывать обратно полученное ранее. А так как инструкция Repe movsb может работать в разное время с разной скоростью, то может получиться некоторая ассинхронизация, эффект мода будет как бы уже не тот. Я хочу использовать для записи значений в эти некоторые адреса собственный поток. И вот задача теперь такая, в то время когда мой собственный поток пишет данные в адреса, инструкция Repe movsb должна пропускать запись только в эти некоторые адреса. Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 24 ноября, 2019 Поделиться Опубликовано 24 ноября, 2019 1 минуту назад, Antonshka сказал: огда RSI это источник значит плохая у меня память, тогда так: mov byte ptr [rsi+5],#66 Ссылка на комментарий Поделиться на другие сайты Поделиться
Antonshka Опубликовано 24 ноября, 2019 Автор Поделиться Опубликовано 24 ноября, 2019 (изменено) 6 минут назад, Garik66 сказал: значит плохая у меня память, тогда так: mov byte ptr [rsi+5],#66 В RSI как я понял всегда находится источник, откуда копируется. В RDI приемник, куда. Поэтому если писать этим же потоком в котором находится Repe movsb в нужные мне адрес, тогда правильно у тебя было в первом сообщении. mov byte ptr [rdi+5],#66. Но как я написал во втором сообщении, я теперь не могу использовать поток в котором находится Repe movsb. Я хочу создать свой собственный поток через CreateThread, он то и будет писать в нужные мне адреса. Просто в то время когда мой поток пишет, тогда Repe movsb должна пропускать эти некоторые адреса. Изменено 24 ноября, 2019 пользователем Antonshka Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 24 ноября, 2019 Поделиться Опубликовано 24 ноября, 2019 3 минуты назад, Antonshka сказал: И вот задача теперь такая, в то время когда мой собственный поток пишет данные в адреса, инструкция Repe movsb должна пропускать запись только в эти некоторые адреса. ты будешь записывать по Горячей клавише? или как ты это планируешь, Если по горячей клавише, то просто Флаг. Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 24 ноября, 2019 Поделиться Опубликовано 24 ноября, 2019 1 минуту назад, Antonshka сказал: В RSI как я понял всегда находится источник, откуда копируется. В RDI приемник, куда. Поэтому если писать этим же потоком в котором находится Repe movsb в нужные мне адрес, тогда правильно у тебя было в первом сообщении. mov byte ptr [rdi+5],#66. Не правильно, Значение в текущем адресе [rdi] будет перезаписываться циклом lea ........................... или как там у тебя (без кода сложно) Поэтому записывать только в источник, т.е. в [rsi] Ссылка на комментарий Поделиться на другие сайты Поделиться
Antonshka Опубликовано 24 ноября, 2019 Автор Поделиться Опубликовано 24 ноября, 2019 1 минуту назад, Garik66 сказал: Не правильно, Значение в текущем адресе [rdi] будет перезаписываться циклом lea ........................... или как там у тебя (без кода сложно) Поэтому записывать только в источник, т.е. в [rsi] Вот код, он и пишет и читает. Спойлер VCRUNTIME140.memcmp+E0 - 57 - push rdi VCRUNTIME140.memcmp+E1 - 56 - push rsi VCRUNTIME140.memcmp+E2 - 49 8B C3 - mov rax,r11 VCRUNTIME140.memcmp+E5 - 48 8B F9 - mov rdi,rcx VCRUNTIME140.memcmp+E8 - 49 8B C8 - mov rcx,r8 VCRUNTIME140.memcmp+EB - 49 8B F2 - mov rsi,r10 VCRUNTIME140.memcmp+EE - F3 A4 - repe movsb VCRUNTIME140.memcmp+F0 - 5E - pop rsi VCRUNTIME140.memcmp+F1 - 5F - pop rdi VCRUNTIME140.memcmp+F2 - C3 - ret Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 24 ноября, 2019 Поделиться Опубликовано 24 ноября, 2019 зы: в приемник можно записать после отработки цикла Repe movsb Ссылка на комментарий Поделиться на другие сайты Поделиться
Antonshka Опубликовано 24 ноября, 2019 Автор Поделиться Опубликовано 24 ноября, 2019 (изменено) 7 минут назад, Garik66 сказал: ты будешь записывать по Горячей клавише? или как ты это планируешь, Если по горячей клавише, то просто Флаг. Запись будет по флагу. Например флаг равен 1, идет запись ранее сохраненных значений в адреса. Запись продолжается до тех пор пока, либо флаг не станет равным 0, либо пока не настанет конец файла на диске. Изменено 24 ноября, 2019 пользователем Antonshka Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 24 ноября, 2019 Поделиться Опубликовано 24 ноября, 2019 Вот куда-то сюда м/у VCRUNTIME140.memcmp+EE - F3 A4 - repe movsb VCRUNTIME140.memcmp+F0 - 5E - pop rsi Ссылка на комментарий Поделиться на другие сайты Поделиться
Antonshka Опубликовано 24 ноября, 2019 Автор Поделиться Опубликовано 24 ноября, 2019 Только что, Garik66 сказал: Вот куда-то сюда м/у VCRUNTIME140.memcmp+EE - F3 A4 - repe movsb VCRUNTIME140.memcmp+F0 - 5E - pop rsi Верно, но я не могу использовать это место. Не могу использовать этот VCRUNTIME140 поток. Мне нужно только обезвредить, так сказать, этот Repe movsb, на время, пока я собственным потоком записываю данные в адреса. Мой собственный поток это не Repe movsb или подобное что-то. Мой собственный поток это будет просто обычная инструкция MOV и переменная счетчик. Ссылка на комментарий Поделиться на другие сайты Поделиться
Antonshka Опубликовано 24 ноября, 2019 Автор Поделиться Опубликовано 24 ноября, 2019 А идея отличная у тебя, если бы не ассинхронизация, я бы её и использовал. Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 24 ноября, 2019 Поделиться Опубликовано 24 ноября, 2019 1 минуту назад, Antonshka сказал: Мой собственный поток это будет просто обычная инструкция MOV и переменная счетчик. Это понятно. Выложи скрипт СЕ рядом с VCRUNTIME140.memcmp+EE - F3 A4 - repe movsb попробую свою мысль скриптом выразить. а то писать долго. Ссылка на комментарий Поделиться на другие сайты Поделиться
Antonshka Опубликовано 24 ноября, 2019 Автор Поделиться Опубликовано 24 ноября, 2019 1 минуту назад, Garik66 сказал: Это понятно. Выложи скрипт СЕ рядом с VCRUNTIME140.memcmp+EE - F3 A4 - repe movsb попробую свою мысль скриптом выразить. а то писать долго. Такой? Спойлер [ENABLE] alloc(newmem,2048,"VCRUNTIME140.dll"+122E) label(returnhere) newmem: repe movsb pop rsi pop rdi ret jmp returnhere /////////////////////// "VCRUNTIME140.dll"+122E: jmp newmem returnhere: [DISABLE] dealloc(newmem) "VCRUNTIME140.dll"+122E: repe movsb pop rsi pop rdi ret { // ORIGINAL CODE - INJECTION POINT: "VCRUNTIME140.dll"+122E "VCRUNTIME140.dll"+1213: CC - int 3 "VCRUNTIME140.dll"+1214: CC - int 3 "VCRUNTIME140.dll"+1215: CC - int 3 "VCRUNTIME140.dll"+1216: 66 66 0F 1F 84 00 00 00 00 00 - nop [rax+rax+00000000] "VCRUNTIME140.dll"+1220: 57 - push rdi "VCRUNTIME140.dll"+1221: 56 - push rsi "VCRUNTIME140.dll"+1222: 49 8B C3 - mov rax,r11 "VCRUNTIME140.dll"+1225: 48 8B F9 - mov rdi,rcx "VCRUNTIME140.dll"+1228: 49 8B C8 - mov rcx,r8 "VCRUNTIME140.dll"+122B: 49 8B F2 - mov rsi,r10 // ---------- INJECTING HERE ---------- "VCRUNTIME140.dll"+122E: F3 A4 - repe movsb "VCRUNTIME140.dll"+1230: 5E - pop rsi "VCRUNTIME140.dll"+1231: 5F - pop rdi "VCRUNTIME140.dll"+1232: C3 - ret // ---------- DONE INJECTING ---------- "VCRUNTIME140.dll"+1233: CC - int 3 "VCRUNTIME140.dll"+1234: CC - int 3 "VCRUNTIME140.dll"+1235: CC - int 3 "VCRUNTIME140.dll"+1236: CC - int 3 "VCRUNTIME140.dll"+1237: CC - int 3 "VCRUNTIME140.dll"+1238: CC - int 3 "VCRUNTIME140.dll"+1239: 0F 1F 80 00 00 00 00 - nop [rax+00000000] "VCRUNTIME140.dll"+1240: 4C 8B D9 - mov r11,rcx "VCRUNTIME140.dll"+1243: 4C 8B D2 - mov r10,rdx "VCRUNTIME140.dll"+1246: 49 83 F8 10 - cmp r8,10 } Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 24 ноября, 2019 Поделиться Опубликовано 24 ноября, 2019 3 минуты назад, Antonshka сказал: А идея отличная у тебя, если бы не ассинхронизация, я бы её и использовал. Хотя не, скорее всего яне смогу это реализовать, я не знаю сколько у тебя адресов, в какой они очередности. В источник (именно) по-идее можно будет записать, отключив на время repe movsb Спойлер [ENABLE] alloc(newmem,2048,"VCRUNTIME140.dll"+122E) label(returnhere) label(code) newmem: cmp [flag],1 // флаг объявить и регулировать в своём скрипте с потоком je code // при флаге = 1 записать в источник нужные данные repe movsb // как все запишется (флаг = 0) пропустить эту инструкцию. code: pop rsi pop rdi ret jmp returnhere /////////////////////// "VCRUNTIME140.dll"+122E: jmp newmem returnhere: [DISABLE] dealloc(newmem) "VCRUNTIME140.dll"+122E: repe movsb pop rsi pop rdi ret { // ORIGINAL CODE - INJECTION POINT: "VCRUNTIME140.dll"+122E "VCRUNTIME140.dll"+1213: CC - int 3 "VCRUNTIME140.dll"+1214: CC - int 3 "VCRUNTIME140.dll"+1215: CC - int 3 "VCRUNTIME140.dll"+1216: 66 66 0F 1F 84 00 00 00 00 00 - nop [rax+rax+00000000] "VCRUNTIME140.dll"+1220: 57 - push rdi "VCRUNTIME140.dll"+1221: 56 - push rsi "VCRUNTIME140.dll"+1222: 49 8B C3 - mov rax,r11 "VCRUNTIME140.dll"+1225: 48 8B F9 - mov rdi,rcx "VCRUNTIME140.dll"+1228: 49 8B C8 - mov rcx,r8 "VCRUNTIME140.dll"+122B: 49 8B F2 - mov rsi,r10 // ---------- INJECTING HERE ---------- "VCRUNTIME140.dll"+122E: F3 A4 - repe movsb "VCRUNTIME140.dll"+1230: 5E - pop rsi "VCRUNTIME140.dll"+1231: 5F - pop rdi "VCRUNTIME140.dll"+1232: C3 - ret // ---------- DONE INJECTING ---------- "VCRUNTIME140.dll"+1233: CC - int 3 "VCRUNTIME140.dll"+1234: CC - int 3 "VCRUNTIME140.dll"+1235: CC - int 3 "VCRUNTIME140.dll"+1236: CC - int 3 "VCRUNTIME140.dll"+1237: CC - int 3 "VCRUNTIME140.dll"+1238: CC - int 3 "VCRUNTIME140.dll"+1239: 0F 1F 80 00 00 00 00 - nop [rax+00000000] "VCRUNTIME140.dll"+1240: 4C 8B D9 - mov r11,rcx "VCRUNTIME140.dll"+1243: 4C 8B D2 - mov r10,rdx "VCRUNTIME140.dll"+1246: 49 83 F8 10 - cmp r8,10 } Короче нужно тестить. Чёй-то у меня голова не варит. :) Ссылка на комментарий Поделиться на другие сайты Поделиться
Antonshka Опубликовано 24 ноября, 2019 Автор Поделиться Опубликовано 24 ноября, 2019 2 минуты назад, Garik66 сказал: Хотя не, скорее всего яне смогу это реализовать, я не знаю сколько у тебя адресов, в какой они очередности. В источник (именно) по-идее можно будет записать, отключив на время repe movsb Показать контент [ENABLE] alloc(newmem,2048,"VCRUNTIME140.dll"+122E) label(returnhere) label(code) newmem: cmp [flag],1 // флаг объявить и регулировать в своём скрипте с потоком je code // при флаге = 1 записать в источник нужные данные repe movsb // как все запишется (флаг = 0) пропустить эту инструкцию. code: pop rsi pop rdi ret jmp returnhere /////////////////////// "VCRUNTIME140.dll"+122E: jmp newmem returnhere: [DISABLE] dealloc(newmem) "VCRUNTIME140.dll"+122E: repe movsb pop rsi pop rdi ret { // ORIGINAL CODE - INJECTION POINT: "VCRUNTIME140.dll"+122E "VCRUNTIME140.dll"+1213: CC - int 3 "VCRUNTIME140.dll"+1214: CC - int 3 "VCRUNTIME140.dll"+1215: CC - int 3 "VCRUNTIME140.dll"+1216: 66 66 0F 1F 84 00 00 00 00 00 - nop [rax+rax+00000000] "VCRUNTIME140.dll"+1220: 57 - push rdi "VCRUNTIME140.dll"+1221: 56 - push rsi "VCRUNTIME140.dll"+1222: 49 8B C3 - mov rax,r11 "VCRUNTIME140.dll"+1225: 48 8B F9 - mov rdi,rcx "VCRUNTIME140.dll"+1228: 49 8B C8 - mov rcx,r8 "VCRUNTIME140.dll"+122B: 49 8B F2 - mov rsi,r10 // ---------- INJECTING HERE ---------- "VCRUNTIME140.dll"+122E: F3 A4 - repe movsb "VCRUNTIME140.dll"+1230: 5E - pop rsi "VCRUNTIME140.dll"+1231: 5F - pop rdi "VCRUNTIME140.dll"+1232: C3 - ret // ---------- DONE INJECTING ---------- "VCRUNTIME140.dll"+1233: CC - int 3 "VCRUNTIME140.dll"+1234: CC - int 3 "VCRUNTIME140.dll"+1235: CC - int 3 "VCRUNTIME140.dll"+1236: CC - int 3 "VCRUNTIME140.dll"+1237: CC - int 3 "VCRUNTIME140.dll"+1238: CC - int 3 "VCRUNTIME140.dll"+1239: 0F 1F 80 00 00 00 00 - nop [rax+00000000] "VCRUNTIME140.dll"+1240: 4C 8B D9 - mov r11,rcx "VCRUNTIME140.dll"+1243: 4C 8B D2 - mov r10,rdx "VCRUNTIME140.dll"+1246: 49 83 F8 10 - cmp r8,10 } Короче нужно тестить. Чёй-то у меня голова не варит. :) Да, все дело в том что должны быть отключены только некоторые адреса. Для остальных адресов этого блока памяти Repe movsb должна продолжать работать . Например из 1000 адресов, только 10 нужно отключить на время. Нужна фильтрация адресов для инструкции Repe movsb. Пока я не знаю другого способа, а хочется. Потому что способ с фильтрация и расчетом какой-то сложный. Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 24 ноября, 2019 Поделиться Опубликовано 24 ноября, 2019 Только что, Antonshka сказал: Например из 1000 адресов, только 10 нужно отключить на время. Не ну, если 10 тогда можно просто вручную их прописать. это не сложно Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 24 ноября, 2019 Поделиться Опубликовано 24 ноября, 2019 ЗЫ: тогда можно и в приемник писать: Спойлер [ENABLE] alloc(newmem,2048,"VCRUNTIME140.dll"+122E) label(returnhere) label(code) newmem: repe movsb cmp [flag],1 jne code mov [rdi+2],#50 mov [rdi+c],#21 ////////////// т.д. ////////////// code: pop rsi pop rdi ret jmp returnhere /////////////////////// "VCRUNTIME140.dll"+122E: jmp newmem returnhere: [DISABLE] dealloc(newmem) "VCRUNTIME140.dll"+122E: repe movsb pop rsi pop rdi ret { // ORIGINAL CODE - INJECTION POINT: "VCRUNTIME140.dll"+122E "VCRUNTIME140.dll"+1213: CC - int 3 "VCRUNTIME140.dll"+1214: CC - int 3 "VCRUNTIME140.dll"+1215: CC - int 3 "VCRUNTIME140.dll"+1216: 66 66 0F 1F 84 00 00 00 00 00 - nop [rax+rax+00000000] "VCRUNTIME140.dll"+1220: 57 - push rdi "VCRUNTIME140.dll"+1221: 56 - push rsi "VCRUNTIME140.dll"+1222: 49 8B C3 - mov rax,r11 "VCRUNTIME140.dll"+1225: 48 8B F9 - mov rdi,rcx "VCRUNTIME140.dll"+1228: 49 8B C8 - mov rcx,r8 "VCRUNTIME140.dll"+122B: 49 8B F2 - mov rsi,r10 // ---------- INJECTING HERE ---------- "VCRUNTIME140.dll"+122E: F3 A4 - repe movsb "VCRUNTIME140.dll"+1230: 5E - pop rsi "VCRUNTIME140.dll"+1231: 5F - pop rdi "VCRUNTIME140.dll"+1232: C3 - ret // ---------- DONE INJECTING ---------- "VCRUNTIME140.dll"+1233: CC - int 3 "VCRUNTIME140.dll"+1234: CC - int 3 "VCRUNTIME140.dll"+1235: CC - int 3 "VCRUNTIME140.dll"+1236: CC - int 3 "VCRUNTIME140.dll"+1237: CC - int 3 "VCRUNTIME140.dll"+1238: CC - int 3 "VCRUNTIME140.dll"+1239: 0F 1F 80 00 00 00 00 - nop [rax+00000000] "VCRUNTIME140.dll"+1240: 4C 8B D9 - mov r11,rcx "VCRUNTIME140.dll"+1243: 4C 8B D2 - mov r10,rdx "VCRUNTIME140.dll"+1246: 49 83 F8 10 - cmp r8,10 } Ссылка на комментарий Поделиться на другие сайты Поделиться
partoftheworlD Опубликовано 24 ноября, 2019 Поделиться Опубликовано 24 ноября, 2019 Только что, Antonshka сказал: Пока я не знаю другого способа, а хочется. Чем придумывать велосипед из палок и грязи, просто проиндексируй массив и обращайся к значениям по их индексу. Оу, поспешил, вы что тут вообще творите? Это ведь WinAPi выйди по стеку в пользовательский код и уже там сравнивай. За внедрение кода в winapi обычно по рукам бьют. И код ничего не пишет, уж это можно было загуглить. Цитата Функция memcmp() сравнивает символы в двух буферах. Сравнение производится лексикографически. Функция memcmp() возвращает целое число, указывающее отношение между буферами. 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Antonshka Опубликовано 25 ноября, 2019 Автор Поделиться Опубликовано 25 ноября, 2019 10 часов назад, Garik66 сказал: ЗЫ: тогда можно и в приемник писать: Показать контент [ENABLE] alloc(newmem,2048,"VCRUNTIME140.dll"+122E) label(returnhere) label(code) newmem: repe movsb cmp [flag],1 jne code mov [rdi+2],#50 mov [rdi+c],#21 ////////////// т.д. ////////////// code: pop rsi pop rdi ret jmp returnhere /////////////////////// "VCRUNTIME140.dll"+122E: jmp newmem returnhere: [DISABLE] dealloc(newmem) "VCRUNTIME140.dll"+122E: repe movsb pop rsi pop rdi ret { // ORIGINAL CODE - INJECTION POINT: "VCRUNTIME140.dll"+122E "VCRUNTIME140.dll"+1213: CC - int 3 "VCRUNTIME140.dll"+1214: CC - int 3 "VCRUNTIME140.dll"+1215: CC - int 3 "VCRUNTIME140.dll"+1216: 66 66 0F 1F 84 00 00 00 00 00 - nop [rax+rax+00000000] "VCRUNTIME140.dll"+1220: 57 - push rdi "VCRUNTIME140.dll"+1221: 56 - push rsi "VCRUNTIME140.dll"+1222: 49 8B C3 - mov rax,r11 "VCRUNTIME140.dll"+1225: 48 8B F9 - mov rdi,rcx "VCRUNTIME140.dll"+1228: 49 8B C8 - mov rcx,r8 "VCRUNTIME140.dll"+122B: 49 8B F2 - mov rsi,r10 // ---------- INJECTING HERE ---------- "VCRUNTIME140.dll"+122E: F3 A4 - repe movsb "VCRUNTIME140.dll"+1230: 5E - pop rsi "VCRUNTIME140.dll"+1231: 5F - pop rdi "VCRUNTIME140.dll"+1232: C3 - ret // ---------- DONE INJECTING ---------- "VCRUNTIME140.dll"+1233: CC - int 3 "VCRUNTIME140.dll"+1234: CC - int 3 "VCRUNTIME140.dll"+1235: CC - int 3 "VCRUNTIME140.dll"+1236: CC - int 3 "VCRUNTIME140.dll"+1237: CC - int 3 "VCRUNTIME140.dll"+1238: CC - int 3 "VCRUNTIME140.dll"+1239: 0F 1F 80 00 00 00 00 - nop [rax+00000000] "VCRUNTIME140.dll"+1240: 4C 8B D9 - mov r11,rcx "VCRUNTIME140.dll"+1243: 4C 8B D2 - mov r10,rdx "VCRUNTIME140.dll"+1246: 49 83 F8 10 - cmp r8,10 } Не могу использовать такой способ. Инструкцию Repe movsb вызывает свой CALL, например раз 30 в секунду, это сегодня, завтра же может быть она будет вызывать её уже раз 35 в секунду. Мне нужна постоянная частота записи в нужные мне адреса. Нужен свой поток. 7 часов назад, partoftheworlD сказал: Чем придумывать велосипед из палок и грязи, просто проиндексируй массив и обращайся к значениям по их индексу. Оу, поспешил, вы что тут вообще творите? Это ведь WinAPi выйди по стеку в пользовательский код и уже там сравнивай. За внедрение кода в winapi обычно по рукам бьют. И код ничего не пишет, уж это можно было загуглить. В игре такая ситуация, есть два буфера, и есть блок памяти с моими адресами. инструкция Repe movsb копирует из первого буфера данные в мой блок, затем она же копирует данные из моего блока во второй буфер. То есть нужно посмотреть что пишет в первый буфер до того как он будет скопирован инструкцией Repe movsb? Или посмотреть что будет читать второй буфер после того как в него будут скопированы данные? Ссылка на комментарий Поделиться на другие сайты Поделиться
partoftheworlD Опубликовано 25 ноября, 2019 Поделиться Опубликовано 25 ноября, 2019 5 часов назад, Antonshka сказал: То есть нужно посмотреть что пишет в первый буфер до того как он будет скопирован инструкцией Repe movsb? Или посмотреть что будет читать второй буфер после того как в него будут скопированы данные? Если нужны данные, просто выходишь по стеку вызовов на пользовательский код, там вешаешь скрипт и перехватываешь нужные буферы, которые передаются в функцию memcmp как аргументы, регистрируешь глобально символы на них, а дальше делаешь с ними что хочешь, например дамп всех значений в блоке, через lua. Хотя лучше потратить чуть больше времени, и восстановить алгоритм получения указателей на блоки, хотя бы до инструкции работающей с массивами и уже на этом куске кода вешать скрипт. Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 25 ноября, 2019 Поделиться Опубликовано 25 ноября, 2019 1 час назад, partoftheworlD сказал: Хотя лучше потратить чуть больше времени, и восстановить алгоритм получения указателей на блоки, хотя бы до инструкции работающей с массивами и уже на этом куске кода вешать скрипт. Может трассировкой попробовать? Ссылка на комментарий Поделиться на другие сайты Поделиться
partoftheworlD Опубликовано 25 ноября, 2019 Поделиться Опубликовано 25 ноября, 2019 1 час назад, Garik66 сказал: Может трассировкой попробовать? Мне кажется она будет бесполезна на memcmp, возможно, memcmp будет использоваться какой-нибудь из программ из-за чего трейс будет постоянно не того что нужно, лучше по стеку руками пройтись и в заметках восстановить все. Ссылка на комментарий Поделиться на другие сайты Поделиться
Antonshka Опубликовано 25 ноября, 2019 Автор Поделиться Опубликовано 25 ноября, 2019 А почему по рукам бьют за внедрение в memcpy? Что в этом плохого? Недавно мне попалась проверка целостности кода. Она работала также через memcpy. Я просто заменил RSI на начало продублированного exe модуля. Работает нормально. Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения