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

Basic encryptions, debugging, backtracing and some info on the stack


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

Ссылка на источник

Гугл-Переводчик

Моё объяснение статьи(!)

 

Уточнение. Зашифрованный адрес количества сердец найти не получилось способом Geri. Есть другой способ. Смотрим на инструкции

0044DB20 - 8B 81 04010000 - mov eax,[ecx+00000104]
0044DB26 - 33 81 80000000 - xor eax,[ecx+00000080]

Идем в дизассемблер на инструкцию 0044DB20. Далее просмотреть проскакивающие адреса в квадратных скобках умерев персом и один из них будет шифрованным значением здоровья. Подробнее на скринах

post-3-0-56050800-1421454359_thumb.pngpost-3-0-24978000-1421454366_thumb.pngpost-3-0-48793400-1421454373_thumb.pngpost-3-0-91092100-1421454377_thumb.pngpost-3-0-91003500-1421454382_thumb.pngpost-3-0-57432500-1421454387_thumb.png

 

Статья Geri еще написана была в 2011 году. О том как можно применять трейссер и пошаговую отладку. Есть даже видео ролик.

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

 

Usually I don't write any tutorial where the target process is not freely available, but recently I found a game which is small enough, somewhat popular amongst kids and most importantly, it is a fine example to show basic encryptions.

This tutorial will cover info about basic encryptions, checking values in the stack and backtracing some functions in the program.

I will use Cheat Engine 6.0 so get the latest version from here:
http://www.cheatengine.org

The game that I will use is Chicken Invaders 4, but this tutorial contains generic information that can be used in other programs too.

Alright, the first step is to aquire the target process, Chicken Invaders 4 v4.00. This is the program and the exact version that I will use for the demonstration. If You have installed the game, play with it a bit to get familiar what kind of game is this. A simple space shooter against evil chickens. Ridiculously stupid concept but the game itself (regarding the programming, graphics and music) is not a bad job. Now change the game to run in window mode (not in fullscreen).


Mission 1: Finding some values


In this whole tutorial, we will try to change the amount of lives. If You have tried to search for it, You have probably failed miserably. The reason of this failure: the game is using encrypted values to store the lives, points, food, missiles and keys. What You need to do is set the value type to Byte and search for changed/unchanged values when You die.

You will find some high values which are not making any sense at all. Check out what is accessing to the address that You have found and You will see these codes:

0044DB20 - 8B 81 04010000 - mov eax,[ecx+00000104]
0044DB26 - 33 81 80000000 - xor eax,[ecx+00000080]

0044DB5D - 89 B3 80000000 - mov [ebx+00000080],esi
0044DB63 - 33 74 24 10 - xor esi,[esp+10]
0044DB67 - 5F - pop edi
0044DB68 - 89 B3 04010000 - mov [ebx+00000104],esi

NOTE: You can search for food or points too if it is easier for You. You will find these same codes.


Mission 2: What is the encryption


Ok You should have found the codes that I have mentioned and if You look at it, You will find the XOR instruction in every cases. XOR is used in encryptions very frequently. In fact, most encryptions in the games are using a simple XOR instruction to mess up the value and confuse beginners. It is very easy to understand the process if You know what is this instruction. Let me quote from another author a bit:

The XOR instruction connects two values using logical exclusive OR (remember OR uses

inclusive OR).

To understand XOR better, consider those two binary values:

1001010110
0101001101

If you OR them, the result is 1100011011

When two bits on top of each other are equal, the resulting bit is 0. Else the resulting

bit is 1. You can use calc.exe to calculate XOR.

For more information, use Google. Teaching Boole-algebra is not part of this tutorial.
If You have understood what is the purpose of this instruction, You realize that the value You are searching for is combined together from 2 values. By looking at the codes, it is obvious what are these values.

0044DB20 - 8B 81 04010000 - mov eax,[ecx+00000104]
0044DB26 - 33 81 80000000 - xor eax,[ecx+00000080]

One of them is stored on [ecx+0104] and the other value is stored on [ecx+0080]. Using the debugger to find out what addresses accessed by these codes, You can find the key values for the lives. Very good, now set both values to 0, and You should have 0 lives. Awesome, now the only problem is that You have 0 lives on the screen but in reality, You have the same amount of lives as originally. Which means that all You have found and changed was the displayed value and You did not change the real amount of lives.



Mission 3: Checking the encryption codes


I bet this situation is familiar if You have tried to cheat in some games. The value is encrypted and/or You didn't find the real value and You have achieved changing the displayed value only. No problem, this will be enough to create working cheats. First, we need to look at the codes:

0044DB26 - 33 81 80000000 - xor eax,[ecx+00000080]

This code is running frequently, READING a few values. Obviously, it is not reading the number of lives only, but some other stuff too.

0044DB5D - 89 B3 80000000 - mov [ebx+00000080],esi
0044DB63 - 33 74 24 10 - xor esi,[esp+10]
0044DB67 - 5F - pop edi
0044DB68 - 89 B3 04010000 - mov [ebx+00000104],esi

This code however is used only when a value is changing. This is the code which is WRITING to our value. Let us take a look at it. We can see that ESI register is used to hold some important information and hey, it is using xor on some address, [esp+10]. Just out of curiousity, let us take a look what is stored on [ESP+10].

Start a new game, and You will have 5 lives.
Now You have 2 choices to check this value.
1. Right-click on the code and use "Break and trace".
2. Press F5 to set a manual breakpoint.

If You have done it, go back in the game and die. Don't kill anything or pick up anything, just die. If You have used Break and trace, You can see these important information:

ESP: 0012EB10
xor esi,[esp+10]
0012EB20 = (dword)00000004(4)

If You have set a manual breakpoint, the game is now freezed and You can see the value of ESP, 0012EB10. ESP+10 is 0012EB20 and if You add this address to Your table, You can see that the value on this address is 4. Press F5 again to remove the breakpoint and press F9 to enable the program to run. If You have done this, You can see that the value on Your address is changed immediately.
Very good, we had 5 lives, we have died and ESP+10 shows 4. If You die again, it will show 3. It is clearly holding a DECRYPTED value for our lives.

A picture from the trace window when the code was running:

post-3-0-54725200-1421338982_thumb.jpg

 

 

