Сейчас на форуме: (+6 невидимых)

 eXeL@B —› Вопросы новичков —› Вопрос про CodeCave
Посл.ответ Сообщение

Ранг: 1.4 (гость)
Активность: 0=0
Статус: Участник

Создано: 07 августа 2010 20:22
· Личное сообщение · #1

Здравствуйте, уважаемые Крэкеры.
Недавно на chemax.ru прочитал что использовать CodeCave опасно, и для нормального трейнера нужно использовать выделение памяти. Расскажите пожалуйста про этот способ.
Смотрел функцию VirtualAllocEx. Как через нее выделить память, так чтоб игра не откинула копытца ?(что писать в начальный адрес, и что делать с памятью после вызова этой функции ?)




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 07 августа 2010 21:52
· Личное сообщение · #2

Что писать в начальный адрес-мсдн в помощь. В остальном ничем не отличается от CodeCave, просто адрес чуть другой, получаемый от функции, а не хардкоженый.



Ранг: 1.4 (гость)
Активность: 0=0
Статус: Участник

Создано: 07 августа 2010 22:08 · Поправил: Snef
· Личное сообщение · #3

мм спасибо, но можно как совсем совсем новичку ?

В msdn написано что начальный адрес - это тот адрес, начиная с которого вы хотите выделить память.
Как понять "получаемый от функции" ?

Что-то медленно стало доходить, если вместо этого адреса поставить NULL, то функция сама выделит регион памяти под мой код, и возвратит начальный адрес этого региона ?




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 08 августа 2010 08:33
· Личное сообщение · #4

МСДН читать надо уметь, пригодится в любом случае, не вижу там ничего сложного. В крайнем случае можешь взять и попробовать. Чтоб легче было попробовать, выделяй память в своём процессе.
Догадка верна.



Ранг: 1.4 (гость)
Активность: 0=0
Статус: Участник

Создано: 08 августа 2010 10:37
· Личное сообщение · #5

Спасибо, буду учится читать.



Ранг: 1.4 (гость)
Активность: 0=0
Статус: Участник

Создано: 09 августа 2010 13:07
· Личное сообщение · #6

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

Можно ли из этой строки узнать(на языке высокого уровня) содержимое регистра esi,

Code:
  1. 202D8D75: 03 4c be 10  add ecx,[esi+edi*4+10]


не меняя ничего в коде и не пересылая это значение в адрес памяти ?




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 09 августа 2010 13:27
· Личное сообщение · #7

Только если отлаживать процесс, ставить точку останова и читать контекст. Либо отслеживать руками, откуда берётся ESI и искать алтернативы.



Ранг: 1.4 (гость)
Активность: 0=0
Статус: Участник

Создано: 09 августа 2010 13:42 · Поправил: Snef
· Личное сообщение · #8

Жалко
А вот отсюда esi можно узнать ?

Начало функции:

Code:
  1. 202D8D60: 56   push esi
  2. ...
  3. 202D8D67: 8b f1  mov esi,ecx


esi берется из ecx ? т.e придется искать ecx и так далее по цепочке ?

Перефразирую немного вопрос, можно ли сделать что-нибудь эффективнее чем:

Code:
  1. 202D8D75: jmp 0x20000000
  2.  
  3. 0x20000000: mov [0x20001000], esi
  4. 0x20000004: add ecx,[esi+edi*4+10]


и потом просто читать значение в 0x20001000 ?

Просто ингда бывает нужно узнать несколько подобных значений, и писать(а потом еще и переносить в C++) много кода неудобно.




Ранг: 147.7 (ветеран), 50thx
Активность: 0.120
Статус: Участник
sv_cheats 1

Создано: 09 августа 2010 14:50
· Личное сообщение · #9

Snef пишет:
А вот отсюда esi можно узнать ?
Начало функции:


Тот, кто сможет ответить тебе на данный вопрос еще не родился.

Зачем все усложнять, когда проще поставить бряк в отладчике.




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 09 августа 2010 15:28
· Личное сообщение · #10

Он лоадер пишет, иди проспись после вчерашнего.




Ранг: 147.7 (ветеран), 50thx
Активность: 0.120
Статус: Участник
sv_cheats 1

Создано: 09 августа 2010 15:33 · Поправил: SER[G]ANT
· Личное сообщение · #11

Archer
Про лоадер в этой теме ни слова.


Если прочесть первый пост, то в голову приходит, что значение регистра вам нужно для сравнения свой/чужой, то проще будет пройтись по структуре (значение регистра) и там найти указатель на то, что нужно.
затем написать что-то типа

cmp [esi+смещение],1
jne short _оригинальный_код_
наш код, для того что нам нужно сделать
@_оригинальный_код_:
add ecx,[esi+edi*4+10]
jmp _обратно_

мб хрень написал, я сейчас не в адеквате
[offtop]вчера особо не было ничего, вот сегодня с 6 вечера.... [/offtop]



Ранг: 1.4 (гость)
Активность: 0=0
Статус: Участник

Создано: 09 августа 2010 15:44 · Поправил: Snef
· Личное сообщение · #12

Спасибо всем за помощь , придется что-нибудь придумывать, а то руки отпадут пока байты переписываешь. Тему не закрывайте пока.
SER[G]ANT ,спасибо, но это не совсем то.


Все, придумал как можно это облегчить.

Написал функцию:
Code:
  1. DWORD GetRegisterValueEx(HANDLE handle, DWORD Address1, int size, char regName[])


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


 eXeL@B —› Вопросы новичков —› Вопрос про CodeCave
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати