 |
Cheat Engine The Official Site of Cheat Engine
|
View previous topic :: View next topic |
Author |
Message |
cooleko Grandmaster Cheater
Reputation: 11
Joined: 04 May 2016 Posts: 717
|
Posted: Thu May 19, 2016 12:26 pm Post subject: AOB scripts, accessing a line different than the AOB scan |
|
|
I had to change lines of code to find a unique AOB. The AOB I found is here:
Code: |
{
// ORIGINAL CODE - INJECTION POINT: 0F543416
0F5433F8: 04 00 - add al,00
0F5433FA: 14 0F - adc al,0F
0F5433FC: 0D 00 00 00 55 - or eax,55000000
0F543401: 48 8B EC - mov rbp,rsp
0F543404: 56 - push rsi
0F543405: 48 83 EC 08 - sub rsp,08
0F543409: 48 8B F1 - mov rsi,rcx
0F54340C: 48 8B 4E 20 - mov rcx,[rsi+20]
0F543410: 33 D2 - xor edx,edx
0F543412: 48 83 EC 20 - sub rsp,20
// ---------- INJECTING HERE ----------
0F543416: 49 BB E0 C4 23 05 00 00 00 00 - mov r11,UnityEngine:Object:op_Inequality
// ---------- DONE INJECTING ----------
0F543420: 41 FF D3 - call r11d
0F543423: 48 83 C4 20 - add rsp,20
0F543427: 85 C0 - test eax,eax
0F543429: 0F 84 41 00 00 00 - je Weapon:UpdateCharging+70
0F54342F: F3 0F 10 86 9C 00 00 00 - movss xmm0,[rsi+0000009C]
0F543437: F3 0F 5A C0 - cvtss2sd xmm0,xmm0
0F54343B: F2 0F 11 45 F0 - movsd [rbp-10],xmm0
0F543440: 48 83 EC 20 - sub rsp,20
0F543444: 49 BB 60 7A 30 05 00 00 00 00 - mov r11,UnityEngine:Time:get_deltaTime
0F54344E: 41 FF D3 - call r11d
} |
I really want to inject at "0F54342F" which is offset by 19.
I know it has to be simple: I think there are two ways to get to where I want to inject, the first may be some manner of
SYMBOL+19:
start code
The second, which is more of a brute force, would be to use an AOB scan of "49 BB E0 C4 23 05 00 00 00 00 41 FF D3 48 83 C4 20 85 C0 0F 84 41 00 00 00 F3 0F 10 86 9C 00 00 00"
Using the second method, I could paste all of the code back into place with a:
Code: | code:
dd 49 BB E0 C4 23 05 00 00 00 00 41 FF D3 48 83 C4 20 85 C0 0F 84 41 00 00 00 F3 0F 10 86 9C 00 00 00
injection code afterwards
jmp return |
However, this seems to be really verbose for merely attempting to inject at a line other than my AOB scan.
Can someone explain how to optimally accesses a line above or below the AOB scan without copying and pasting the entire code between the AOB and the line to edit?
|
|
Back to top |
|
 |
++METHOS I post too much
Reputation: 92
Joined: 29 Oct 2010 Posts: 4197
|
Posted: Thu May 19, 2016 1:53 pm Post subject: |
|
|
First of all, why are you wanting to do this?
As you say, just using an offset will work:
Code: | aob_example+B4:
jmp newmem_example
db 90 90
return_example:
[DISABLE]
dealloc(newmem_example)
aob_example+B4:
db 8B 4D 08 C6 46 0C 00 |
Just make sure you use hex, as shown above. Not sure what you mean regarding having to write out the entire AOB. Just make sure your AOB signature is as long as it needs to be, and only show the necessary bytes in your disable section. Unless you're referring to nop'ing the entire segment of code...then, yes, you'll need to include all of those bytes inside of your script and restore all of the bytes in your disable section. You may be able to use readmem, in lieu of this approach, but I'm not sure if it offers any advantages unless the code is changing. Just keep in mind, if you're wanting to overwrite everything and include everything inside of your code segment and disable section, then you do not need to use any offsets.
|
|
Back to top |
|
 |