NOTE: More experienced users will know that we can use conditional breakpoints to work with harder codes, but it is easy to work with this one so we will use this.


Mission 4: The Stack



You can find many info about the stack if You use Google, but for now, I will tell You a few things only which are neccessary to proceed in Your mission. The stack is a temporary storage area and it is very important for some functions. Let me quote from my old tutorial:

The stack is a "storage" where You can put values and load them from it. However You are not able to save and load the values in any order. The last value in the stack that You push in will be the first one that You pop out.

For example lets assume ecx=3, edx=2 and the stack stores the following values.


4
5
6

Now we put an instruction like "push ecx". Then the stack will look like this.

3
4
5
6

Now we also put in edx with "push edx". The stack will look like this.

2
3
4
5
6

Now we want to pop a value from the stack, like "pop ecx".

In this case, the program will pull out the first value from the stack, which is 2,
and put it to ecx. So ecx=2 and the stack look like this.

3
4
5
6

If we give a "pop edx" instruction now, edx will be 3, and the stack will look like

4
5
6

The result: The stack is the same as when we have started, but ecx=2 now, and edx=3, we have changed their values with each other.

Alright, now You know how are values pushed in and pulled out from the stack. It is not a random process, it is working in strict order. The next thing You need to learn about a bit is the stack pointer and how it is used. In my example, I will use a totally unreal sized stack which holds 16 bytes only.

The stack is using a reversed order, which means if a value is deeper in the stack, it means that the address is higher. Here is an example

0012FF00 4 //this address is the bottom of the stack and it holds a value, 4
0012FEFC 2 //this address is the next level in the stack, as You can see the address has been decreased with 4 bytes
-------------------------------------- //after this line, there are yet unused levels of the stack
0012FEF8 x
0012FEF4 x

The stack pointer: The stack pointer is showing the top of the stack, which is in our case the ------------------ line. The stack pointer is the ESP register. In our example 0012FEFC is the top of the stack, and this can be figured out by checking the value of ESP, which is 0012FEFC.
Now let's push something in the stack.
Assume that the next instruction is:
push 8
After this instruction, our mini-stack will look like this:

0012FF00 4 //this address is the bottom of the stack and it holds a value, 4
0012FEFC 2 //this address is the next level in the stack, as You can see the address has been decreased with 4 bytes
0012FEF8 8
-------------------------------------- //after this line, there are yet unused levels of the stack
0012FEF4 x

We have pushed a value in the stack and the top of the stack has been decreased with 4 bytes again. Now ESP = 0012FEF8 and the value on 0012FEF8 is 8.

Let us push another value again, let's say 5.
push 5

0012FF00 4 //this address is the bottom of the stack and it holds a value, 4
0012FEFC 2 //this address is the next level in the stack, as You can see the address has been decreased with 4 bytes
0012FEF8 8
0012FEF4 5
-------------------------------------- //after this line, there are yet unused levels of the stack

Now as You see, the top of the stack has been (again) decreased with 4 bytes. ESP = 0012FEF4 and the value on 0012FEF4 = 5.
So what happens if we need to know the value on 0012FEFC for example? This is very simple, let me add an extra coloumn to our example to show ESP.

0012FF00 4 ESP+0C //this address is the bottom of the stack and it holds a value, 4
0012FEFC 2 ESP+08 //this address is the next level in the stack, as You can see the address has been decreased with 4 bytes
0012FEF8 8 ESP+04
0012FEF4 5 ESP
-------------------------------------- //after this line, there are yet unused levels of the stack

As You can see from the example, the value on 0012FEFC is [ESP+08].

And now finally, let's assume we need the value from the top of the stack and we don't need it after that so it can be removed. We will use this instruction:
pop eax
This instruction will copy 5 to EAX register and the top of the stack will move again.

0012FF00 4 ESP+08 //this address is the bottom of the stack and it holds a value, 4
0012FEFC 2 ESP+04 //this address is the next level in the stack, as You can see the address has been decreased with 4 bytes
0012FEF8 8 ESP
-------------------------------------- //after this line, there are yet unused levels of the stack
0012FEF4 x

I hope this example has clearly shown what is the purpose of the stack pointer (ESP) and how is the stack used to store information. If it is not clear, it may help if You trace any kind of code and examine how is the stack working in that code.


Final Mission: Backtracing


Now back to our original mission and as now You are familiar with the stack, it is time to examine our code again.

xor esi,[esp+10]

If You make a script to change [ESP+10] to 99, You will notice that You will really have 99 lives. And You will also have 99 points, 99 food, and 99 missiles. This is because the code is used to work with other values too, not just with the lives. So what now? We can't use this code to make an unlimited lives cheat.
It should be clear by now that ESP+10 is an address in the stack. This means that the real number of lives are stored somewhere, then it is decrypted, moved into the stack and used by the function that we have found. Our task is to find the code which is moving the value into the stack.
If You have examined the code when the lives were changed, You may have noticed that ESP was always 0012EB10 when our code was running. So when this code:

xor esi,[esp+10]

is used to change the lives, ESP+10 = 0012EB20.
What we need to do is find the code which will copy the number of lives to 0012EB20. Though this is a temporary storage only, I guess You have realized that we could just write a script to change 0012EB20 when this code is running, but we will not do that because it would be lame. We will do it the right way and we will find the code which is putting the value in the stack to see where it is stored.

What we need to do now is a little backtracing. You can see that the Break and trace option is capable of tracing the running code from some point. But how do we go "back in time" to see where did the code came from? Yeah, I see You are thinking "we will just scroll up in the disassembler view", but it is not that simple. You have to learn a bit about functions.

A program is full of functions. The purpose of the function is to execute some task, than return to the point where it was called. In our case, the code we have found is part of a function to encrypt/decrypt values and it is called from many places to do this task. After it is done, it will return to the place where it was called and the program will go on. Of course some tasks are so big that it can be breaked down to smaller tasks. If You think about it this way, You realize that a function can have many sub-functions, those sub-functions can also have sub-functions etc to break down the whole process to small bits and pieces. So how is it working?

You can use a function with the "call" instruction. When call is used, the program will jump to the given location and start executing the function. The function will end with the "ret" instruction. If ret is used, the program will jump back to the same location right after the address where the call was used. Ret will always jump to the location of the last call, so it will work like this:

