Вверх ↑
Этот топик читают: Гость
Ответов: 321
Рейтинг: 10
#16: 2015-09-02 16:12:46 ЛС | профиль | цитата
Netspirit пожалуйста. Причем это не единичный случай, когда ProcMemory не может записать значение в память.
code_36241.txt


Подозрения есть на антивирус, хотя навряд ли.


OpenProcess(PROCESS_ALL_ACCESS,False,ProcessId); или компонент не имеет прав, знаний в delphi вообще не имею, это мое предположение.


Пока вообще неведомый для меня урок, это VirtualProtectEx http://www.pinvoke.net/default.aspx/kernel32.virtualprotectex... Защита какая-то...

Вот решение вроде как, дает права на запись (make it writeable). Но в Hiasm реализовать ума у меня не хватит.
//Declare this somewhere
[DllImport("kernel32.dll")]
static extern bool VirtualProtectEx(IntPtr hProcess, IntPtr lpAddress,
UIntPtr dwSize, uint flNewProtect, out uint lpflOldProtect);

//Call this for your address to make it writeable.
uint dwOldProtect;
VirtualProtectEx(WoWHandle, (IntPtr)0xAA33DC, (UIntPtr)4, 0x40, out dwOldProtect);
Dilma загляни сюда, молю
карма: 1

0
файлы: 1code_36241.txt [572B] [260]
Ответов: 2059
Рейтинг: 132
#17: 2015-09-02 16:15:46 ЛС | профиль | цитата
Master4eG,
Выше я правил не увидив твоего сообщения:
Я
Если эти четыре байта принимают значения отличные от -1, то скорее всего и нули нельзя писать.

Ты
а если допустим на 90 90 C7 45 - получается

[flood]прошу извинить за такой временной промежуток. Сеть чего то сегодня у меня падает часто.[/flood]
Если падает при нуле, то скорее всего это указатель, в смысле это адрес C7459090.
LEA EAX , [$C7459090], или MOV [$C7459090],EDX, или по адресу. где лежит это число, или прямая адресация в это место (C7459090), что то в этом духе - вариантов множестао.
А у тебя получатся в ноль.
Антивирус и права здесь даже не пробегали. Хотя правильно - на нулевой адрес не у кого нет прав.
карма: 6

0
Ответов: 1841
Рейтинг: 369
#18: 2015-09-02 21:17:16 ЛС | профиль | цитата
Master4eG писал(а):
Подозрения есть на антивирус, хотя навряд ли.

Master4eG писал(а):
VirtualProtectEx http://www.pinvoke.net/default.aspx/kernel32.virtualprotectex... Защита какая-то...
Master4eG писал(а):
или компонент не имеет прав

Нет, нет и нет
Если бы отсутствовали права на запись/чтение или кто-то перехватывает вызов, то (Read/Write)ProcessMemory просто возвращал бы 0.

flint2 писал(а):
Если падает при нуле, то скорее всего это указатель, в смысле это адрес C7459090.

А вот это уже действительно может быть.
Т.е. если значение является указателем и при изменении указателя, адрес указывает на выделенный кусок памяти к которому есть доступ, шанс падения приложения крайне мал и зависит от многих факторов.
карма: 1
0
Ответов: 2059
Рейтинг: 132
#19: 2015-09-02 21:31:09 ЛС | профиль | цитата
на нулевой адрес ни у кого нет прав.
Приложение всегда будет падать, при других значениях - как сказал CriDos.
Даже косвенная адресация по нулю - не прокатит, но это по другим причинам.
Писать в ноль нельзя, читать можно.

карма: 6

0
Ответов: 321
Рейтинг: 10
#20: 2015-09-03 08:02:32 ЛС | профиль | цитата
Ребята, а если читает из памяти и возвращает не ноль, а правильное значение по умолчанию которое
Открываю 0x00A37F0C (это статический адрес вроде как)
187 141 36 63 - 1059360187(4 Bytes) - WallClimb OFF - я могу прочесть, что оно ровно 1059360187 (4 Bytes)...
00 00 00 00 - 0 (4 Bytes) - WallClimb ON - если изменять через CE или ArtMoney на 0 (как мне и надо), то могу прочесть через ProcMemory, что уже ноль там.

Но при попытки записать свое значение результат печальный, не хочет.
Сделаю видео для наглядности, может я что-то не так делаю.
------------ Дoбавленo в 07.27:

http://www.youtube.com/watch?v=UYIKQDCetAI - сделал видео.

Небольшое пояснение:
WallClimb - хождение по горам, то есть персонаж поднимается на повеврхности под любым углом.
WalkWater - хождение по воде, то есть зайдя в воду не начинает плавать, а просто бежит по воде (это быстрее чем плавать).
Видео немного тупит, но суть надеюсь понятна.
Сначала через программу пытаюсь сделать WallClimb - не получается, и через эту же программу делаю WalkWater - получается.
Делаю через CE злоудачный WallClimb - получается.

Если не понятно что я делаю на видео, могу записать с комментированием, просто микрофон плохой на ноутбуке.
------------ Дoбавленo в 08.02:
Вот схемка с которой работал в видео.
Add(MainForm,2953706,378,343)
{
Width=642
Height=426
Position=1
}
Add(ProcMemory,13718820,609,273)
{
DataType=2
Point(Offset)
Point(Data)
link(Name,5084047:Text,[(615,209)(482,209)])
link(onRead,10440774:doText,[(657,279)(657,118)])
link(Offset,10094339:Text,[])
link(Data,10440774:Text,[(629,209)(671,209)])
}
Add(Button,69480,518,315)
{
Left=280
Top=150
Caption="WR"
link(onClick,13718820:doWrite,[(580,321)(580,293)])
}
Add(Button,7344710,518,280)
{
Left=220
Top=150
Caption="RD"
link(onClick,13718820:doRead,[])
}
Add(Edit,3692680,532,112)
{
Left=220
Top=105
Width=140
Text="hex"
link(onChange,14902429:doConvert,[])
}
Add(Edit,5084047,476,112)
{
Left=220
Top=85
Width=140
Text="wow.exe"
}
Add(Edit,10440774,665,112)
{
Left=220
Top=125
Width=140
Text="data"
}
Add(Label,4854125,469,63)
{
Left=165
Top=90
Width=54
Height=17
Caption="ProcName"
}
Add(Label,13901793,616,63)
{
Left=185
Top=110
Width=32
Height=17
Caption="Offset"
}
Add(Label,11051949,665,63)
{
Left=190
Top=130
Width=27
Height=17
Caption="Data"
}
Add(Button,2875114,518,357)
{
Left=365
Top=85
Caption="Open"
link(onClick,9429329:doEvent1,[])
}
Add(Label,16697285,609,364)
{
Left=430
Top=90
Width=12
Height=17
Caption="id"
link(Text,13718820:ProcessID,[])
}
Add(Hub,9429329,560,357)
{
link(onEvent1,13718820:doOpenProcess,[(592,363)(592,279)])
link(onEvent2,16697285:doText,[])
}
Add(Convertor,14902429,574,112)
{
Mode=5
link(onResult,10094339:doText,[])
}
Add(Edit,10094339,616,112)
{
Left=375
Top=105
Width=140
Text="int"
}
Add(Label,10439493,574,63)
{
Left=365
Top=110
Width=10
Height=17
Caption="="
}
Add(Memo,10562017,301,238)
{
Left=175
Top=230
Width=435
Height=135
Strings=#29:+++++++++++++++++++++++++++++|29:0x00A37F0C - WallClimb Offset|26:1059360187 - WallClimb OFF|16:0 - WallClimb ON|29:+++++++++++++++++++++++++++++|30:0x0075E439 - Waterwalk Offset |26:3481343092 - Waterwalk OFF|25:3481343093 - Waterwalk ON|29:+++++++++++++++++++++++++++++|
}

карма: 1

0
Ответов: 2059
Рейтинг: 132
#21: 2015-09-03 08:53:31 ЛС | профиль | цитата
Чего то в каждой строчке всё новые и новые числа.
Открываю 0x00A37F0C
- это значение в памяти? (что значит открываю? наверное читаю.)
То оно равно HEX 7F0C00A3, DECIMAL 2131493027.
Тогда это что
187 141 36 63 - 1059360187(4 Bytes) - WallClimb OFF
?
Я так понимаю, что 187 141 36 63 это адрес, а это 1059360187 значение по этому адресу.
Но откуда он взялся, если сначала мы говорим о этом адресе 0x00A37F0C=7F0C00A3=2131493027 ?
Вполне может быть, что ON/OFF может выражаться одним байтом.
В 0x00A37F0C 7F очень "ровный" ( 127 ). Но это я так, бла-бла.
В ArtMoney ты смотришь изменение dword, но если меняется байт с ON на OFF, то и четырёхбайтное число меняется... Как вариант.
Из твоей программы:
3481343092 - Waterwalk OFF
3481343093 - Waterwalk ON

и через эту же программу делаю WalkWater - получается.

3481343092 и 3481343093 - это явно адреса!!! Смотри что там лежит. Смотреть байт, а не dword!
WalkWater - получается.

(Наверное один адрес указывает на 0, а другой на -1(FF) (в общем случае не ноль). Это значит True/False одним байтом (Bool, а не Boolean).
Чуешь разницу в один байт?!! Это же так очевидно!
На
В 0x00A37F0C 7F очень "ровный" ( 127 ). Но это я так, бла-бла.
наплевать и забыть.
Думаю, что эти адреса можно подставить и в WallClimb.
карма: 6

0
Ответов: 321
Рейтинг: 10
#22: 2015-09-03 09:30:43 ЛС | профиль | цитата
flint2, да "Открываю", я имел ввиду память процесса, для чтения/записи.
187 141 36 63 - это Array of byte он же 1059360187(4 Bytes/Dword) Его можно не брать во внимание.

Адрес у меня всего один (0x00A37F0C или он же 10714892 dec). Один для опции wallclimb.
Для Waterwalk адрес 0x0075E439 или он же 7726137 dec).


0x00A37F0C как превратилось в 7F0C00A3 ?! Разве оно изначально не hex?!
карма: 1

0
Ответов: 2059
Рейтинг: 132
#23: 2015-09-03 10:01:22 ЛС | профиль | цитата
0x00A30C0C как превратилось в 7F0C00A3 ?! Разве оно изначально не hex?!

Это я маху дал! Извиняюсь, начал копи-пастить и промахнулся.
Конечно же 0C0CA300. Не очень наглядно из за одинаковых байт. Например в памяти 59 00 6B 03 - это 036B0059, десятичное 57344089.
Ааа, бестолковый я, ArtMoneyдает даёт уже готовое значение 0x00A30C0C.
Адрес у меня всего один (0x00A37F0C или он же 10714892 dec). Один для опции wallclimb.

Вот сюда 10714892 и пиши указатели на False 3481343092, или True 3481343093, в зависимости чего надо.
Это Bool, а не Boolean.
Если эти параметры не Да/Нет для WallClimb, то надо прочитать по адресу 10714892 число, которое в свою очередь является адресом, и уже по этому адресу читать значение. По адресу 10714892 могут быть несколько указателей указателей на разные данные (имеется в виду во времени), но скорее всего Включил/Выключил.
Делай, как я писал выше - сюда 10714892 пиши указатели на False 3481343092, или True 3481343093.
Или-жо 1059360187 - WallClimb OFF, 1059360188 - WallClimb ON. Это я умозрительно. По идее должно работать и то и то.
(Меняются указатели, а сами значения неизменны) - это главное. И писать нули не куда не надо!
карма: 6

0
Ответов: 321
Рейтинг: 10
#24: 2015-09-03 13:17:56 ЛС | профиль | цитата
flint2 не получается, а может я что-то не так делаю :


VirtualProtectEx
Вот решение, у человека тоже не записывало значение.
http://www.ownedcore.com/forums/world-of-warcraft/world-of-warcraft-bots-programs/wow-memory-editing/519770-writing-memory-doesnt-change-value.html

BOOL VirtualProtectEx (

HANDLE hProcess, // ключ процесса
LPVOID lpAddress, // адрес региона фиксированной страницы
DWORD dwSize, // размер региона
DWORD flNewProtect, // режим защиты
PDWORD lpflOldProtect // адрес для прежнего режима защиты
);

Параметры

hProcess
Идентификатор процесса, атрибуты памяти которого будут изменены.
Хэндл должен иметь опцию доступа - PROCESS_VM_OPERATION (см. OpenProcess)

Заметь
lpAddress
Адрес области для установки атрибутов.
dwSize
Размер области памяти.
flNewProtect
Определяет флаги доступа:
Value Meaning
PAGE_READWRITE - Чтение и запись.
PAGE_READONLY - Только чтение.

PAGE_EXECUTE - Только исполнение программного кода.
PAGE_EXECUTE_READ - Исполнение и чтение.
PAGE_EXECUTE_READWRITE - Исполнение, чтение и запись.

PAGE_NOACCESS - Запрещен любой вид доступа.
PAGE_GUARD - Сигнализация доступа к странице. Это значение можно
использовать вместе с другими, кроме PAGE_NOACCESS.
PAGE_NOCACHE - Отмена кэширования для страницы памяти. Используется
драйверами устройств. Это значение можно использовать
вместе с любыми другими, кроме PAGE_NOACCESS.


lpflOldProtect
Указатель на переменную для получения старого значения памяти.
Если параметр равен НУЛЮ или указатель на недействительную память, функция завершится ошибкой.
На выходе
BOOL
Успешная функция добывает НЕ НУЛЬ.
Неуспешная функция терпит НУЛЬ.
Но сам понять я не смогу как реализовать обход этой штуки в Hiasm.
Я уже писал выше, как сделать его читабельныv и доступным для записи, но в Hiasm как это реализовать не понимаю :
[offtop]//Declare this somewhere
[DllImport("kernel32.dll")]
static extern bool VirtualProtectEx(IntPtr hProcess, IntPtr lpAddress,
UIntPtr dwSize, uint flNewProtect, out uint lpflOldProtect);

//Call this for your address to make it writeable.
uint dwOldProtect;
VirtualProtectEx(WoWHandle, (IntPtr)0xAA33DC, (UIntPtr)4, 0x40, out dwOldProtect);[/offtop]
карма: 1

0
Ответов: 2059
Рейтинг: 132
#25: 2015-09-03 14:08:59 ЛС | профиль | цитата
BOOL VirtualProtectEx (

HANDLE hProcess, // ключ процесса
LPVOID lpAddress, // адрес региона фиксированной страницы
DWORD dwSize, // размер региона
DWORD flNewProtect, // режим защиты
PDWORD lpflOldProtect // адрес для прежнего режима защиты
);

Параметры

Что это? Аааа, тык он хотел поменять константу, или защищённую область. Мельком посмотрел. А мы указатели меняем.
Только надо понять, что? там лежит, куда стрелка указывает.
Если просто, Bool - это байт, а Boolean - это Dword и всё тут.
flint2 не получается, а может я что-то не так делаю

Там где у тебя лежит число 1059360187 (по адресу - 10714892) надо записать 1059360188 (возможно 1059360186, хотя навряд ли), или 3481343093.
По образу и подобию, если 3481343092 указывает на байт False, а 3481343093 указывает на байт True, то если
1059360187 указывает на байт False WallClimb OFF , то...
Покажи число HEX (4 байта) по адресу 1059360185, будет всё понятно. И на всякий случай по адресу 3481343090.
Лучше строчку из 16 байт (36B002C - CE 00 6B 03 01 00 00 00 03 03 00 00 59 00 6B 03).
Так не работает?
Add(MainForm,115427,399,329)
{
Width=642
Height=426
Position=1
}
Add(ProcMemory,13718820,630,259)
{
DataType=2
Point(Offset)
Point(Data)
link(Name,5084047:Text,[(636,195)(503,195)])
link(onRead,10440774:doText,[(678,265)(678,104)])
link(Offset,10094339:Text,[])
link(Data,10440774:Text,[(650,195)(692,195)])
}
Add(Button,69480,539,301)
{
Left=280
Top=150
Caption="WR"
link(onClick,13718820:doWrite,[(601,307)(601,279)])
}
Add(Button,7344710,539,266)
{
Left=220
Top=150
Caption="RD"
link(onClick,13718820:doRead,[])
}
Add(Edit,3692680,553,98)
{
Left=220
Top=105
Width=140
Text="hex"
link(onChange,14902429:doConvert,[])
}
Add(Edit,5084047,497,98)
{
Left=220
Top=85
Width=140
Text="wow.exe"
}
Add(Edit,10440774,686,98)
{
Left=220
Top=125
Width=140
Text="data"
}
Add(Label,4854125,490,49)
{
Left=165
Top=90
Width=54
Height=17
Caption="ProcName"
}
Add(Label,13901793,637,49)
{
Left=185
Top=110
Width=32
Height=17
Caption="Offset"
}
Add(Label,11051949,686,49)
{
Left=190
Top=130
Width=27
Height=17
Caption="Data"
}
Add(Button,2875114,539,343)
{
Left=365
Top=85
Caption="Open"
link(onClick,9429329:doEvent1,[])
}
Add(Label,16697285,630,350)
{
Left=430
Top=90
Width=12
Height=17
Caption="id"
link(Text,13718820:ProcessID,[])
}
Add(Hub,9429329,581,343)
{
link(onEvent1,13718820:doOpenProcess,[(613,349)(613,265)])
link(onEvent2,16697285:doText,[])
}
Add(Convertor,14902429,595,98)
{
Mode=5
link(onResult,10094339:doText,[])
}
Add(Edit,10094339,637,98)
{
Left=375
Top=105
Width=140
Text="int"
}
Add(Label,10439493,595,49)
{
Left=365
Top=110
Width=10
Height=17
Caption="="
}
Add(Memo,10562017,322,224)
{
Left=175
Top=230
Width=435
Height=135
Strings=#29:+++++++++++++++++++++++++++++|29:0x00A37F0C - WallClimb Offset|26:1059360187 - WallClimb OFF|25:1059360188 - WallClimb ON|29:+++++++++++++++++++++++++++++|30:0x0075E439 - Waterwalk Offset |26:3481343092 - Waterwalk OFF|25:3481343093 - Waterwalk ON|29:+++++++++++++++++++++++++++++|
}

карма: 6

1
Голосовали:Master4eG
Ответов: 321
Рейтинг: 10
#26: 2015-09-03 15:20:03 ЛС | профиль | цитата
Все. Сдаюсь...
Сейчас последняя попытка... Скрин сделаю.
------------ Дoбавленo в 15.20:
Вроде все возможные варианты.

(по адресу - 10714892) надо записать 1059360188

Так он вроде как не может записать в этот адрес ничего
карма: 1

0
Ответов: 2059
Рейтинг: 132
#27: 2015-09-03 16:13:52 ЛС | профиль | цитата
Так он вроде как не может записать в этот адрес ничего

Тык ребята не пальцем деланные. (может ребята объявили этот адрес как константу, или ещё как следят, чтобы не было повода канделябрами бить шучу )?
У меня младший сын (28) иногда играет и внук (от старшего) режется почти постоянно. (И ты будешь их обманывать???)
Надо бы трассернуть по конкретным адресам..., но кто меня пустит за свой комп?
P.S.

Если бы сразу 3481343092,3481343093 и
он вроде как не может записать в этот адрес

было бы гараздей.
P.S.
Вроде все возможные варианты.

О как! (Я про цифры).
Мир сложнее, чем модель его в мозгу.
P.S.
Но что то магическое есть в том что адреса отличаются на 1.
Может смещение по записи-массиву в пределах 255?
Надо asm-код смотреть, так только гадать остаётся.

карма: 6

0
Ответов: 1841
Рейтинг: 369
#28: 2015-09-03 21:26:55 ЛС | профиль | цитата
Master4eG писал(а):
Так он вроде как не может записать в этот адрес ничего

Так не может записать или падает целевое приложение при попытке записать?
Вообще, для таких задач сначала получаются все необходимые права в системе и на участок памяти, с которым наш редактор будет работать.
Например, как я у себя реализовал в моём тулзе по работе с памятью процессов:
1) При запуске приложения, получаются привилегии отладчика: для Delphi
2) Перед чтением/записью значений по адресу, требуется изменить атрибуты защиты указанного региона виртуального адресного пространства:
  (псевдокод:)  

oldprotect: dword;
Value: Integer;
Address: Integer;
hprocess: thandle;

VirtualProtectEx(hprocess, pointer(address), 4, PAGE_EXECUTE_READWRITE, @oldprotect);
WriteProcessMemory(hprocess, pointer(Address), @Value, 4, Write);
VirtualProtectEx(hprocess, pointer(address), 4, oldprotect, @oldprotect);
------------ Дoбавленo в 20.52:
Если CE может писать, значит и приложение обладающее привилегиями отладчика и доступом на запись/чтения региона виртуальной памяти может писать.
CE не использует драйвер для изменения памяти целевого приложения, лишь для отладки.
------------ Дoбавленo в 21.24:
В общем, немного поправил элемент и добавил получение привилегий и использование VirtualProtectEx перед и после работы с памятью процесса.

------------ Дoбавленo в 21.26:
И не забывай запускать приложение от имени администратора.
карма: 1
1
файлы: 1procmemory_0.2.zip [3.3KB] [199]
Голосовали:flint2
Ответов: 321
Рейтинг: 10
#29: 2015-09-04 07:00:31 ЛС | профиль | цитата
[offtop]Помню что вылетало, но видимо при записи другой функции чита, а этот не записывает, и причем это не единичный случай, например функция изменения гравитации в игре.
Имеется зарубежный чит для wow, так вот там есть эта функция, но при запуске самой игры, когда чит находит саму игру, он видимо понимает, что это wow v 3.3.5 и просто напросто прячем ползунок изменения гравитации. Это я к тому, что реализовать запись данных в ячейку гравитации наверное он не смог, как минимум для игры с версией клиента 3.3.5, в старых мб и работало.[/offtop]
CriDos у меня не записывает... Обидно, что столько время на "анализ" потрачено и безрезультатно...
Может это функция встроенного серверного античита блокирует запись ?! Так называемый Warden.
Он по интервалу времени читает адрес допустим скорости персонажа и если значение скорости превышает 7 единиц в float (стандартная скорость бега), то дает автоматически бан на 30 дней.
карма: 1

0
Ответов: 2059
Рейтинг: 132
#30: 2015-09-04 07:52:16 ЛС | профиль | цитата
Master4eG
Хорошая мысля приходит опосля.
Я не подумал, что это сетевая игра и все параметры персонажа хранятся на сервере.
По этому не достаточно поменять параметры у клиента. Нужна команда на принятия этих изменений сервером.
Наверняка это так. Во всяком случае, я-бы делал именно так.



карма: 6

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)