Перейти к содержанию

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

Отличная статья! Только есть одно но! Она на английском. Пока...Я сейчас перевожу ее. Но думаю это будет не скоро. Поэтому если кто хочет и понимает может пока на англ. почитать. Может кому понадобиться...

Сохранить позицию/Отменить позицию (Телепорт)

Save/Restore(Teleport) - 08-19-2006, 03:15 AM

________________________________________

Subject: Save Restore (Teleport)

Game: Bloodrayne 2 Demo

Tools Needed:

Memory Searcher(i used cheat engine,tsearch has problems with this game)

Debugger( I used softice but you can use whatever you want)

************************************************** ********

................Introduction

Step 1..........Find Health and getting our structure

Step 2..........Finding our players coordinates

Step 3..........Code Injection

Step 4..........Code into the trainer

************************************************** ********

Introduction

------------

Basically we are going to do a save restore option for bloodrayne2 Demo. What this option does is you can press one key to save a position in the game then another key will teleport you back to that same position. You should have good training skills if you plan on doing this tutorial(searching,debugging,ect). Ill try and go into as much detail as i can, but if you follow all the steps you should have no problem doing this option correctly. On with the tut.....

************************************************** ********

Step 1: Find Health and getting our structure

---------------------------------------------

Ok I am sure you know how to search for your health. If you don't get out of here :-D. Ok now you found your health address. What we want to do is get all of our pointers because we are going to use one of them to do our injection. So...

CTRL+D into softice...

bpm ADDRESS press enter...

Press F5 and softice will break...

Write down the address it breaks at...

Keep hitting F5 and write down all the addresses, and pointers you break at until they start repeating...

This is what I ended up with

5BE285 : PUSH [EBX+39C4]

5BE2B5 :

5BE2D1 :

5BF30A :

There are a lot more but we really only need on of them. Next you want to go threw and set a execution breakpoint on them one at a time and watch the structure inside the pointer and make sure it never changes so you know that pointer is only reading your health, so....

bpx 5BE285 press enter....

F5 and softice will break...