cooleko Grandmaster Cheater
Reputation: 11
Joined: 04 May 2016 Posts: 717
|
Posted: Thu May 19, 2016 2:28 pm Post subject: |
|
|
The instruction i want to inject on doesnt generate an AOB. It just happens that the instruction a few lines up is unique and generates an AOB.
The game is also mono, so I tried to inject at "Weapon:UpdateCharging+67", which always points to my instruction I want to inject at, but the script doesnt load for new games, so I guess mono doesn't work that way (even though I can search memory for "Weapon:UpdateCharging+67" and find it every time).
This script works for the game I loaded, but wont work for any other games. even though the generated script is 100% the same for each game load, it doesn't carry over, which leads me to believe that a symbol is getting registered for an address rather than "Weapon:UpdateCharging+67" generically
Code: | define(address,Weapon:UpdateCharging+67)
define(bytes,F3 44 0F 11 BE 9C 00 00 00)
[ENABLE]
assert(address,bytes)
alloc(newmem,$1000,Weapon:UpdateCharging+67)
label(code)
label(return)
label(resetreloadtimer)
label(ignoretimer)
newmem:
code:
cmp myShip, [rsi+20]
je resetreloadtimer
movss [rsi+0000009C],xmm15
jmp return
resetreloadtimer:
cmp dword ptr [rsi+9c], (float)59
jg ignoretimer
cmp dword ptr [rsi+9c], (float)5 //cant spam too fast or screen overloads
jl ignoretimer
mov dword ptr [rsi+9C], (float)60 //60s should be more than enough time to reset the missiles
jmp return
ignoretimer:
movss [rsi+0000009C],xmm15
jmp return
address:
jmp code
nop
nop
nop
nop
return:
[DISABLE]
address:
db bytes
// movss [rsi+0000009C],xmm15
dealloc(newmem)
{
// ORIGINAL CODE - INJECTION POINT: Weapon:UpdateCharging+67
0F6EB8C7: F3 0F 5A C0 - cvtss2sd xmm0,xmm0
0F6EB8CB: F2 0F 11 45 F0 - movsd [rbp-10],xmm0
0F6EB8D0: 48 83 EC 20 - sub rsp,20
0F6EB8D4: 49 BB 00 A7 2A 05 00 00 00 00 - mov r11,UnityEngine:Time:get_deltaTime
0F6EB8DE: 41 FF D3 - call r11d
0F6EB8E1: 48 83 C4 20 - add rsp,20
0F6EB8E5: F3 0F 5A C8 - cvtss2sd xmm1,xmm0
0F6EB8E9: F2 0F 10 45 F0 - movsd xmm0,[rbp-10]
0F6EB8EE: F2 0F 58 C1 - addsd xmm0,xmm1
0F6EB8F2: F2 44 0F 5A F8 - cvtsd2ss xmm15,xmm0
// ---------- INJECTING HERE ----------
0F6EB8F7: F3 44 0F 11 BE 9C 00 00 00 - movss [rsi+0000009C],xmm15
// ---------- DONE INJECTING ----------
0F6EB900: 48 8B CE - mov rcx,rsi
0F6EB903: 48 83 EC 20 - sub rsp,20
0F6EB907: 49 BB 60 B9 6E 0F 00 00 00 00 - mov r11,Weapon:GetChargePercent
0F6EB911: 41 FF D3 - call r11d
0F6EB914: 48 83 C4 20 - add rsp,20
0F6EB918: F3 0F 5A C0 - cvtss2sd xmm0,xmm0
0F6EB91C: F2 44 0F 5A F8 - cvtsd2ss xmm15,xmm0
0F6EB921: F3 44 0F 11 BE B0 00 00 00 - movss [rsi+000000B0],xmm15
0F6EB92A: 48 8B 75 F8 - mov rsi,[rbp-08]
0F6EB92E: C9 - leave
} |
I dont know how to perform the AOB scan for the separate line because I cant find any examples, this code crashed the game, so I gave up on pursuing it further:
Code: | [ENABLE]
aobscan(Reload,49 BB E0 C4 23 05 00 00 00 00 41 FF D3 48 83 C4 20 85 C0 0F 84 41 00 00 00 F3 0F 10 86 9C 00 00 00) // should be unique
alloc(newmem,$1000)
label(code)
label(return)
label(resetreloadtimer)
newmem:
code:
db 49 BB E0 C4 23 05 00 00 00 00 41 FF D3 48 83 C4 20 85 C0 0F 84 41 00 00 00 F3 0F 10 86 9C 00 00 00
cmp [rsi+20], myShip
je resetreloadtimer
jmp return
resetreloadtimer:
cmp dword ptr [rsi+9c], (float)59
jg return
cmp dword ptr [rsi+9c], (float)5 //cant spam too fast or screen overloads
jl return
mov dword ptr [rsi+9C], (float)60 //60s should be more than enough time to reset the missiles
jmp return
Reload:
jmp code
nop
nop
nop
nop
nop
nop
return:
registersymbol(Reload)
[DISABLE]
Reload:
db 49 BB E0 C4 23 05 00 00 00 00 41 FF D3 48 83 C4 20 85 C0 0F 84 41 00 00 00 F3 0F 10 86 9C 00 00 00
unregistersymbol(Reload)
dealloc(newmem)
{
// ORIGINAL CODE - INJECTION POINT: 0F543416
0F5433F8: 04 00 - add al,00
0F5433FA: 14 0F - adc al,0F
0F5433FC: 0D 00 00 00 55 - or eax,55000000
0F543401: 48 8B EC - mov rbp,rsp
0F543404: 56 - push rsi
0F543405: 48 83 EC 08 - sub rsp,08
0F543409: 48 8B F1 - mov rsi,rcx
0F54340C: 48 8B 4E 20 - mov rcx,[rsi+20]
0F543410: 33 D2 - xor edx,edx
0F543412: 48 83 EC 20 - sub rsp,20
// ---------- INJECTING HERE ----------
0F543416: 49 BB E0 C4 23 05 00 00 00 00 - mov r11,UnityEngine:Object:op_Inequality
// ---------- DONE INJECTING ----------
0F543420: 41 FF D3 - call r11d
0F543423: 48 83 C4 20 - add rsp,20
0F543427: 85 C0 - test eax,eax
0F543429: 0F 84 41 00 00 00 - je Weapon:UpdateCharging+70
0F54342F: F3 0F 10 86 9C 00 00 00 - movss xmm0,[rsi+0000009C]
0F543437: F3 0F 5A C0 - cvtss2sd xmm0,xmm0
0F54343B: F2 0F 11 45 F0 - movsd [rbp-10],xmm0
0F543440: 48 83 EC 20 - sub rsp,20
0F543444: 49 BB 60 7A 30 05 00 00 00 00 - mov r11,UnityEngine:Time:get_deltaTime
0F54344E: 41 FF D3 - call r11d
} |
I would welcome any advice for being successful with either approach.
|
|
Back to top |
|
 |