call 1
do things
call 2
do things
ret (jump right after call 2 in the code)
do things
ret (jump right after call 1 in the code)
do things

So why is this important? Let's assume that our code is working like this.

call 1
do things
put the number of lives in the stack
call 2
do things
call 3
do things
call 4
do things
call 5
do things
xor esi,[esp+10] (our code)
ret
do things
ret
...
ret
...
ret
...
ret
...

We want to find the code "put the number of lives in the stack". For this, we need to find where is "call 1", then trace from there and find the code. We start from a tiny sub-function, and we need to go "backwards". How can we do this? By following the return points. Don't forget, if You know where is the program returning to, You will know where the function was called. And as the ret instructions are AFTER our code, we can trace them and see where the program is jumping, so we will have not just the return points, but the entry point of the functions too.

I hope it is clear so let's start. First, add 0012EB20 to Your table as we will look for an instruction where 0012EB20 is changed to the number of our lives. Then start a game, right click on the "xor esi,[esp+10]" and use Break and trace. All You have to do now is die once. Your trace should be ready. Right-click in the trace window and choose "Expand all".

NOTE: Return addresses are stored in the stack but as CE 6 has a very nice tree view which shows the return points, we don't have to bother too much to find them. This is why the new trace window is one of my favorite options.

You can see our first instruction, "xor esi,[esp+10]". A few instructions later, there is a ret. Let's see the next address after the ret:

00591215 - 8B 0D 9C7C7100 - mov ecx,[00717C9C] : [012560A8]

A picture from the trace:

post-3-0-62070600-1421339028_thumb.jpg

 

 

Now scroll up a line:

00591210 - E8 1BC9EBFF - call 0044DB30
00591215 - 8B 0D 9C7C7100 - mov ecx,[00717C9C] : [012560A8]

So our function was called from here. Let's set a breakpoint on this call. Click on it and press F5. Now loose a life. The program is now stopped. Look at our address in the table, 0012EB20. It is already holding the number of our lives, so it was copied there before this function. We need to go back further. Press F5 on the code again, and press F9 to enable the program to run. Look at our trace and find the ret instruction which will bring us back with one level. As You scroll down, You will see a few sub-functions, only a few lines of codes, but we don't need them, we want to go back with a level so find the place where the tree will go back with a level.

The next code that we will find is this:

00591CF7 - E8 D4F4FFFF - call 005911D0
00591CFC - C3 - ret

Another picture to show the ret for this step:

post-3-0-26203500-1421339068_thumb.jpg

 

 

Set a breakpoint on this call again and die in the game. Ok, the game is stopped. Look at 0012EB20. It has a value which is definitely not the number of remaining lives. This means that the code which will put the value on this address is not executed yet. Now we step in the code very slowly and see what happens with the value on 0012EB20. Press F5 to remove the breakpoint and then press F7. Now You have stepped one line in the code and You are at 005911D0, where the function is starting. Step again and again and again. And after every step, look at 0012EB20 in Your table to see if it was changed.

0012EB20 will change to the number of Your remaining lives right after this code is executed:

0059120D - 50 - push eax

This means that Your lives were stored on eax and were pushed into the stack by this command. Very good. Scroll up a bit to see the whole code:

00591203 - 8B 44 24 24 - mov eax,[esp+24]
00591207 - 8D B5 E0010000 - lea esi,[ebp+000001E0]
0059120D - 50 - push eax

From these few lines, it is clear that eax is copied from [esp+24], from the stack and then it was put at the top of it. Ok, save these codes and press F9 to let that miserable program to run already. We still don't know where is the value stored in the memory, but we have a code which is working with this value and we can change it here. As a final test, put a breakpoint on this code and play the game to see that this code is used only when You loose or get a life. Well I can tell You this function is not used for anything else, so You can use code injection to change EAX or [ESP+24] at this point.

NOTE: Experienced users may consider setting a data breakpoint with Break on Write on address 0012EB20. This way they don't need to use single stepping and the debugger will stop the program right after "push eax" is executed and the value on 0012EB20 is changed.

Here is a video about the final step, backtracing:

 

 

Congrats, You have made Your "Unlimited Lives" cheat for Chicken Invaders 4 and hopefully You have learned new things that will help You to cheat in other games. Of course there are other ways to create this cheat too, but this way I could put many info into one tutorial, using one game only.

Peace!
Geri

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

Ссылка на источник

 

Статья Geri еще написана была в 2011 году. 

 

Спасибо MasterGH, помню что на видео такое уже натыкался, а вот статьи не видел. Дай бог, чтобы Гугл перевёл понятным языком.

Трейссер - одна из опций Се, которую тоже пока не понимаю, но тоже хочу понять.

Xipho, запишете видео и на эту тему, тоже заранее огромное спасибо. 

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

Перевод статьи Гуглом:

Основные шифрование, отладка, обратной трассировки и некоторая информация в стеке


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

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

Я буду использовать Чит Двигатель 6,0 так что получить последнюю версию отсюда:
http://www.cheatengine.org

Игра, которую я буду использовать это Chicken Invaders 4, но этот учебник содержит общую информацию, которая может быть использована в других программах тоже.

Хорошо, первый шаг заключается в aquire целевой процесс, Chicken Invaders 4 v4.00. Это программа и точную версию, что я буду использовать для демонстрации. Если Вы установили игру, играть с ним немного, чтобы ознакомиться какой игре это.Просто космический шутер от злых кур. Смешно глупо понятие, но сама игра (в отношении программирования, графики и музыки) не плохая работа. Теперь измените игру, чтобы запустить в оконном режиме (не в полноэкранном режиме).

 

Миссия 1: Поиск некоторые значения

В этом весь учебник, мы постараемся, чтобы изменить количество жизней. Если Вы пытались искать его, Вы, наверное, с треском провалилась.Причина этой неудачи: игра используют шифрованные значения для хранения жизней, точки, продукты питания, ракеты и ключи. Что Вам нужно сделать, это установить тип значения байт и поиск измененных / неизменным значения, когда ты умрешь.

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

0044DB20 - 8B 81 04010000 - MOV EAX, [ECX + 00000104]
0044DB26 - 33 81 80000000 - XOR EAX, [ECX + 00000080]

