Rudimentary Item Swapper
Note: only works in implants and gear screens. Tested on patch 15 only.
0. Make a backup of your savegame!!!!!
1. Mouse over an item you want to duplicate
2. Note down their ID pointer (this changes each time you reload the game)
3. Mouse over an item you don't want
4. Change their ID to an item you want (you can change gears into implants, weapons etc and vice versa)
If you want to get the rest of item IDs
1. Enable Get Item Array
2. Right Click on Item 0 and select browse memory region
3. Make sure to display as 8 byte hex (Ctrl+7) for easy viewing and copying
Tips:
- The ID pointer for an implant's next version is usually next to or near it in the array
- Be careful adding quest items (might break your game)
- DLC items are usually near the end of the array
- Some ID pointers don't work and will crash your game
Code: Select all
<?xml version="1.0" encoding="utf-8"?>
<CheatTable>
<CheatEntries>
<CheatEntry>
<ID>156</ID>
<Description>"Get Item Id (Mouse Over)"</Description>
<LastState Activated="1"/>
<VariableType>Auto Assembler Script</VariableType>
<AssemblerScript>{ Game : TheSurge.exe
Version:
Date : 2019-10-06
Author : 0
This script does blah blah blah
}
[ENABLE]
aobscanmodule(INJECT,TheSurge.exe,48 8B 41 48 48 85 C0 74 05) // should be unique
alloc(newmem,$1000,"TheSurge.exe"+3B93C0)
globalalloc(item1,4)
label(code)
label(return)
newmem:
code:
mov rax,item1
mov [rax],rcx
mov rax,[rcx+48]
test rax,rax
jmp return
INJECT:
jmp newmem
nop 2
return:
registersymbol(INJECT)
[DISABLE]
INJECT:
db 48 8B 41 48 48 85 C0
unregistersymbol(INJECT)
dealloc(newmem)
{
// ORIGINAL CODE - INJECTION POINT: "TheSurge.exe"+3B93C0
"TheSurge.exe"+3B93B6: CC - int 3
"TheSurge.exe"+3B93B7: CC - int 3
"TheSurge.exe"+3B93B8: CC - int 3
"TheSurge.exe"+3B93B9: CC - int 3
"TheSurge.exe"+3B93BA: CC - int 3
"TheSurge.exe"+3B93BB: CC - int 3
"TheSurge.exe"+3B93BC: CC - int 3
"TheSurge.exe"+3B93BD: CC - int 3
"TheSurge.exe"+3B93BE: CC - int 3
"TheSurge.exe"+3B93BF: CC - int 3
// ---------- INJECTING HERE ----------
"TheSurge.exe"+3B93C0: 48 8B 41 48 - mov rax,[rcx+48]
"TheSurge.exe"+3B93C4: 48 85 C0 - test rax,rax
// ---------- DONE INJECTING ----------
"TheSurge.exe"+3B93C7: 74 05 - je TheSurge.exe+3B93CE
"TheSurge.exe"+3B93C9: 48 83 C0 28 - add rax,28
"TheSurge.exe"+3B93CD: C3 - ret
"TheSurge.exe"+3B93CE: 48 8D 05 A7 80 E3 13 - lea rax,[TheSurge.exe+141F147C]
"TheSurge.exe"+3B93D5: C3 - ret
"TheSurge.exe"+3B93D6: CC - int 3
"TheSurge.exe"+3B93D7: CC - int 3
"TheSurge.exe"+3B93D8: CC - int 3
"TheSurge.exe"+3B93D9: CC - int 3
"TheSurge.exe"+3B93DA: CC - int 3
}
</AssemblerScript>
<CheatEntries>
<CheatEntry>
<ID>158</ID>
<Description>"MK"</Description>
<LastState Value="00000005" RealAddress="16185A2C620"/>
<ShowAsHex>1</ShowAsHex>
<VariableType>4 Bytes</VariableType>
<Address>item1</Address>
<Offsets>
<Offset>50</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>175</ID>
<Description>"ID"</Description>
<LastState Value="0000016178D83270" RealAddress="16185A2C618"/>
<ShowAsHex>1</ShowAsHex>
<VariableType>8 Bytes</VariableType>
<Address>item1</Address>
<Offsets>
<Offset>48</Offset>
</Offsets>
<Hotkeys>
<Hotkey>
<Action>Increase Value</Action>
<Keys>
<Key>18</Key>
<Key>88</Key>
</Keys>
<Value>448</Value>
<ID>0</ID>
<ActivateSound>Activate</ActivateSound>
</Hotkey>
</Hotkeys>
</CheatEntry>
<CheatEntry>
<ID>195</ID>
<Description>"Get Item Array"</Description>
<LastState Activated="1"/>
<VariableType>Auto Assembler Script</VariableType>
<AssemblerScript>{ Game : TheSurge.exe
Version:
Date : 2019-10-06
Author : 0
This script does blah blah blah
}
[ENABLE]
aobscanmodule(INJECT,TheSurge.exe,48 8B 49 18 48 8B 04 C1 48 83) // should be unique
alloc(newmem,$1000,"TheSurge.exe"+68D416)
globalalloc(itemlist1,8)
label(code)
label(return)
newmem:
code:
mov rcx,[rcx+18]
push rax
mov rax,itemlist1
mov [rax],rcx
pop rax
mov rax,[rcx+rax*8] //read item list rax = count rcx = base address
jmp return
INJECT:
jmp newmem
nop 3
return:
registersymbol(INJECT)
[DISABLE]
INJECT:
db 48 8B 49 18 48 8B 04 C1
unregistersymbol(INJECT)
dealloc(newmem)
{
// ORIGINAL CODE - INJECTION POINT: "TheSurge.exe"+68D416
"TheSurge.exe"+68D3F8: 48 8B 44 24 28 - mov rax,[rsp+28]
"TheSurge.exe"+68D3FD: 8B 40 10 - mov eax,[rax+10]
"TheSurge.exe"+68D400: 39 44 24 48 - cmp [rsp+48],eax
"TheSurge.exe"+68D404: 72 01 - jb TheSurge.exe+68D407
"TheSurge.exe"+68D406: CC - int 3
"TheSurge.exe"+68D407: 33 C0 - xor eax,eax
"TheSurge.exe"+68D409: 85 C0 - test eax,eax
"TheSurge.exe"+68D40B: 75 FA - jne TheSurge.exe+68D407
"TheSurge.exe"+68D40D: 8B 44 24 48 - mov eax,[rsp+48]
"TheSurge.exe"+68D411: 48 8B 4C 24 28 - mov rcx,[rsp+28]
// ---------- INJECTING HERE ----------
"TheSurge.exe"+68D416: 48 8B 49 18 - mov rcx,[rcx+18]
"TheSurge.exe"+68D41A: 48 8B 04 C1 - mov rax,[rcx+rax*8]
// ---------- DONE INJECTING ----------
"TheSurge.exe"+68D41E: 48 83 C4 38 - add rsp,38
"TheSurge.exe"+68D422: C3 - ret
"TheSurge.exe"+68D423: CC - int 3
"TheSurge.exe"+68D424: CC - int 3
"TheSurge.exe"+68D425: CC - int 3
"TheSurge.exe"+68D426: CC - int 3
"TheSurge.exe"+68D427: CC - int 3
"TheSurge.exe"+68D428: CC - int 3
"TheSurge.exe"+68D429: CC - int 3
"TheSurge.exe"+68D42A: CC - int 3
}
</AssemblerScript>
<CheatEntries>
<CheatEntry>
<ID>199</ID>
<Description>"Item0 (brose memory region to see more)"</Description>
<LastState Value="0000016178B16F70" RealAddress="1613E68F7A0"/>
<ShowAsHex>1</ShowAsHex>
<VariableType>8 Bytes</VariableType>
<Address>itemlist1</Address>
<Offsets>
<Offset>0</Offset>
</Offsets>
</CheatEntry>
</CheatEntries>
</CheatEntry>
</CheatEntries>
</CheatEntry>
</CheatEntries>
</CheatTable>