panraven Grandmaster Cheater
Reputation: 62
Joined: 01 Oct 2008 Posts: 958
|
Posted: Thu May 19, 2016 2:39 pm Post subject: |
|
|
Try
1) use a label to adjust the offset in the long (in order to be sure it is unique) aob pattern case:
Code: |
AOBScan(Symbol,....)
label(hackpoint)
Symbol+19:
hackpoint:
alloc(cave,100,hackpoint)
cave:
...
jmp hackpoint+08
hackpoint:
jmp cave
|
2) if there is a symbol that can narrow down the scan region, using ce 6.5 AOBScanRegion can allow a much relaxed and short aob pattern.
Here the symbol is Weapon:UpdateCharging, the scan region can be from Weapon:UpdateCharging to Weapon:UpdateCharging + 70.
With such narrow range, a short aob pattern is enough to pin the desired hackpoint:
Code: |
AOBScanRegion(hackpoint,Weapon:UpdateCharging,Weapon:UpdateCharging+70,F3 0F 10 86 ?? ?? 00 00 F3 0F 5A C0)
...
cave:
...
jmp hackpoint+08
hackpoint:
jmp cave
|
However using the symbol Weapon:UpdateCharging may likely need to activate some ce feature first (eg. mono data collector or dot net data collector).
Mono data collector allow force jit the said symbol, make sure the aob pattern available in memory just before the region scan ; but in dot net case may need some game action to jit.
_________________
- Retarded. |
|
Back to top |
|
 |