0044DB5D - 89 B3 80000000 - MOV [EBX + 00000080], ESI
0044DB63 - 33 74 24 10 - XOR ESI, [ESP + 10]
0044DB67 - 5F - поп-EDI
0044DB68 - 89 B3 04010000 - MOV [EBX + 00000104], ESI

Примечание: Вы можете искать пищу или точек тоже, если это проще для вас. Вы найдете эти же коды.

 

Миссия 2: Что такое шифрование

Ok Вы должны были найти коды, которые я упоминал, и если вы посмотрите на него, вы найдёте инструкцию XOR в каждом случае. XOR используется в шифрования очень часто. В самом деле, большинство шифрование в играх используете простую инструкцию XOR испортить значение и запутать новичков. Это очень легко понять процесс, если вы знаете, что эта инструкция. Позвольте мне процитировать другого автора битной:

     Инструкция XOR соединяет два значения, используя логическое исключающее ИЛИ (помните или использует
      включающее ИЛИ).
      Чтобы понять, XOR лучше, рассмотрим эти два двоичных значений:
 
                                     1001010110
                                     0101001101
 
      Если вы или они, результат 1100011011
 
      Когда два бита на верхней части друг с другом равны, результирующий бит равен 0. Иначе результирующая
      бит 1. Вы можете использовать calc.exe для расчета XOR.
Для получения дополнительной информации, используйте Google. Обучение Буль-алгебру не является частью этого учебника.
Если Вы поняли, что это цель этой инструкции, Вы понимаете, что значение, которое вы ищете, находится объединены с 2 значениями. Глядя на кодах, очевидно, что эти значения.

0044DB20 - 8B 81 04010000 - MOV EAX, [ECX + 00000104]
0044DB26 - 33 81 80000000 - XOR EAX, [ECX + 00000080]

Один из них хранится на [ECX + 0104] и другое значение хранится на [ECX + 0080]. Использование отладчика, чтобы выяснить, какие адреса доступны по этим кодам, Вы можете найти ключевые значения для жизни. Очень хорошо, теперь установите оба значения в 0, и вы должны иметь 0 жизнь. Удивительный, сейчас единственная проблема в том, что Вы имеете 0 жизнь на экране, но в действительности, у вас есть такое же количество жизней, как первоначально. Это означает, что все, что вы найти и изменить был отображаемое значение и вы не изменили реальный объем жизней.

 

Миссия 3: Проверка коды шифрования

Бьюсь об заклад, эта ситуация знакома, если Вы пытались обмануть в некоторых играх.Значение шифруется и / или Вы не нашли реальную стоимость и Вы добились изменения только отображаемое значение. Нет проблем, это не будет достаточно, чтобы создать рабочие читы. Во-первых, мы должны смотреть на коды:

0044DB26 - 33 81 80000000 - XOR EAX, [ECX + 00000080]

Этот код работает часто, читая несколько значений. Очевидно, что не читает число только жизнь, но и некоторые другие вещи тоже.

0044DB5D - 89 B3 80000000 - MOV [EBX + 00000080], ESI
0044DB63 - 33 74 24 10 - XOR ESI, [ESP + 10]
0044DB67 - 5F - поп-EDI
0044DB68 - 89 B3 04010000 - MOV [EBX + 00000104], ESI

Этот код, однако используется только тогда, когда меняется значение. Это код, который пишет для нашего значения. Давайте взглянем на это. Мы видим, что ESI регистр используется для хранения какую-то важную информацию, и эй, он использует XOR на какой-то адрес, [ESP + 10]. Просто из любопытства, давайте посмотрим, что хранится на [ESP + 10].

Начните новую игру, и Вы будете иметь 5 жизней.
Теперь у вас есть 2 варианта, чтобы проверить это значение.
1. Щелкните правой кнопкой мыши на коде и использовать "Перерыв и следа".
2. Нажмите клавишу F5, чтобы установить вручную точку останова.

Если Вы сделали это, вернитесь в игру и умереть. Не убивайте ничего или забрать ничего, просто умереть. Если Вы использовали перерыв и следа, Вы можете увидеть эти важную информацию:

ESP: 0012EB10
XOR ESI, [ESP + 10]
0012EB20 = (DWORD) 00000004 (4)

Если Вы установили ручной останова, игра теперь замораживают, и Вы можете увидеть значение ESP, 0012EB10. ESP + 10 0012EB20 А если добавить этот адрес в таблице, Вы можете видеть, что значение по этому адресу равно 4. Нажмите клавишу F5 снова, чтобы удалить точку останова и нажмите клавишу F9, чтобы включить программу для запуска. Если Вы сделали это, Вы можете видеть, что значение на ваш адрес сразу изменилось.
Очень хорошо, у нас было 5 жизней, мы умерли и ESP + 10 шоу 4. Если Вы умираете снова, он будет показывать 3. Четко держит расшифрованных данных для нашей жизни.

Фото из окна трассировки, когда код работает:

ПРИМЕЧАНИЕ: Более опытные пользователи будут знать, что мы можем использовать условные точки останова для работы с более твердыми кодов, но это легко работать с этим так, мы будем использовать это.

 

Миссия 4: Стек

Вы можете найти множество информации о стеке, если вы используете Google, но сейчас, я вам скажу только несколько вещей, которые необходимому действовать в вашей миссии.Стек временного хранения, и это очень важно для некоторых функций. Позвольте мне процитировать моего старого учебника:

Стек "хранения", где Вы можете поместить значения и загружать их из него. Однако Вы не сможете сохранять и загружать значения в любом порядке.Последнее значение в стеке, что Вы нажимаете на будет первый, который Вы выскочить.

Например предположим, ECX = 3, EDX = 2 и магазины стека следующие значения.


4
5
6

Теперь мы ставим команду, как "толчок ECX". Тогда стек будет выглядеть следующим образом.

3
4
5
6

Теперь мы также ввели в EDX с "толчка EDX".Стек будет выглядеть следующим образом.

2
3
4
5
6

Теперь мы хотим, чтобы совать значение из стека, как "поп-ЕКБ».

В этом случае, программа будет вытащить первое значение из стека, которое 2,
и положил его на ECX. Так ECX = 2 и стек выглядеть следующим образом.

