From aceb39730777ea49695535b9c62c13f39e2e4111 Mon Sep 17 00:00:00 2001 From: Nick Cano Date: Mon, 6 Jun 2016 22:36:51 -0700 Subject: [PATCH] Added lua scripts and fixed a typo in state machine code --- .../Chapter11_StateMachines.cpp | 2 +- .../Chapter1_SearchingForAssemblyPatterns.lua | 36 ++++++++++++++++++ LuaScripts/Chapter1_SearchingForStrings.lua | 25 +++++++++++++ LuaScripts/Chapter5_CountLinkedListNodes.lua | 9 +++++ LuaScripts/Chapter5_VerifyLinkedList.lua | 23 ++++++++++++ LuaScripts/Chapter5_VerifyMap.lua | 37 +++++++++++++++++++ 6 files changed, 131 insertions(+), 1 deletion(-) create mode 100644 LuaScripts/Chapter1_SearchingForAssemblyPatterns.lua create mode 100644 LuaScripts/Chapter1_SearchingForStrings.lua create mode 100644 LuaScripts/Chapter5_CountLinkedListNodes.lua create mode 100644 LuaScripts/Chapter5_VerifyLinkedList.lua create mode 100644 LuaScripts/Chapter5_VerifyMap.lua diff --git a/Chapter11_StateMachines/Chapter11_StateMachines.cpp b/Chapter11_StateMachines/Chapter11_StateMachines.cpp index cf5e844..6940e00 100644 --- a/Chapter11_StateMachines/Chapter11_StateMachines.cpp +++ b/Chapter11_StateMachines/Chapter11_StateMachines.cpp @@ -57,7 +57,7 @@ std::vector buildMachine() static bool hasLearned = false; if (!hasLearned && sensors->detectedWeakHeal()) { - hasLearned = false; + hasLearned = true; healAt = 100 - sensors->getWeakHealIncrease(); } return sensors->getHealthPercent() > healAt; diff --git a/LuaScripts/Chapter1_SearchingForAssemblyPatterns.lua b/LuaScripts/Chapter1_SearchingForAssemblyPatterns.lua new file mode 100644 index 0000000..77933a9 --- /dev/null +++ b/LuaScripts/Chapter1_SearchingForAssemblyPatterns.lua @@ -0,0 +1,36 @@ +BASEADDRESS = getAddress("Game.exe") +function LocatePacketCreation(packetType) + for address = BASEADDRESS, (BASEADDRESS + 0x2ffffff) do + local push = readBytes(address, 1, false) + local type = readInteger(address + 1) + local call = readInteger(address + 5) + if (push == 0x68 and type == packetType and call == 0xE8) then + return address + end + end + return 0 +end + +FUNCTIONHEADER = { 0xCC, 0x55, 0x8B, 0xEC, 0x6A } +function LocateFunctionHead(checkAddress) + if (checkAddress == 0) then return 0 end + for address = checkAddress, (checkAddress - 0x1fff), -1 do + local match = true + local checkheader = readBytes(address, #FUNCTIONHEADER, true) + for i, v in ipairs(FUNCTIONHEADER) do + if (v ~= checkheader[i]) then + match = false + break + end + end + if (match) then return address + 1 end + end + return 0 +end + +local funcAddress = LocateFunctionHead(LocatePacketCreation(0x64)) +if (funcAddress ~= 0) then + print(string.format("0x%x",funcAddress)) +else + print("Not found!") +end \ No newline at end of file diff --git a/LuaScripts/Chapter1_SearchingForStrings.lua b/LuaScripts/Chapter1_SearchingForStrings.lua new file mode 100644 index 0000000..c69537d --- /dev/null +++ b/LuaScripts/Chapter1_SearchingForStrings.lua @@ -0,0 +1,25 @@ +BASEADDRESS = getAddress("Game.exe") +function findString(str) + local len = string.len(str) + local chunkSize = 4096 + local chunkStep = chunkSize - len + print("Found '" .. str .. "' at:") + for address = BASEADDRESS, (BASEADDRESS + 0x2ffffff), chunkStep do + local chunk = readBytes(address, chunkSize, true) + if (not chunk) then break end + for c = 0, chunkSize-len do + checkForString(address , chunk, c, str, len) + end + end +end +function checkForString(address, chunk, start, str, len) + for i = 1, len do + if (chunk[start+i] ~= string.byte(str, i)) then + return false + end + end + print(string.format("\t0x%x", address + start)) +end + +findString("hello") +findString("world") \ No newline at end of file diff --git a/LuaScripts/Chapter5_CountLinkedListNodes.lua b/LuaScripts/Chapter5_CountLinkedListNodes.lua new file mode 100644 index 0000000..5aae074 --- /dev/null +++ b/LuaScripts/Chapter5_CountLinkedListNodes.lua @@ -0,0 +1,9 @@ +function countLinkedListNodes(nodeAddress) + local counter = 0 + local next = readInteger(nodeAddress) + while (next ~= nodeAddress) do + counter = counter + 1 + next = readInteger(next) + end + return counter +end \ No newline at end of file diff --git a/LuaScripts/Chapter5_VerifyLinkedList.lua b/LuaScripts/Chapter5_VerifyLinkedList.lua new file mode 100644 index 0000000..7b18757 --- /dev/null +++ b/LuaScripts/Chapter5_VerifyLinkedList.lua @@ -0,0 +1,23 @@ +function _verifyLinkedList(address) + local nextItem = readInteger(address) or 0 + local previousItem = readInteger(address + 4) or 0 + local nextItemBack = readInteger(nextItem + 4) + local previousItemForward = readInteger(previousItem) + + return (address == nextItemBack + and address == previousItemForward) +end + +function isValueInLinkedList(valueAddress) + for address = valueAddress - 8, valueAddress - 48, -4 do + if (_verifyLinkedList(address)) then + return address + end + end + return 0 +end + +local node = isValueInLinkedList(addressOfSomeValue) +if (node > 0) then + print(string.format("Value in LL, top of node at 0x0%x", node)) +end \ No newline at end of file diff --git a/LuaScripts/Chapter5_VerifyMap.lua b/LuaScripts/Chapter5_VerifyMap.lua new file mode 100644 index 0000000..3d927b6 --- /dev/null +++ b/LuaScripts/Chapter5_VerifyMap.lua @@ -0,0 +1,37 @@ +function _verifyMap(address) + local parentItem = readInteger(address + 4) or 0 + + local parentLeftItem = readInteger(parentItem + 0) or 0 + local parentRightItem = readInteger(parentItem + 8) or 0 + + local validParent = + parentLeftItem == address + or parentRightItem == address + if (not validParent) then return false end + + local tries = 0 + local lastChecked = parentItem + local parentsParent = readInteger(parentItem + 4) or 0 + while (readInteger(parentsParent + 4) ~= lastChecked and tries < 200) do + tries = tries + 1 + lastChecked = parentsParent + parentsParent = readInteger(parentsParent + 4) or 0 + end + + return readInteger(parentsParent + 4) == lastChecked +end + + +function isValueInMap(valueAddress) + for address = valueAddress - 12, valueAddress - 52, -4 do + if (_verifyMap(address)) then + return address + end + end + return 0 +end + +local node = isValueInMap(addressOfSomeValue) +if (node > 0) then + print(string.format("Value in map, top of node at 0x0%x", node)) +end \ No newline at end of file