++METHOS I post too much
Reputation: 92
Joined: 29 Oct 2010 Posts: 4197
|
Posted: Thu May 19, 2016 3:23 pm Post subject: |
|
|
cooleko wrote: | The instruction i want to inject on doesnt generate an AOB. It just happens that the instruction a few lines up is unique and generates an AOB. | -Then you should be able to do as instructed above, and just use an offset for your injection point. There is no need to include the entire AOB signature anywhere except for your aboscan/aobscanmodule. The only thing different about your script would be the extended signature and the required offset for the two locations, as indicated above. Everything else about your script can stay the same as it would if CE generated the script at your desired injection location.
Also, you can incorporate wildcard entries in to your signature to help with shifting/changing code and for compatibility purposes for dealing with different versions. For example:
Code: | aobscanmodule(aob_example,game.exe,83 B8 ?? ?? ?? ?? ?? 7F 27) |
A good example of this, would be your code:
Code: | 0F543429: 0F 84 41 00 00 00 - je Weapon:UpdateCharging+70 |
In cases like this, you could change out the bytes in your AOB signature as follows:
By the way:
cooleko wrote: | The instruction i want to inject on doesnt generate an AOB. It just happens that the instruction a few lines up is unique and generates an AOB. |
Just because CE doesn't generate a unique AOB for your desired injection location, doesn't mean that you can't expand on the signature that it does give you in order to make it unique. Unless the latest release has been updated to address this issue per a previous request that I published some time ago, CE has a byte limitation for automatically-generated signatures.
|
|
Back to top |
|
 |
cooleko Grandmaster Cheater
Reputation: 11
Joined: 04 May 2016 Posts: 717
|
Posted: Thu May 19, 2016 5:15 pm Post subject: |
|
|
Thanks for the advice. However, I still don't know how to physically implement the Symbol offset. I was able to get the script working using the AOBScanRegion using the mono feature symbols.
Is there a way to force the table to activate mono features, so the user doesn't have to do it?
To assist me in understanding the Symbol offset procedure
Can you explain the relationship between the AOBScan symbol which places the symbol at the address of the first byte, the code that is overwritten by the Registersymbol(code), and the required bytes in the disable.
Then, can you explain how the relationship between those three changes when the symbol is referenced with an offset?
I think my biggest hurdle is I'm not 100% sure on the relationships and have been simply relying on the template to ensure that the relationships are established correctly.
|
|
Back to top |
|
 |
++METHOS I post too much
Reputation: 92
Joined: 29 Oct 2010 Posts: 4197
|
Posted: Thu May 19, 2016 8:10 pm Post subject: |
|
|
It's pretty straightforward. The AOBScan/AOBScanModule that contains your AOB signature is used for the sole purpose of locating the proper segment of code where you want your injection point to be. But, since your signature will be slightly off because it starts above your actual injection point, you'll have to jump over the necessary amount of bytes so that CE injects your code at the proper location. You only have to specify this difference at two locations in your script, as I noted in my previous post.
All you have to do is highlight your desired instruction that you want to manipulate, and let CE build a script for you, automatically, as you would normally do. Then, after you see that it has failed, expand on the signature by adding the necessary bytes like you have shown above. After you do that, it's just a matter of adding the +19 offset (or whatever it is) to the two spots that need it and you're done.
You can check your AOB signature by scanning for it in CE to make sure that it is unique. Be sure to change your scan settings to array of byte and make sure that the 'writable' box is filled-in with a square block. Do this while your script is NOT activated. After you scan for your signature, you'll be able to see if it is unique if you have only 1 result show up in the list.
It is also good to make a habit of incorporating wildcard entries in to your signature for the reasons explained in my previous post. Be sure to check your signature for uniqueness again, after adding any wildcards.
Does that answer your question? I don't want to just write your script for you because it won't help you as much. It's much better for you to do it yourself so that you understand what you are changing and why.
|
|
Back to top |
|
 |
panraven Grandmaster Cheater
Reputation: 62
Joined: 01 Oct 2008 Posts: 958
|
Posted: Fri May 20, 2016 12:26 am Post subject: |
|
|
For this
cooleko wrote: |
...
Is there a way to force the table to activate mono features, so the user doesn't have to do it?
...
|
Sure you know the mono feature can be activate by menu after attaching a mono game target.
Then may try the attached ct table, where there is an entry to Turn On or Off the mono feature, and open/close its CHILD cheat entries.
By open the ct, the entry can be copy and paste into your current ct table in another ce instance. Then your current mono related cheat entries can be drag-and-drop/move under it.
In this way, the user can activate mono feature at the same time with the intention to open the cheats.
The content of the On/off entry is just Lua snippet to call 'LaunchMonoDataCollector' which establish the mono connection between ce and target process in ENABLE part, and removal of this connection in DISABLE part.
bye~
Description: |
|
 Download |