3
4
5
6

Если мы даем "поп EDX" Инструкция сейчас, EDX будет 3, а стек будет выглядеть

4
5
6

Результат: стек так же, как когда мы начали, но ECX = 2 сейчас, и EDX = 3, мы изменили свои значения друг с другом.

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

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

0012FF00 4 // это адрес дна стека и содержит значение, 4
0012FEFC 2 // этот адрес следующий уровень в стеке, как вы можете видеть адрес был снижен с 4 байт
-------------------------------------- // После этой линии, есть еще неиспользованные уровнистек
0012FEF8 х
0012FEF4 х

Указатель стека: указатель стека показывает вершину стека, которая в нашем случае ------------------ линии.Указатель стека регистр ESP. В нашем примере 0012FEFC является вершина стека, и это может быть просчитан, проверив значение ESP, которая 0012FEFC.
Теперь давайте нажмите что-то в стеке.
Предположим, что следующая инструкция является:
нажмите 8
После окончания этой команды, наша мини-стек будет выглядеть следующим образом:

0012FF00 4 // это адрес дна стека и содержит значение, 4
0012FEFC 2 // этот адрес следующий уровень в стеке, как вы можете видеть адрес был снижен с 4 байт
0012FEF8 8
-------------------------------------- // После этой линии, есть еще неиспользованные уровнистек
0012FEF4 х

Мы выдвинули значение в стек и вершина стека была снижена с 4 байтов еще раз. Теперь ESP = 0012FEF8 и значение на 0012FEF8 8.

Давайте толкать другое значение снова, скажем, 5.
нажмите 5

0012FF00 4 // это адрес дна стека и содержит значение, 4
0012FEFC 2 // этот адрес следующий уровень в стеке, как вы можете видеть адрес был снижен с 4 байт
0012FEF8 8
0012FEF4 5
-------------------------------------- // После этой линии, есть еще неиспользованные уровнистек

Теперь, как вы видите, верхняя часть стека (снова) был уменьшен с 4 байт. ESP = 0012FEF4 и значение на 0012FEF4 = 5.
Что случится, если мы должны знать значение на 0012FEFC например? Это очень просто, позвольте мне добавить дополнительный coloumn к нашему примеру, чтобы показать ESP.

0012FF00 4 ESP + 0C // этот адрес дно стека и содержит значение, 4
0012FEFC 2 ESP + 08 // этот адрес следующий уровень в стеке, как вы можете видеть адрес был снижен с 4 байт
0012FEF8 8 ESP + 04
0012FEF4 5 ESP
-------------------------------------- // После этой линии, есть еще неиспользованные уровнистек

Как вы можете видеть из примера, значение на 0012FEFC является [ESP + 08].

И теперь, наконец, давайте предположим, что мы должны значение из вершины стека и мы не должны его после этого, так что могут быть удалены. Мы будем использовать эту инструкцию:
поп EAX
Эта инструкция будет копировать 5 до EAX регистр и вершина стека будет двигаться снова.

0012FF00 4 ESP + 08 // этот адрес дно стека и содержит значение, 4
0012FEFC 2 ESP + 04 // этот адрес следующий уровень в стеке, как вы можете видеть адрес был снижен с 4 байт
0012FEF8 8 ESP
-------------------------------------- // После этой линии, есть еще неиспользованные уровнистек
0012FEF4 х

Я надеюсь, что этот пример ясно показал, что цель указателя стека (ESP) и как стек, который используется для хранения информации. Если это не так очевидно, это может помочь, если Вы проследить какой-либо код, и рассмотрим, как это стек работает в этом коде.

 

Final Mission: обратной трассировки

Теперь вернемся к нашей первоначальной миссии и, как сейчас Вы знакомы со стеком, настало время, чтобы изучить наш код снова.

XOR ESI, [ESP + 10]

Если Вы делаете сценарий, чтобы изменить [ESP + 10] до 99, Вы заметите, что Вы действительно 99 жизней. И вы также будете иметь 99 очков, 99 продуктов питания, и 99 ракет. Это потому, что код используется для работы с другими значениями тоже не просто с жизнью. И что теперь? Мы не можем использовать этот код, чтобы сделать неограниченное жизнь обманывать.
Это должно быть ясно, что ESP + 10 это адрес в стеке. Это означает, что реальное число жизней хранятся где-то, то оно расшифровывается, перемещается в стек и используется функция, которую мы нашли. Наша задача состоит в том, чтобы найти код, который движется значение в стек.
Если Вы изучили код, когда жизнь изменилась, Вы, возможно, заметили, что ESP всегда 0012EB10, когда наш код работает. Поэтому, когда этот код:

XOR ESI, [ESP + 10]

используется для изменения жизни, ESP + 10 = 0012EB20.
Что нам нужно сделать, это найти код, который будет копировать число жизней 0012EB20. Хотя это только временное хранение, я думаю, вы уже поняли, что мы могли бы просто написать скрипт для изменения 0012EB20, когда этот код работает, но мы не будем делать, потому что это было бы неточным. Мы сделаем это правильный путь, и мы найдем код, который ставит значение в стеке, чтобы увидеть, где она хранится.

Что нам нужно сделать сейчас, это мало обратной трассировки. Вы можете видеть, что вариант Перерыв и следа позволяет отследить исполняемый код из некоторой точки. Но как же нам идти "назад во времени", чтобы увидеть, где же код пришли? Да, я вижу, вы думаете: "мы просто прокрутки вверх в окне дизассемблера", но это не так просто. Вы должны узнать немного о функциях.

Программа полна функций.Цель функции для выполнения какой-либо задачи, чем вернуться к точке, где она была вызвана. В нашем случае, код, который мы нашли, является частью функции для шифрования / дешифрования значения и вызывается из нескольких мест, чтобы выполнить эту задачу. После того, как это делается, он вернется туда, где он был вызван и программа будет продолжаться. Конечно, некоторые задачи настолько велик, что он может быть вскрыт на более мелкие задачи. Если Вы думаете, что об этом так, Вы понимаете, что функция может иметь много вложенных функций, эти подфункции также может иметь подфункции и т.д., чтобы сломать весь процесс малых кусочков. Так как это работает?

Вы можете использовать функцию с "Вызов" инструкции. При использовании вызова, программа перейдет к заданной точке и начать выполнение функции.Функция завершится с "РЭТ" инструкции. При использовании в отставке, программа будет прыгать обратно в том же месте сразу после того адреса, где был использован вызов. В отставке всегда будет прыгать до места последнего звонка, поэтому он будет работать следующим образом:

позвоните 1
       делать то,
        позвоните 2
           делать то,
           в отставке (перейти прямо после вызова 2 в коде)
        делать то,
        в отставке (перейти прямо после вызова 1 в коде)
делать то,

Так почему это важно? Давайте предположим, что наш код работает как это.

позвоните 1
     делать то,
     , число жизней в стек
       позвоните 2
            делать то,
                  позвоните 3
                      делать то,
                           позвоните 4
                                делать то,
                                       позвоните 5
                                            делать то,
                                            XOR ESI, [ESP + 10] (наш код)
                                            в отставке
                                       делать то,
                                       в отставке
                            ...
                            в отставке
                   ...
                   в отставке
       ...
       в отставке
...

Мы хотим, чтобы найти код "поставить число жизней в стек". Для этого мы должны найти, где находится "называют 1", то след от туда и найти код. Мы исходим из крошечной подфункции, и мы должны идти "назад". Как мы можем это сделать? По После возвращения очков. Не забывайте, что если вы знаете, где программа возвращения, вы будете знать, где была вызвана функция. И как инструкции RET являются после нашего кода, мы можем проследить их и увидеть, где программа прыгает, так что мы должны не только возврата очков, но точку входа функции тоже.

Я надеюсь, что это ясно, так что давайте начнем. Во-первых, добавить 0012EB20 к вашему столу, как мы будем искать инструкции, где 0012EB20 изменяется на номер нашей жизни. Тогда начните игру, нажмите правой кнопкой мыши на "XOR ESI, [ESP + 10]" и использовать перерыв и следа. Все, что вам нужно сделать сейчас, это однажды умереть. Ваш след должен быть готов. Щелкните правой кнопкой мыши в окне трассировки и выберите "Развернуть все".

ПРИМЕЧАНИЕ: адреса возврата хранятся в стеке, но, как 6 CE имеет очень красивый вид дерева, который показывает возврата очков, мы не должны беспокоиться слишком много, чтобы их найти. Вот почему новое окно след является одним из моих любимых вариантов.

Вы можете увидеть наш первый инструкцию, "исключающее или ESI, [ESP + 10]». Несколько ниже инструкциям, есть в отставке. Давайте посмотрим, на следующий адрес после отставке:

00591215 - 8B 0D 9C7C7100 - MOV ECX, [00717C9C]: [012560A8]

Изображение с трассы:

Теперь прокрутите вверх строку:

00591210 - E8 1BC9EBFF - звоните 0044DB30
00591215 - 8B 0D 9C7C7100 - MOV ECX, [00717C9C]: [012560A8]

Таким образом, наша функция была вызвана отсюда. Давайте установим точку останова на этот призыв. Нажмите на него и нажмите F5. Теперь потеряете жизнь. Программа в настоящее время остановлен. Посмотрите на наш адрес в таблице, 0012EB20. Это уже держит число наших жизнях, так он был скопирован там до этой функции. Нам нужно идти еще дальше. Нажмите клавишу F5 на код еще раз и нажмите F9 для того, чтобы запустить программу. Посмотрите на нашу следа и найти в отставке инструкцию, которая принесет нам обратно с одного уровня. Как вы прокрутите вниз, вы увидите несколько подфункций, только несколько строк кода, но мы не нуждаемся в них, мы хотим, чтобы вернуться с уровнем так что найти место, где дерево будет вернуться с уровнем ,

Следующий код, что мы найдем это:

00591CF7 - E8 D4F4FFFF - звоните 005911D0
00591CFC - C3 - в отставке

Другая картина, чтобы показать RET для этого шага:


Установить точку останова на этот призыв снова и умереть в игре. Хорошо, игра останавливается. Посмотрите на 0012EB20. Это имеет значение, которое, безусловно, не количество оставшихся жизней. Это означает, что код, который будет поместить значение по этому адресу еще не выполнена. Теперь мы делаем шаг в коде очень медленно и посмотреть, что происходит со стоимостью на 0012EB20. Нажмите клавишу F5, чтобы удалить точку останова, а затем нажмите F7. Теперь Вы активизировали одну строку в коде и вы находитесь в 005911D0, где функция начинается. Шаг снова и снова и снова. И после каждого шага, посмотрите на 0012EB20 в таблицу, чтобы увидеть, если он был изменен.

0012EB20 изменится к числу Ваших оставшихся жизней сразу после выполнения этого кода:

0059120D - 50 - толчок EAX

Это означает, что Ваша жизнь были сохранены на EAX и были оттеснены в стек с помощью этой команды. Очень хорошо. Прокрутка вверх немного, чтобы увидеть весь код:

00591203 - 8B 44 24 24 - MOV EAX, [ESP + 24]
00591207 - 8D B5 E0010000 - Леа ESI, [EBP + 000001E0]
0059120D - 50 - толчок EAX

Из этих нескольких строк, то ясно, что EAX копируется из [ESP + 24], из стека, а затем она была введена в верхней части этого. Ладно, оставим эти коды и нажмите клавишу F9, чтобы что несчастный программу для запуска уже. Мы еще не знаем, где значение, хранящееся в памяти, но у нас есть код, который работает с этим значением, и мы можем изменить его здесь. В качестве последнего теста, положить останова на этот код и играть в игру, чтобы увидеть, что этот код используется только тогда, когда Вы теряете или получить жизнь. Ну что я могу сказать вам, что это функция не используется ни для чего другого, так что вы можете использовать инъекцию кода, чтобы изменить EAX или [ESP + 24] в этой точке.

ПРИМЕЧАНИЕ: Опытные пользователи могут рассмотреть вопрос о создании контрольной точки данных с перерывом на пишите на адрес 0012EB20. Таким образом, они не должны использовать пошаговое и отладчик остановит программу сразу после "толчок EAX" выполняется и значение на 0012EB20 меняется.

Вот видео о завершающем этапе обратной трассировки:



Поздравляю, вы сделали свой "Неограниченные жизни» чит для Chicken Invaders 4 и, надеюсь, Вы узнали что-то новое, что поможет вам обмануть в других играх. Конечно, есть и другие способы, чтобы создать этот код тоже, но это, как я мог положить много информации в одном учебнике, используя только одну игру.

Мир!
Geri

 

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

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

 

2. Игра называется Chicken Invaders 4 v4.00.  Советую установить игру. Проделать действия, которые описал автор. Лучше один раз сделать самому и увидеть как это работает и как работать с трейсером.

 


 

Объясню статью, для тех кому сложно разобраться.

 

Самая важная часть статьи - это видео, на котором показан принцип работы с логами трейсера и отладчиком. Остальной текст не важен.

 

Есть игрушка Chicken Invaders 4 v4.00. Есть адрес здоровья зашифрованный. Нашли его как показано в первом посте. Поставили бряк. Посмотрели стек. В стеке увидели расшифрованное значение. Не стали делать инъекцию кода, а решили найти инструкцию, которая пишет в стек незашифрованное значение. Вот на видео показано как найти инструкцию push eax, которая запишет незашифрованное значение. Еще раз повторю, важно понять как работать с трейсом.

 

Видео начинается с того, что автор копирует стековый адрес ESP в таблицу CE и изменяет его на адрес 0x0012EB20. Автор будет постоянно следить за этим адресом на видео. Автор хочет найти инструкцию, которая записала незашифрованное число жизней в этот адрес. Это можно сделать как минимум двумя способами. 

 

Первый - через условный брейкпоинт на запись, который автор не показал как сделать.

Второй - через пошаговую отладку + трейсер.

 

Первый способ на мой взгляд хуже, т.к. он наудачу. Ведь поставив бряк на запись на 0x0012EB20 можно прерваться много раз и не на исследуемой ветке кода. А вот второй способ четко ведет по ветке кода. Сначала мы поднимается вверх по трейслогам из глубины ветки кода  пока по адресу 0x0012EB20 перестанет показываться здоровье. И вот появился мусор "6209463". Теперь идем вглубь кода F7 и нажимаем F8  двигаясь по шагам, пока по адресу 0x0012EB20 не появится значение жизни - первая запись в стек. И вот мы тут!

 

00591203 - 8B 44 24 24 - mov eax,[esp+24]
00591207 - 8D B5 E0010000 - lea esi,[ebp+000001E0]
0059120D - 50 - push eax << четко тут запись в  0x0012EB20, в стек произошла запись

 

0059120D - 50 - push eax запишет первый раз незашифрованное здоровье. Нужно понять только как мы сюда дошли рабтая с трейсером и пошаговой отладкой. Больше ничего в этой статье понимать не нужно. Дальше идет тупая АА инъекция уже характерная только для этой игры.

 

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

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

Есть игрушка Chicken Invaders 4 v4.00. Есть адрес зоровья зашифрованный. Нашли его. Поставили бряк. Посмотрели стек. В стеке увидели расшифрованное значение. 

 

MasterGH я вот все понимаю в этой статьи, НО мне совершенно неясно как он НАШЕЛ зашифрованное значение. Лично я пробовал делать коды почти к всем Chicken Invaders'ам и ничего кроме брони там не сделал, и то только в одной версии. Меня совершенно не интересует нахождение незашифрованного значения, так как здесь его и не найдешь. А нашел он именно ЗАШИФРОВАННОЕ значение, а потом по нему уже делал на мой взгляд ненужные операции.

 

Да и, если не ошибаюсь, товарищь ZOKIR делал видео что делать если по'XOR'ено и как записать именно нужное значение. 

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

MasterGH я вот все понимаю в этой статьи,

 

Очень хорошо, что понятно. Больше ничего понимать и не надо. Так как поиск адреса у игр может быть разным и зацикливаться на этом наверно не стоит  :)

 Если не получается найти адрес зашифрованного значения здоровья, то смотрим на инструкции

0044DB20 - 8B 81 04010000 - mov eax,[ecx+00000104]

0044DB26 - 33 81 80000000 - xor eax,[ecx+00000080]

Идем в дизассемблер на инструкцию 0044DB20. Далее просмотреть адреса в квадратных скобках и один из них будет шифрованным значением здоровья.

 

К сожалению, у меня нет информации о том каким способом искать шифрованное значение в этой игре кроме той информации, что указана в статье. Там указано искать 1 байт изменилось/не изменилось после смерти. Если это сделать, то скорее всего у вас ничего не получиться.

У меня ничего не получилось. Когда я публиковал пост с объяснением статьи, то я не проверял все на игре и думал, что адрес легко найти. Оказалось, что это не так.

Если немного исследовать, что там происходит.

На инструкции 0044DB20 и 0044DB26 необычное ксоривание. Раньше я видел в играх было с ксоривание с постоянной константой и найти было можно по прямой или обратной пропорциональности, т.е. правила поиска: неизвестное, увеличилось, уменьшилось, не изменилось.

А в этой игре константа постоянно рандомится. Т.е. мы имеем два постоянных адреса до гибели с меняющимися шифрованными значениями, ксоривание которых дает расшифрованное значение.

[Адрес1] xor [Адрес2] = Здоровье

или так можно записать

[Адрес1] xor Здоровье = [Адрес2]

[Адрес2] xor Здоровье = [Адрес1]

Здоровье xor  [Адрес1] = [Адрес2]

Здоровье xor [Адрес2] = [Адрес1]

 

Вот какие значения проскакивали на адресах

[ecx+00000104] xor [ecx+00000080]:

8A8F8503 xor 8A8F8507 = 4 сердца

9BBA2503 xor 9BBA2500 = 3 сердца

A605F1C0 xor A605F1C2 = 2 сердца

280EDDDE xor 280EDDDF = 1 сердце

10F4C219 xor 10F4C219 = 0 сердец

Если искать не здоровье, а очки, то будет так

[ecx+00000104] xor [ecx+00000080]:

0x9E0CF73D xor 0x9E0CF6C9 = 500

0x63F00EF6 xor 0x63F00D1E = 1000

0xBF0F1309 xor 0xBF0F14D9 = 2000

Т.е. найти по правилу Geri нереально, похоже он взял это правило с потолка. Отдельные байты по адресам меняются всегда.

 

Когда ни одно правило стандартного поиска не работает, то можно поискать адрес текста, в данной игре адрес теста очков и ставить бряк на запись. Этот адрес точно есть в игре. Трейсить и искать код, который записывает текст из зашифрованных значений.

 

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

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

Да вот есть такие мастера как Geri. Взломать умеют, а показывают совсем другое.

 

Я помню что качал к этим играм разные трейнеры, но ни один не работал. И я сам решил сделать кое-какие коды к ним, но облом ничего не сделал. С таким вообще не встречался и меня именно поиск таких значений и интересовал.

 

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

 

P.S. хотелось бы больше узнать об Ultimap в СЕ и об использовании программ FunctionHacker и DynamicCodeAnalize.

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

Прогнал я Ultimap-ом игру. На игру кстати надо переключаться ALt+Tab иначе происходил выход в меню.

 

Так вот, я уменьшал сердца пять раз и по счетчику отсеял инструкции. Они все на скриншоте.

 

Интересно, что адрес на видео... вот он на скриншоте.

 

post-3-0-31476200-1421566915_thumb.png

Все эти инструкции вызывались ровно пять раз, пока корабль не сдох. 

 

Я поставил бряки на все эти инструкции и отпустил игру умерев. Тут же на первой инструкции в стеке засветилось 4 - расшифрованное значение.

 

post-3-0-13193400-1421566908_thumb.png



FunctionHacker я еще попробовал часов шесть назад. FunctionHacker или сейчас его называют CDA: Code Dynamic Analysis не выдерживает работы через какое-то время примерно 10 секунд и закрывает игру с ошибкой.

 

В FunctionHacker все на интуитивном уровне было понятно.

 

1. Подключаем процесс. Снимаем все галочки с регионов памяти и ставим только одну на главном exe модуле игры с правами на выполнения кода (зеленый цвет)

2. Жмем старт

3. Быстренько умирает три раза

4. В фильтре пишем от трех до трех

Все. Игра правда у меня закрывается все равно.

 

Фильтры еще можно ставить по предполагаемым числам в аргументах функций. Но этого можно не делать

 

Вот сравнение Ultimap и CDA

 

post-3-0-96664800-1421569191_thumb.png

 

Много инструкций CDA не увидел. Возможно CDA показал достаточные функции, а Ultimap избыточные, я не проверил. Ultimap показал много инструкций и главное не вылетал через 10 секунд. Ultimap сегодня показал мне BSOD в три ночи и потом после ресета комп не запустился. Я думал, все приплыли. Но после еще одного рестарта все заработало.

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

Спасибо MasterGH, ссылку сюда сделал в своей теме. Всё правильно - если есть в СЕ примочки почему бы не научиться их использовать. Главное понять - как правильно это делать.

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

  • 5 недель спустя...

Да и, если не ошибаюсь, товарищь ZOKIR делал видео что делать если по'XOR'ено и как записать именно нужное значение. 

Bromvol, если случайно помнишь, дай ссылку на видео ZOKIR пожалуйста. Просто как раз подобным вопросом занимаюсь. Заранее Благодарю!!!

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

PS:перебрал вручную все видео в разделе, чёй-то ничего похожего за авторством ZOKIR, не нашёл.

Bromvol, так что если помнишь, где это видео лежит, кинь ссылку пжлста. 

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

garik66 вот нашел его видео. В нем есть поиск значения с использованием горячих клавиш, а потом как записывать значения нужные тебе если есть XOR.

 

Вот линк

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

garik66 вот нашел его видео. В нем есть поиск значения с использованием горячих клавиш, а потом как записывать значения нужные тебе если есть XOR.

 

Вот линк

Спасибо.

Правда уже успел написать скрипт.

Но всё равно потом посмотрю. 

Ещё раз спасибо.

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

garik66 вот нашел его видео. В нем есть поиск значения с использованием горячих клавиш, а потом как записывать значения нужные тебе если есть XOR.

 

Вот линк

Посмотрел.

На мой вкус, у MasterGH на видео гораздо лучше всё объяснено.

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

У ZOCKIR-а видео тяжело понимается, но со второго, третьего... доходит, что оно лучше моего видео по технике без его комментариев, а мое хуже по технике не смотря на объяснения в комментариях. Забегая вперед, я напишу, что полезно смотреть на единую картину целого. Не может существовать одна часть целого без другой части. Так и с двумя видео на одну тему взлома - это одно целое. Ну, да понять сложновато, но если оценивать, что одно хуже, а другое лучше, то это все равно, что удивляться о том, что зима хуже, а лето лучше. Это шанс рассмотреть решение задачи с двух сторон.

 

 Два скрипта, которые он сделал включают и выключают значения в игре сразу, а не после удара как у меня. Потом показано как вышли на xor инструкцию - через поиск уменьшилось/неизменилось - хороший способ. Все достаточно технично выполнено и скрипты вполне хорошие (с сигной было бы идеально)

 

1. Сначала он ищет рабочий адрес золота по правилу уменьшилось

2. Пишет скрипт на золото, а скрипт-то срабатывает и на другие величины. Повезло, ну если бы не повезло, то решалось бы ходу дела.

3. Потом ищет "силу" как float, странно, что эта сила не шифруется

3. Пишет скрипт на силу,  а скрипт-то срабатывает и на другие величины включая здоровье и ману. 

 

Два скрипта, судя по видео рабочие. 

 

Хотя качество видео и мое и ZOKIR хреновое, нечеткое и с трудом понимается, что там за числа в игре, но зато поняв, можно увидеть, что все не так-то сложно ;) Скрипты простые, только в отладке поковыряться немного и с поиском.  Кстати, считать xor в калькуляторе необязательно. Переводы может делать и ассемблерный код.

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

Кстати, считать xor в калькуляторе необязательно. Переводы может делать и ассемблерный код.

Да так удобнее, у себя на видео так и делаю.

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

PS: Тем более, что в моём случае константа с которой XORится значение постоянно меняется и калькулятор здесь уже не поможет, только раскодировка в коде инъекции.

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

  • 4 недели спустя...
×
×
  • Создать...

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

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