Keep hitting F5 and watch the structure inside 5BE285 witch is EBX(up in the register window), and if it never changes its just for us (witch it don't). This is the address we will be using for our teleport option...

5BE285 : PUSH [EBX+39C4]

Ok you should know how most games work...Your players,weapons,items,ect have there own structures. So inside your player structure will have everything containing your character. So now to get the coordinates.

There are a lot of ways to finding these. A lot of people will take the long approach(using a mem searcher,blah), witch doesn't always work. The quick and easy way is to use the players structure, because they are usually

stored at the top of the structure(if not there there down in the structure somewhere). Health is stored in the player structure. This pointer PUSH [EBX+39C4], EBX is the beginning of the player structure, so whenever

the game needs to get something for your player they just add a value to EBX, for instance your health is [PlayerStructure+39C4]. Your power might be [PlayerStructure+34] or whatever. That's all I am going to explain

on that matter I hope you understand.

Ok now to get the coordinates... We need to set a execution breakpoint on our health pointer and dump our structure, so....

bpx 5BE285 press enter...

Hit F5 and softice will break...

d EBX press enter...

Now up in the dump window the first address will be our player structure. Now all you want to do here is watch the bytes. You are watching for 4 bytes in a row that only change when your player has moved. So I go into

softice and watch a line at the top..I remember what the bytes looked like or you can write them down..then move your character a few steps go back into softice and look for 4 bytes that have changed..your coordinates will

be store in 4 bytes and there are 3 of them x,y,z.. And they will be back to back..

So your data window looks like this

600001 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

600002 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

The coordinates will be stored like this

600001 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

600002 00 00 11 11 11 11 22 22 22 22 33 33 33 33 00 00

1 = first coordinate

2 = second coordinate

3 = third coordinate

So I did this step and found 3 dwords in a row where 2 of them changed only when I moved(height coordinate don't change unless you change height). So i took the first dword i found and put it in a memory searcher so i can test. I wrote down the value then i moved my character, went back to the memory searcher and put back the first value i wrote down and sure enough i teleported back to that location.

So the next step is to find out where it is stored in our structure. All you do is this...

First Coordinate Address - PlayerStructure address = how many bytes away

so I ended up with (34) for the first coordinate and the other 2 are 4 bytes away so..

[PlayerStructure+34] = First Coordinate

[PlayerStructure+38] = Second Coordinate

[PlayerStructure+3C] = Third Coordinate

Great now we have our coordinates and there location...

Note!! do not skip this step unless you fully understand it...read it over until you do..

************************************************** ********

Step 3: Code Injection

----------------------

What you will need...

1. Code Cave

2. 2 Empty address for setting 2 flags

3. 3 Empty address for storing away our 3 coordinates (I just make my 3 addresses 4 bytes away).

Ok so first thing is find you a big code cave cause its kind of a big injection. We are going to use that first health pointer to do our teleport injection. We can do that because the pointer holds our player structure. You don't always have to do your injection wherever you break at in softice :-D. Now I am going to show my full injection then I will explain... So here goes..

5BE285: JMP CODE CAVE---------- ORIGINAL INSTRUCTION REPLACED WITH A JUMP TO OUR CAVE

NOP | BALANCE OUT THE BYTES

|

|

CAVE: PUSH [EBX+39C4]-------- ORIGINAL INSTRUCTION

PUSHAD SAVE REGISTERS

CMP [FLAG1],1 TEST IF OUR SAVE KEY WAS PRESSED

JNE SHORT-------------- IF KEY WASNT PRESSED JUMP TO RESTORE ELSE SKIP JUMP

MOV [FLAG1],0 | MOVE ZERO BACK INTO THE FLAG SO FUNCTION DOESNT REPEAT

MOV ECX,3 | MOVE COUNTER INTO ECX

LEA EDI,[sTATIC1] | LOAD DESTINATION ADDRESS INTO EDI

LEA ESI,[EBX+34] | LOAD FIRST CORDINATE ADDRESS INTO ESI

REP MOVSD | COPY SOURCE INTO DESTINATION UNTIL ECX=0

|

CMP [FLAG2],1---------- TEST IF RESTORE KEY WAS PRESSED

JNE TO END--------------- IF NOT THEN JUMP TO END

MOV [FLAG2],0 | MOVE ZERO BACK INTO FLAG SO FUNCTION DONT KEEP REPEATING

MOV ECX,3 |

LEA EDI,[EBX+34] | LOAD DESTINATION ADDRESS INTO EDI

LEA ESI,[sTATIC1] | LOAD FIRST STORED CORD ADDRESS INTO ESI

REP MOVSD | COPY SOURE INTO DESTINATION UNTIL ECX=0

|

END:---------------------

POPAD RESTORE REGISTERS

JMP BACK TO GAME LOOP JUMP BACK TO GAME LOOP

Pretty simple eh? :-D

************************************************** ********

Step 4: Code into the trainer

-----------------------------

Ok all you need to do is,

For the Save key in your trainer, just inject all that code(make sure you inject your cave before your jump) and inject the value of 1 into the first flag address

For the Restore key in your trainer, inject all that code, and inject the value

of 1 into the second flag address.

So when you press the save hotkey it will put 1 into that flag making it true and put your coordinates away into there static address. And when you press the restore key it will take the coordinates in your static addresses and put then in your actual coordinates addresses making you teleport to that location.

Not to tuff of an option, it may be at first but with a few tries you should have it no problem..

Well that's the end ... Hope this helps a bit...

Happy Training…

  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

Хорошая статья по игре Bloodrayne 2 Demo.

Но можно сделать ещё лучше - свою статью на основе этой с некоторыми скринами ключевых моментов на CheatEngine на той же самой игре Bloodrayne 2 Demo. Конечно это тебе решать :)

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

  • 2 месяца спустя...

Считаю эти 2 опции (save position/load position) бесполезными в трейнере, но решил еще немного прокачаться. Инфы на эту тему мало, читал статью Psych'a, но не очень понял, а других статей нет/не нашел.

Буду рад любой помощи.

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

Хм, верстка статьи доставляет, еле понял что, да как.

Испробовал на JumpMe.

И вот мой скрипт


aobscan(_faddress,xxxxa1xxxxxxxx8bxxxxxxxxxxxxxxxxxxe8xxxxxxxx83xxxxffxxxxxxxxxx81)
alloc(_newmem,2048)
label(_returnhere)
label(_originalcode)
label(_flag1)
registersymbol(_flag1)
registersymbol(_flag2)
label(_flag2)
label(_rest)
label(_static)
label(_exit)
_newmem:

_originalcode:
push [eax]
pushad
cmp [_flag1],1
jne short _rest
mov [_flag1],0
mov ecx,3
lea edi,[_static]
lea esi,[eax]
rep movsd
_rest:
cmp [_flag2],1
jne short _exit
mov [_flag2],0
mov ecx,3
lea edi,[eax]
lea esi,[_static]
rep movsd
_exit:
mov eax,[jtrainme.exe+f044]
popad
jmp _returnhere

_flag1:
dd 0

_flag2:
dd 0

_static:
dd 0

_faddress: // 004016F7 = Jtrainme.exe+16F7
jmp _newmem
nop
nop
_returnhere:

[DISABLE]
aobscan(_faddress,90908bxxxxxxxxxxxxxxxxxxe8xxxxxxxx83xxxxffxxxxxxxxxx81)

_faddress-5:
push [eax]
mov eax,[jtrainme.exe+f044]

dealloc(_newmem)
unregistersymbol(_flag1)
unregistersymbol(_flag2)
//Alt: db FF 30 A1 44 F0 40 00
[ENABLE]

Есть вопросы:

Почему-то флаг1 у меня отвечает за сохранение позиции, а флаг2 за возврат, а в статье наоборот.

Поиск инструкция, отвечающей за координаты, через структуру здоровья (или чего-либо еще) - гадание на кофейной гуще.

Значит нужно будет искать в игре координаты X,Z,Y (т.е. ходить влево/вправо, вперед/назад, прыгать) - это тоже гемор и не факт, что за X, Z, Y будет отвечать одна и таже инструкция, как в статье. Или всегда одна отвечает, как в статье ?.

Как обычно ищут ту самою инструкцию, отвечающую за координаты X, Z, Y ?

Вопросы мои тупы, т.к. эта тема для меня нова.

  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

Я думаю ты сам сможешь ответить на все вопросы   :ninja:

Я бы сделал так:

1. Находим адрес координат Z любым удобным способом.

2. Находим инструкцию работающую с этой  Z координатой.

Если инструкция1 работает со всеми координатами, то это на руку.

Если нет, то координата Z стоит, обычно, рядом с X, Y и не составит особого труда написать скрипт.

3. Создаём такой скрипт1 - инъекция "Сохранение координат в зарегистрированную метку1 из инструкции1 с последующей отменой этой иньекции". Только не уничтожай метку1.

5. Создаём скрипт2 - иньекция "Восстановление координат из метки1 с последующей отменой инъекции". Только не уничтожай метку1.

6. На первый и второй скрипты вешаем хот-кеи.

Если сделать так как я написал, то это избавит от лишних флагов  :)

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

Координаты (на консолях очень часто) обычно идут как +4h друг за другом. То есть если к адресу X прибавить +4h - получим Y или Z. Бывают также смещения 2h, A6h, 10h, 100h, 80h и т.д.

В статье выше тоже 4h.

Изменено пользователем M4K
Ссылка на комментарий
Поделиться на другие сайты

Я думаю ты сам сможешь ответить на все вопросы   :ninja:

Я бы сделал так:

1. Находим адрес координат Z любым удобным способом.

2. Находим инструкцию работающую с этой  Z координатой.

Если инструкция1 работает со всеми координатами, то это на руку.

Если нет, то координата Z стоит, обычно, рядом с X, Y и не составит особого труда написать скрипт.

3. Создаём такой скрипт1 - инъекция "Сохранение координат в зарегистрированную метку1 из инструкции1 с последующей отменой этой иньекции". Только не уничтожай метку1.

5. Создаём скрипт2 - иньекция "Восстановление координат из метки1 с последующей отменой инъекции". Только не уничтожай метку1.

6. На первый и второй скрипты вешаем хот-кеи.

Если сделать так как я написал, то это избавит от лишних флагов  :)

пункты 3,5,6 это и ежу понятно, а вот как искать Z коорлинату...

В приведенной статье автор искал инструкцию, отвечающую за здоровье и уже в структуре игрока нашел координаты, причем они у него были в самом начале структуры. Далее он делал телепорт через иструкцию здоровья, а не искал инструкцию, отвечающую за координаты (а если есть только одна инструкция, отвечающая за здоровье ? хотя, можно использовать дополнительные флаги и условия. А если еще и указатели придется использовать, то получитсья не очень быстрый код).

Взял, для примера, Singularity (т.к. распространенный движек U3). Сделал как по статье.. координаты не нашел. Начал искать путем неизвестное, шаг вперед - увеличилось, шаг назад - уменьшилось. Не нашел координату...

Вообщем, сейчас основная проблема заключается в правильном поиске координат.

Координаты (на консолях очень часто) обычно идут как +4h друг за другом. То есть если к адресу X прибавить +4h - получим Y или Z. Бывают также смещения 2h, A6h, 10h, 100h, 80h и т.д.

В статье выше тоже 4h.

спасибо за полезную информацию.

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

Z- координату найти проще всего если подниматься / опускаться в игровом мире на каких-то возвышениях, лестницах и т.п. Обычно координата имеет 4-байта с точкой, а может быть и 8 байт с точкой. Ищу всегда через MHS в блоке памяти в котором находится здоровье героя или структура героя.

Инъекцию отладочного кода можно сделать в любую часто срабатываемую инструкцию. Если тебя очень беспокоит производительность, то надо выбирать варианты инъекции и тестировать, тестировать...

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

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

мучился, мучился, но все же сделал для сингулярити телепорт ;P


[ENABLE]
aobscan(_faddressX,xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8bxxxxxxxxxx83xxxxxxxx8dxxxxxxxxxx8bxx83xxxxxx8dxxxxxxxx8bxx83xxxxxxxxxxd9)
aobscan(_faddressY,xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8bxxxxxxxxxx83xxxxxxxx8dxxxxxxxxxx8bxx83xxxxxx8dxxxxxxxx8bxx83xxxxxxxxxxd9)
aobscan(_faddressZ,xxxxxxxxxxxxxxxxxx8bxxxxxxxxxx83xxxxxxxx8dxxxxxxxxxx8bxx83xxxxxx8dxxxxxxxx8bxx83xxxxxxxxxxd9)
alloc(_newmemX,1024)
alloc(_newmemY,1024)
alloc(_newmemZ,1024)
label(_returnhereX)
label(_returnhereY)
label(_returnhereZ)
label(_originalcodeX)
label(_originalcodeY)
label(_originalcodeZ)
label(_restX)
label(_restY)
label(_restZ)
label(_X)
label(_Y)
label(_Z)
label(_save)
label(_teleport)
registersymbol(_save)
registersymbol(_teleport)

//X
_newmemX:
fld dword ptr [esi+54]
pushad
cmp [_save],1
jne short _restX
mov [_save],0
mov ecx,3
lea edi,[_X]
lea esi,[esi+54]
rep movsd
_restX:
cmp [_teleport],1
jne short _originalcodeX
mov [_teleport],0
mov ecx,3
lea edi,[esi+54]
lea esi,[_X]
rep movsd
_originalcodeX:
popad
fstp dword ptr [esi+00000dd0]
jmp _returnhereX

//Y
_newmemY:
fld dword ptr [esi+58]
pushad
cmp [_save],1
jne short _restY
mov [_save],0
mov ecx,3
lea edi,[_Y]
lea esi,[esi+58]
rep movsd
_restY:
cmp [_teleport],1
jne short _originalcodeY
mov [_teleport],0
mov ecx,3
lea edi,[esi+58]
lea esi,[_Y]
rep movsd
_originalcodeY:
popad
fstp dword ptr [esi+00000dd4]
jmp _returnhereY

//Z
_newmemZ:
fld dword ptr [esi+5c]
pushad
cmp [_save],1
jne short _restZ
mov [_save],0
mov ecx,3
lea edi,[_Z]
lea esi,[esi+5c]
rep movsd
_restZ:
cmp [_teleport],1
jne short _originalcodeZ
mov [_teleport],0
mov ecx,3
lea edi,[esi+5c]
lea esi,[_Z]
rep movsd
_originalcodeZ:
fstp dword ptr [esi+00000dd8]
popad
jmp _returnhereZ

_save:
dd 0

_teleport:
dd 0

_X:
dd 0

_Y:
dd 0

_Z:
dd 0

//X
_faddressX:
jmp _newmemX
nop
nop
nop
nop
_returnhereX:

//Y
_faddressY:
jmp _newmemY
nop
nop
nop
nop
_returnhereY:

//Z
_faddressZ:
jmp _newmemZ
nop
nop
nop
nop
_returnhereZ:

[DISABLE]
aobscan(_faddressX,90909090xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8bxxxxxxxxxx83xxxxxxxx8dxxxxxxxxxx8bxx83xxxxxx8dxxxxxxxx8bxx83xxxxxxxxxxd9)
aobscan(_faddressY,90909090xxxxxxxxxxxxxxxxxx8bxxxxxxxxxx83xxxxxxxx8dxxxxxxxxxx8bxx83xxxxxx8dxxxxxxxx8bxx83xxxxxxxxxxd9)
aobscan(_faddressZ,909090908bxxxxxxxxxx83xxxxxxxx8dxxxxxxxxxx8bxx83xxxxxx8dxxxxxxxx8bxx83xxxxxxxxxxd9)
//X
_faddressX-5:
fld dword ptr [esi+54]
fstp dword ptr [esi+00000dd0]

//Y
_faddressY-5:
fld dword ptr [esi+58]
fstp dword ptr [esi+00000dd4]

//Z
_faddressZ-5:
fld dword ptr [esi+5c]
fstp dword ptr [esi+00000dd8]

dealloc(_newmemX)
dealloc(_newmemY)
dealloc(_newmemZ)
unregistersymbol(_save)
unregistersymbol(_teleport)

Осталось оттачить поиск кординат и будет норм.

  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

Я думаю с телепортом если не всё стало ясно, то почти всё.

Покрайне мере технология выяснена.

SER[G]ANT+5 к прокачке за труды исследования телепорта (каждый уровень будет доставаться всё труднее и труднее) Подобные исследования я очень приветствую.

live_4_ever +2 (за статью о телепорте, за то что интересуешься темой)

M4K +6 (за выкристаллизованный опыт по расположению данных в структурах, за отличное умение пользоватья сканером памяти (я забыл тебе накинуть очков))

Чтобы стать Продвинутым, ты должен показать умение писать скрипты на CE.  :)

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

Есть еще вопрос, косвенно относящийся к данной теме.

Нужна подсказка о создании, так называемый опции, "Super Jump".

Знаю что нужно искать координату Z, она найденна. Дальше что, искать "значение гравитации" (сразу вопрос "как ?") ? или же нужно искать максимальную высоту прыжка ? Опять же, лазение по структурам - гадание на гуще.

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

ANT' date='25 Июль 2010 - 06:43' timestamp='1280018608' post='1197']

Считаю эти 2 опции (save position/load position) бесполезными в трейнере.

Ну ты сказанул!

Есть такие игры, где данная опция - спасение!

Например, в Legacy of Kain- Defiance, без неё совсем туго:(.

Я и игру бросил почти вначале, т.к. достало заново грузиться. Там сейвов вообще нет, а управление - пипец.

А трейнеров с такой фичей - не додумались сделать, дармоеды.

Давай, дерзай!

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

  • 2 недели спустя...
ANT' date='26 Июль 2010 - 15:50' timestamp='1280134248' post='1209']

Нужна подсказка о создании, так называемый опции, "Super Jump".

И из этой же области - как сделать спидхак только для игрока? Думаю алгоритмы создания супер джампа и суперскорости должны быть схожи, но я пока тоже не разобрался :(

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

  • 4 недели спустя...

А что именно интересного в этой статье? Координаты игрока, как и другие значения в игре — можно изменять. Советую просто начать с какой-нибудь простой игры, чтобы понять и разобрать, как следует, этот телепорт. Я делал в нескольких трейнерах подобную опцию — с сохранением координат, с последующим телепортом в сохраненную точку.

Сейчас, использовать софтайс, очень уж олдскульно выглядит :)

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

  • 3 месяца спустя...

И из этой же области - как сделать спидхак только для игрока? Думаю алгоритмы создания супер джампа и суперскорости должны быть схожи, но я пока тоже не разобрался :(

"Hacking Speed and Size in Lost Planet 2 1.0 DX9" тутор хоть и объясняет как это сделать в данной игре, но по большей части он бесполезен, т.к. все основано на удаче и не более. Но другого тутора по данной теме нет.

http://www.multiupload.com/4FV1I36OO2

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

  • 1 месяц спустя...

Я думаю ты сам сможешь ответить на все вопросы ninja.gif

Я бы сделал так:

1. Находим адрес координат Z любым удобным способом.

2. Находим инструкцию работающую с этой Z координатой.

Если инструкция1 работает со всеми координатами, то это на руку.

Если нет, то координата Z стоит, обычно, рядом с X, Y и не составит особого труда написать скрипт.

3. Создаём такой скрипт1 - инъекция "Сохранение координат в зарегистрированную метку1 из инструкции1 с последующей отменой этой иньекции". Только не уничтожай метку1.

5. Создаём скрипт2 - иньекция "Восстановление координат из метки1 с последующей отменой инъекции". Только не уничтожай метку1.

6. На первый и второй скрипты вешаем хот-кеи.

Если сделать так как я написал, то это избавит от лишних флагов smile.gif

Хех. Я сам лично так и делаю, спасибо за подсказку!!

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

  • 2 месяца спустя...

Уважаемый live_4_ever я читал эту статью и даже ее переводил. Но там толком и не сказано что да как. Постараюсь в скором времени опубликовать здесь этот перевод. Может кому-то из вас эта статья поможет.

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

  • 4 месяца спустя...

Вот такое дело у меня. Нашёл три инструкции.

1 Стою на мосту, заморозил адрес из инстр. при падении меня подкидывает вверх(разбиться могу из-за заморозки плохой) я думаю, что это Z, я нашёл её лазая по лестнице.

2 Вторая возвращает меня на место, когда я делаю шаг либо влево либо вправо. Я думаю это X

3 Когда я присидаю меня чуть чуть подкидывает вверх, (это точно не Z, потому что стоя/сидя меня бы подкидывало в небо) наверное это Y.

Если я всё нашёл правильно, то помогите мне сделать отдельно скрипт сохраняющий координату и восстанавливающий?

Z :mov [esi+0000029C],ecx

X :mov [ebx],eax

Y :mov [ebx+08],edx

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

Izmalkoff, вот когда свой код приведёшь не меньше на 70% написанный для телепорта, тогда тебе скорее всего помогут подсказками.

А так с "голыми" инструкциями (да ещё без оригинального кода под инструкциями, названия игры)... тебе можно советовать искать примеры телепорта в Интернете.

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

Вот мои предположения (Срипт SERGANTа)

[ENABLE]
alloc(_newmemX,1024)
alloc(_newmemY,1024)
alloc(_newmemZ,1024)
label(_returnhereX)
label(_returnhereY)
label(_returnhereZ)
label(_originalcodeX)
label(_originalcodeY)
label(_originalcodeZ)
label(_restX)
label(_restY)
label(_restZ)
label(_X)
label(_Y)
label(_Z)
label(_save)
label(_teleport)
registersymbol(_save)
registersymbol(_teleport)


//X
_newmemX:
mov [ebx],eax
pushad
cmp [_save],1
jne short _restX
mov [_save],0
mov ecx,3
lea edi,[_X]
lea esi,[ebx]
rep movsd
_restX:
cmp [_teleport],1
jne short _originalcodeX
mov [_teleport],0
mov ecx,3
lea esi,[ebx]
lea esi,[_X]
rep movsd
_originalcodeX:
popad
mov [ebx],eax
jmp _returnhereX

//Y
_newmemY:
mov [ebx+08],edx
pushad
cmp [_save],1
jne short _restY
mov [_save],0
mov ecx,3
lea edi,[_Y]
lea esi,[ebx+08]
rep movsd
_restY:
cmp [_teleport],1
jne short _originalcodeY
mov [_teleport],0
mov ecx,3
lea esi,[ebx+08]
lea esi,[_Y]
rep movsd
_originalcodeY:
popad
mov [ebx+08],edx
jmp _returnhereY

//Z
_newmemZ:
mov [esi+0000029C],ecx
pushad
cmp [_save],1
jne short _restZ
mov [_save],0
mov ecx,3
lea edi,[_Z]
lea esi,[esi+0000029C]
rep movsd
_restZ:
cmp [_teleport],1
jne short _originalcodeZ
mov [_teleport],0
mov ecx,3
lea edi,[esi+0000029C]
lea esi,[_Z]
rep movsd
_originalcodeZ:
mov [esi+0000029C],ecx
popad
jmp _returnhereZ

_save:
dd 0

_teleport:
dd 0

_X:
dd 0

_Y:
dd 0

_Z:
dd 0

//X
jmp _newmemX
nop
nop
nop
nop
_returnhereX:

//Y
jmp _newmemY
nop
nop
nop
nop
_returnhereY:

//Z
jmp _newmemZ
nop
nop
nop
nop
_returnhereZ:

Ни результата ни вылета

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

×
×
  • Создать...

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

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