Filename: |
OnOffMono.CT |
Filesize: |
1.61 KB |
Downloaded: |
909 Time(s) |
_________________
- Retarded. |
|
Back to top |
|
 |
cooleko Grandmaster Cheater
Reputation: 11
Joined: 04 May 2016 Posts: 717
|
Posted: Fri May 20, 2016 9:17 am Post subject: |
|
|
I greatly appreciate all of the help. I now understand how to use mono features to narrow down a scan region (using aobscanregion) as well as use an offset aob scan to catch a unique aob scan that is at a different address than the injection point. I also got the auto activate mono features script to work. So for all of the learning I did with great assistance, I thank everyone.
One last question, if the offset was negative, would Symbol-Offset work? I know in cheat engine, sometimes negative offsets are okay, and sometimes they are not. I'll test when it occurs, but until then I would still like to know just for completeness!
To recap, in case anyone finds this thread later and doesnt understand the exceptional explanations provided above without an example, I will show how I applied their advice to my specific problem to reach a solution.
First things first, the code:
I wanted to reset reload timers for missiles, because they were 30 seconds, and that is just too long! The instruction "movss [rsi+0000009C],xmm15" writes the accumulated time since last shot fired.
Code: | 0F539220 - 48 83 EC 20 - sub rsp,20 { 32 }
0F539224 - 49 BB D0CC260500000000 - mov r11,000000000526CCD0 { [EC8B4855] }
0F53922E - 41 FF D3 - call r11d
0F539231 - 48 83 C4 20 - add rsp,20 { 32 }
0F539235 - F3 0F5A C8 - cvtss2sd xmm1,xmm0
0F539239 - F2 0F10 45 F0 - movsd xmm0,[rbp-10]
0F53923E - F2 0F58 C1 - addsd xmm0,xmm1
0F539242 - F2 44 0F5A F8 - cvtsd2ss xmm15,xmm0
0F539247 - F3 44 0F11 BE 9C000000 - movss [rsi+0000009C],xmm15
0F539250 - 48 8B CE - mov rcx,rsi
0F539253 - 48 83 EC 20 - sub rsp,20 { 32 }
0F539257 - 49 BB B092530F00000000 - mov r11,000000000F5392B0 { [EC8B4855] }
0F539261 - 41 FF D3 - call r11d |
This code can also be viewed with mono features, to look like:
With mono features active, we can see that this code resides in a module "Weapon:UpdateCharging" at address 67.
Performing an Auto Assemble, AOB scan template fails because the instruction "movss [rsi+0000009C],xmm15" Bytes "F3 44 0F 11 BE 9C 00 00 00" are used 22 other times!
There were at least two solutions, the easiest (at the time) was to abuse mono features. Since I knew the region of memory would always be Weapon:UpdateCharging, I selected an arbitrary range that would always include instruction 67, and included it in an aobscanregion instruction:
Code: | aobscanregion(Reload,Weapon:UpdateCharging,Weapon:UpdateCharging+9f,F3 44 0F 11 BE 9C 00 00 00) |
As long as mono was activated, this code would find the aob, and could be inserted into the AOB template in place of the failed aobscan with no modifications to the template needed.
My final mono feature utilizing code looked like:
Code: | [ENABLE]
aobscanregion(Reload,Weapon:UpdateCharging,Weapon:UpdateCharging+9f,F3 44 0F 11 BE 9C 00 00 00) // should be unique
alloc(newmem,$1000)
label(code)
label(return)
label(resetreloadtimer)
newmem:
code:
movss [rsi+0000009C], xmm0
cmp [rsi+20], myShip
je resetreloadtimer
jmp return
resetreloadtimer:
cmp dword ptr [rsi+9c], (float)59 //Let the timer reset before editing it again
jg return
cmp dword ptr [rsi+9c], (float)3 //cant spam too fast or screen overloads
jl return
mov dword ptr [rsi+9C], (float)60 //60s should be more than enough time to reset the reload timer
jmp return
Reload:
jmp code
nop
nop
nop
nop
return:
registersymbol(Reload)
[DISABLE]
Reload:
db F3 44 0F 11 BE 9C 00 00 00
unregistersymbol(Reload)
dealloc(newmem) |
To prevent anyone using my table from having to turn on mono features themselves, I included the following code snippet in a parent script, which jumped between using lua and asm:
Code: | [ENABLE]
{$asm}
registersymbol(myShip)
alloc(myShip, 4)
{$lua}
--bDebug = true -- uncomment to print err msg
if not syntaxcheck then
local good = false
if readInteger('mono_domain_get')~=nil and not debug_canBreak() then
local ok,ret = pcall(LaunchMonoDataCollector)
if ok and ret~=0 then good = true end
end
monopipe = good and monopipe or monopipe and monopipe.Destroy and monopipe.Destroy() or nil
if monopipe==nil then local msg = "Can't launch mono data collector." if bDebug then print(msg) end error(msg) end
end
[DISABLE]
{$asm}
unregistersymbol(myShip)
dealloc(myShip)
{$lua}
if not syntaxcheck then
if readInteger('mono_domain_get')~=nil and not debug_canBreak() and monopipe~=nil and monopipe.Destroy then
monopipe.Destroy()
end
monopipe=nil
end |
I wanted to learn the proper way to use an offset AOB, so I continued searching after creating the first solution:
By looking at the code around the instruction, I tried a search for 1 instruction above (including the original instruction) "F2 44 0F 5A F8 F3 44 0F 11 BE 9C 00 00 00" and had 17 results.
Including one more instruction above, I searched for "F2 0F 58 C1 F2 44 0F 5A F8 F3 44 0F 11 BE 9C 00 00 00" and had two results; however, my result would always be the first one [reloaded a few times to confirm], so I was content to accept this non-perfect AOB. (There are instructions elsewhere on this forum on how to use LUA to change one, or both AOBs in multiple AOB results)
I used the original template for my instruction, and replaced the aobscan with "aobscan(Reload,F2 0F 58 C1 F2 44 0F 5A F8 F3 44 0F 11 BE 9C 00 00 00)"
Because the aob scan was now pointing to two instructions above my desired code, I had to include an offset, this offset was calculated by subtracting the address of the first instruction of the aob scan from the address of my instruction (*47 - *3E = 9) and simply adding this calculated offset to any occurance of the symbol Reload where the symbol was rewriting code.
The final code looked like:
Code: | [ENABLE]
aobscan(Reload,F2 0F 58 C1 F2 44 0F 5A F8 F3 44 0F 11 BE 9C 00 00 00) // should be unique
alloc(newmem,$1000)
label(code)
label(return)
label(resetreloadtimer)
newmem:
code:
movss [rsi+0000009C], xmm0
cmp [rsi+20], myShip
je resetreloadtimer
jmp return
resetreloadtimer:
cmp dword ptr [rsi+9c], (float)59 //Let the timer reset before editing it again
jg return
cmp dword ptr [rsi+9c], (float)3 //cant spam too fast or screen overloads
jl return
mov dword ptr [rsi+9C], (float)60 //60s should be more than enough time to reset the reload timer
jmp return
Reload+9:
jmp code
nop
nop
nop
nop
return:
registersymbol(Reload)
[DISABLE]
Reload+9:
db F3 44 0F 11 BE 9C 00 00 00
unregistersymbol(Reload)
dealloc(newmem) |
Once again, thank you to everyone who contributed advice to this thread. It greatly improved my knowledge of certain features of cheat engine and will benefit my future tables.
|
|
Back to top |
|
 |
mgr.inz.Player I post too much
Reputation: 222
Joined: 07 Nov 2008 Posts: 4438 Location: W kraju nad Wisla. UTC+01:00
|
Posted: Fri May 20, 2016 10:51 am Post subject: |
|
|
cooleko wrote: | Performing an Auto Assemble, AOB scan template fails because the instruction "movss [rsi+0000009C],xmm15" Bytes "F3 44 0F 11 BE 9C 00 00 00" are used 22 other times!
|
Did you try "F2 0F 58 C1 F2 44 0F 5A F8 F3 44 0F 11 BE 9C 00 00 00 48 8B CE 48 83 EC 20"
You don't have to go only in one direction. You can add bytes from instructions above and instructions below at the same time.
_________________
|
|
Back to top |
|
 |
++METHOS I post too much
Reputation: 92
Joined: 29 Oct 2010 Posts: 4197
|
Posted: Fri May 20, 2016 1:19 pm Post subject: |
|
|
cooleko-
Good work.
cooleko wrote: | One last question, if the offset was negative, would Symbol-Offset work? | -Yes. As mgr.inz.Player pointed out, you can inject above or below your desired injection point.
|
|
Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum You cannot attach files in this forum You can download files in this forum
|
|