Перейти к содержанию
Авторизация  
Antonshka

Repe movsb - чтение и запись

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

Привет всем.

 

Я к вам с интересной задачей. Раньше с таким не сталкивался.

В одной игре характеристики машины находятся в одном блоке памяти. Этот блок памяти контролируется только одной инструкцией Repe movsb, она и читает, она и записывает. Мне нужно взять под контроль всего лишь несколько разных адресов этого копируемого блока.

 

Как мне быть?

У меня есть одна идея, но я не знаю насколько она хороша, я её еще даже и не опробовал. Может ваши будут лучше, и я их применю. Или вы мою улучшите.

Моя идея такая, может быть

1 - заменить значение RCX перед копированием на такое, чтобы скопировался блок только до нужного мне адреса,

2 - сделать какие-нибудь манипуляции со значением нужного мне адреса, ради чего собственно это всё

3 - к RSI и RDI прибавить размер уже скопированного блока и прибавить размер нужного мне адреса (4 байта например)

4 - записать в RCX размер оставшегося и еще не скопированного блока минус размер нужного адреса

5 - снова вызвать копирование.

И так для всех нужных мне адресов. Причем расположив все процедуры копирования остатков блоков в порядке нужных мне адресов.

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


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

Как мне быть?

Я бы попробовал не посредственно,  после объявления rcx, rdi и rsi,  и началом цикла писать в нужный тебе адрес 

Repe movsb копирует (если мне не изменяет память) из адреса rdi в rsi по-байтно.

тогда так: mov byte ptr [rdi+5],#66 -записать в шестой байт блока 66, ну и т.д.
Сам я не пробовал.

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


Ссылка на сообщение
Поделиться на другие сайты
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 должна пропускать запись только в эти некоторые адреса.

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


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

огда RSI это источник

значит плохая у меня память, тогда так:

mov byte ptr [rsi+5],#66

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


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

значит плохая у меня память, тогда так:

mov byte ptr [rsi+5],#66

 

В RSI как я понял всегда находится источник, откуда копируется. В RDI приемник, куда. Поэтому если писать этим же потоком в котором находится Repe movsb в нужные мне адрес, тогда правильно у тебя было в первом сообщении. mov byte ptr [rdi+5],#66.

 

Но как я написал во втором сообщении, я теперь не могу использовать поток в котором находится Repe movsb. Я хочу создать свой собственный поток через CreateThread, он то и будет писать в нужные мне адреса. Просто в то время когда мой поток пишет, тогда Repe movsb должна пропускать эти некоторые адреса.

 

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

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


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

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

ты будешь записывать по Горячей клавише? или как ты это планируешь,
Если по горячей клавише, то просто Флаг.
 

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


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

В RSI как я понял всегда находится источник, откуда копируется. В RDI приемник, куда. Поэтому если писать этим же потоком в котором находится Repe movsb в нужные мне адрес, тогда правильно у тебя было в первом сообщении. mov byte ptr [rdi+5],#66.

Не правильно, Значение в текущем адресе [rdi] будет перезаписываться циклом lea ........................... или как там у тебя (без кода сложно)

Поэтому записывать только в источник, т.е. в [rsi]

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


Ссылка на сообщение
Поделиться на другие сайты
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 

 

 

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


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

зы: в приемник можно записать после отработки цикла Repe movsb

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


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

ты будешь записывать по Горячей клавише? или как ты это планируешь,
Если по горячей клавише, то просто Флаг.
 

 

Запись будет по флагу. Например флаг равен 1, идет запись ранее сохраненных значений в адреса. Запись продолжается до тех пор пока, либо флаг не станет равным 0, либо пока не настанет конец файла на диске.

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

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


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

Вот куда-то сюда м/у 

VCRUNTIME140.memcmp+EE - F3 A4                 - repe movsb 
VCRUNTIME140.memcmp+F0 - 5E                    - pop rsi

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


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

Вот куда-то сюда м/у 


VCRUNTIME140.memcmp+EE - F3 A4                 - repe movsb 
VCRUNTIME140.memcmp+F0 - 5E                    - pop rsi

 

Верно, но я не могу использовать это место. Не могу использовать этот VCRUNTIME140 поток. Мне нужно только обезвредить, так сказать, этот Repe movsb, на время, пока я собственным потоком записываю данные в адреса.

Мой собственный поток это не Repe movsb или подобное что-то. Мой собственный поток это будет просто обычная инструкция MOV и переменная счетчик.

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


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

А идея отличная у тебя, если бы не ассинхронизация, я бы её и использовал.

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


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

Мой собственный поток это будет просто обычная инструкция MOV и переменная счетчик.

Это понятно.

Выложи скрипт СЕ рядом с 

VCRUNTIME140.memcmp+EE - F3 A4                 - repe movsb 

попробую свою мысль скриптом выразить. а то писать долго.

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


Ссылка на сообщение
Поделиться на другие сайты
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
}

 

 

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


Ссылка на сообщение
Поделиться на другие сайты
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
}

 

Короче нужно тестить.
Чёй-то у меня голова не варит. :)

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


Ссылка на сообщение
Поделиться на другие сайты
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. Пока я не знаю другого способа, а хочется.

Потому что способ с фильтрация и расчетом какой-то сложный.

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


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

Например из 1000 адресов, только 10 нужно отключить на время.

Не ну, если 10 тогда можно просто вручную их прописать. это не сложно

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


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

ЗЫ: тогда можно и в приемник писать:
 

Спойлер

[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
}

 

 

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


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

Пока я не знаю другого способа, а хочется.

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

 

Оу, поспешил, вы что тут вообще творите?
Это ведь WinAPi выйди по стеку в пользовательский код и уже там сравнивай. За внедрение кода в winapi обычно по рукам бьют.
И код ничего не пишет, уж это можно было загуглить.

 

Цитата

Функция memcmp() сравнивает символы в двух буферах. Сравнение производится лексикографически. Функция memcmp() возвращает целое число, указывающее отношение между буферами.

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

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


Ссылка на сообщение
Поделиться на другие сайты
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? Или посмотреть что будет читать второй буфер после того как в него будут скопированы данные?

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


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

То есть нужно посмотреть что пишет в первый буфер до того как он будет скопирован инструкцией Repe movsb? Или посмотреть что будет читать второй буфер после того как в него будут скопированы данные?

 

Если нужны данные, просто выходишь по стеку вызовов на пользовательский код, там вешаешь скрипт и перехватываешь нужные буферы, которые передаются в функцию memcmp как аргументы, регистрируешь глобально символы на них, а дальше делаешь с ними что хочешь, например дамп всех значений в блоке, через lua.

 

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

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


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

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

Может трассировкой попробовать?

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


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

Может трассировкой попробовать?

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

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


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

А почему по рукам бьют за внедрение в memcpy? Что в этом плохого?

Недавно мне попалась проверка целостности кода. Она работала также через memcpy. Я просто заменил RSI на начало продублированного exe модуля. Работает нормально.

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


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

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

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

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

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

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

Войти

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

Войти
Авторизация  

×

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

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