include("addresses.lua"); include("functions.lua"); local filename = getExecutionPath() .. "/newaddresses.lua"; local cloneAddresses = addresses; local finalAddresses; --[[updatePatterns format addressname = { Required: pattern The pattern, obviously. mask ...The mask? Optional: startloc Where to start the search, in bytes (default: 0x400000) offset Offset from the start of the pattern that the requested data exists (default: 0) searchlen The length, in bytes, to continue searching (default: 0xA0000) size The length, in bytes, of the data (default: 4) } addressname = { addresssubname = { pattern mask } } ]] local updatePatterns = { client_exe_module_start = { pattern = string.char(0x4D, 0x5A, 0x90, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xB8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00), mask = "xxxxxxxxxxxxxxxxxxxxxxxxxxx", }, speedhack = { speed = { base = { pattern = string.char(0x00, 0x00, 0xA0, 0x40, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00), mask = "xxxx????xxx??????????x", offset = -256, startloc = 0xA01000, searchlen = 0x10000, }, }, }, game_time = { pattern = string.char(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00), mask = "xxxxxxxxxxxxxxxx", offset = 16, }, player_name = { pattern = string.char(0xFF, 0xFF, 0xE6, 0xEE, 0xFF, 0xFF, 0x64, 0x68, 0x59, 0x63, 0x50, 0x5E, 0x5E, 0x61, 0x6B, 0x66, 0x5F, 0x64, 0x64, 0x64, 0x64, 0x00, 0xE9, 0x03, 0x00, 0x00), mask = "?x???x???????????x?xxx?xxx", offset = -82, }, in_game = { pattern = string.char(0x00, 0x65, 0x00, 0x00, 0x65, 0x00, 0x65, 0x6E, 0x74, 0x00, 0x00, 0x4D, 0x69, 0x64, 0x64, 0x6C, 0x65, 0x00, 0x65, 0x00), mask = "xxxxxxxxxxxxxxxxxxxx", offset = 240, }, zone_id = { pattern = string.char(0x44, 0x40, 0xF6, 0x28, 0x3C, 0x40), mask = "xxxxxx", offset = 130, }, buff_count = { pattern = string.char(0xFF, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF), mask = "?xxx?xxxxxxxxxxxxxxxxxxxxxx?", }, channel = { base = { pattern = string.char(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0xFF, 0xFF, 0x00, 0xBC, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), mask = "xxxxxxxxxxxxxx??xx??xxxxxxxxxxxx", offset = 16, }, }, --[[ -- couldn't find anything class_info = { base = { pattern = string.char(), mask = "", }, }, crafting = { base = { pattern = string.char(), mask = "", }, }, ]]-- code_mod = { freeze_target = { base = { pattern = string.char(0x89, 0x86, 0x78, 0x02, 0x00, 0x00, 0x8B, 0x0D, 0xFF, 0x3D, 0xA6, 0x00, 0x85, 0xC9, 0x74, 0x0A), mask = "xxxxxxxx?xxxxxxx", }, }, freeze_mousepos = { base = { pattern = string.char(0x89, 0x8E, 0xB4, 0x03, 0x00, 0x00, 0x89, 0x86, 0xB8, 0x03, 0x00, 0x00), mask = "xxxxxxxxxxxx", }, }, freeze_mousepos2 = { base = { pattern = string.char(0x89, 0x86, 0xB8, 0x03, 0x00, 0x00, 0xDB, 0x86, 0xB4, 0x03, 0x00, 0x00, 0x8B, 0x4E, 0x78, 0x85), mask = "xxxxxxxxxxxxxxxx", }, }, swimhack = { base = { pattern = string.char(0xC7, 0x83, 0xB4, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xC7, 0x83, 0xBC, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x89, 0x83, 0xC0, 0x00, 0x00, 0x00, 0xE9, 0x1E, 0xFF, 0xFF, 0xFF, 0x8D), mask = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", }, }, }, exp_table = { pattern = string.char(0x00, 0x5B, 0xFF, 0xFF, 0x40, 0x61, 0xFF, 0xFF, 0x98, 0x61, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xB0, 0xFD, 0xFF, 0xFF, 0xB1), mask = "xx??xx??xx??xxxxxx??x", }, psi = { pattern = string.char(0x6B, 0xA0, 0x00, 0xFF, 0xC1, 0xA0, 0x00, 0xFF, 0x22, 0xA2, 0x00, 0xD2, 0x02, 0x96, 0x49), mask = "xxx?xxx?xxxxxxx", offset = -53, }, global_cooldown = { pattern = string.char(0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xD7, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00), mask = "xxxxxxxxxxxx????x", startloc = 0xA00000, offset = 16, }, actionbar = { base = { pattern = string.char(0x20, 0xBC, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x2D, 0xFF, 0xFF, 0x00), mask = "xx??xxxxxxxxxxxx?x??x", offset = 160, }, }, game_root = { base = { pattern = string.char(0x00, 0xC0, 0xFF, 0x0FF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x01), mask = "xx??xxxxxxxxxxxxxxxxxxxxxxxx??x?xxxxxxxxxxxxxxxxxxxxx", }, gold = { pattern = string.char(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00), mask = "xxxxxxxxxxxxxxxx", startloc = 0xA00000, searchlen = 0x20000, offset = 16, }, }, macro = { base = { pattern = string.char(0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xD4, 0xFF, 0xFF, 0x00), mask = "xx??xxxxxxxxxxxxxx??x", }, }, hotkey = { base = { pattern = string.char(0x80, 0x9A, 0xFF, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD5), mask = "xx?xxxxxxxxxxxxxxx", offset = 52, }, }, loading = { base = { pattern = string.char(0x00, 0xF0, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x99, 0xA8, 0x08), mask = "xx??xxxxxxxxxxxxxx?x", }, }, cooldowns = { base = { pattern = string.char(0xD2, 0x02, 0x96, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF), mask = "xxxxxxxxxxxxxxxxxxxxxxxxxxxx", offset = -236, }, }, skillbook = { base = { pattern = string.char(0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xFD, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xFD, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), mask = "?xxxxxxxxx???xxxxxxxxx???xxxxxxx", offset = 48, }, }, --[[ -- 0xA1E900 might be more reliable -- current one, somewhat unreliable itemset_skills = { base = { pattern = string.char(0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3F, 0x00, 0x00, 0x80, 0x3F, 0x00, 0x00, 0x80, 0x3F, 0x00, 0x00, 0x80, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), mask = "xxxx?xxxxxxxxxxxxxxxxxxx?xxxxxxx", offset = 6896, }, }, ]]-- memdatabase = { base = { pattern = string.char(0x70, 0xF5, 0xFF, 0xFF, 0xD8, 0xF5, 0x22, 0x01, 0xD8, 0xF5), mask = "xx??xx??xx", offset = 4, }, }, equipment = { base = { pattern = string.char(0x64, 0x64, 0x64, 0x64, 0x00, 0xE9, 0x03, 0x00, 0x00), mask = "xxxxx?xxx", offset = 41, }, }, bank = { base = { pattern = string.char(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00), mask = "xxxxxxxxxxxxxxxx", startloc = 0xA00000, searchlen = 0x20000, offset = 28, }, open = { base = { pattern = string.char(0x00, 0xF0, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x2A, 0xFF, 0xFF, 0x00), mask = "xx??xxxxxxxxxxxx?x??x", offset = 16, }, }, rent = { base = { pattern = string.char(0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x5E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), mask = "xxxx???xxxxxxxxx", offset = 1328, }, }, guild = { base = { pattern = string.char(0xC0, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x9A, 0xFF, 0xFF, 0x00), mask = "xx????xxxx??x", offset = 8, }, }, }, inventory = { base = { pattern = string.char(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x42, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0x42, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00), mask = "xxxxxxxxxx??xx?xxx??xx", offset = 13968, }, bag_ids = { base = { pattern = string.char(0x00, 0xFF, 0x26, 0x48, 0x0A, 0x2A, 0x09, 0xEA, 0xFF, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00), mask = "x???????xx?????x", offset = 432, }, }, rent ={ base = { pattern = string.char(0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x5E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), mask = "xxxx???xxxxxxxxx", offset = 1288, }, }, }, cursor = { base = { pattern = string.char(0x80, 0x9A, 0xFF, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD5), mask = "xx?xxxxxxxxxxxxxxx", offset = 16, }, }, object_list = { base = { pattern = string.char(0xFF, 0x4A, 0xFF, 0xFF, 0x00, 0x87, 0xFF, 0xFF, 0xFF, 0xFF, 0x5E, 0x00, 0x00, 0x00, 0x00, 0x00), mask = "?x??xx????xxxxxx", offset = 84, }, size = { pattern = string.char(0xFF, 0x4A, 0xFF, 0xFF, 0x00, 0x87, 0xFF, 0xFF, 0xFF, 0xFF, 0x5E, 0x00, 0x00, 0x00, 0x00, 0x00), mask = "?x??xx????xxxxxx", offset = 80, }, }, input_box = { base = { pattern = string.char(0x00, 0xF6, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0x00), mask = "xx??xxxxxxxxxxxxxx???x", }, }, text = { base = { pattern = string.char(0x00, 0x80, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00), mask = "xx???xxxxxxxxxxx", }, }, mouse = { base = { pattern = string.char(0x25, 0x22, 0x9E, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x60, 0x00, 0x24, 0xDC, 0x19, 0x00, 0x00, 0xEA), mask = "xxxxxxxx??xxxxxxxx", offset = 12, }, }, } function patternToHex(pattern) local hex = ""; for i=1, #pattern do hex = hex .. "0x" .. string.format("%02X", string.byte(pattern:sub(i,i))); if (i < #pattern) then hex = hex .. ", "; end end return hex; end function findPattern(details, addressname) local pattern = details["pattern"]; local mask = details["mask"]; local startloc = details["startloc"] or 0x400000; local searchlen = details["searchlen"] or 0xF00000; local offset = details["offset"] or 0; local size = details["size"] or 4 local address; local found = findPatternInProcess(getProc(), pattern, mask, startloc, searchlen) + offset; if (found ~= cloneAddresses["client_exe_module_start"]) then found = found - cloneAddresses["client_exe_module_start"]; end if (found < 1) then cprintf(cli.lightred, "Couldn't update address " .. addressname .. "\n"); cprintf(cli.yellow, "\tPattern: " .. patternToHex(pattern) .. "\n"); cprintf(cli.yellow, "\tMask: " .. mask .. "\n"); else address = found; printf("Updated " .. addressname .. " with value 0x" .. string.format("%X", address) .. "\n"); end return address; end function updateAddresses() local tmpAddress; for address1,value1 in pairs(updatePatterns) do if (type(value1) == 'table' and value1["pattern"] == nil) then for address2,value2 in pairs(value1) do if (type(value2) == 'table' and value2["pattern"] == nil) then for address3,value3 in pairs(value2) do if (type(value3) == 'table' and value3["pattern"] == nil) then for address4,value4 in pairs(value3) do if (type(value4) == 'table' and value4["pattern"] == nil) then error("You went too deep into the rabbit hole"); else tmpAddress = findPattern(updatePatterns[address1][address2][address3][address4], address1.."."..address2.."."..address3.."."..address4); if (tmpAddress ~= nil) then cloneAddresses[address1][address2][address3][address4] = tmpAddress; end end end else tmpAddress = findPattern(updatePatterns[address1][address2][address3], address1.."."..address2.."."..address3); if (tmpAddress ~= nil) then cloneAddresses[address1][address2][address3] = tmpAddress; end end end else tmpAddress = findPattern(updatePatterns[address1][address2], address1.."."..address2); if (tmpAddress ~= nil) then cloneAddresses[address1][address2] = tmpAddress; end end end else tmpAddress = findPattern(updatePatterns[address1], address1); if (tmpAddress ~= nil) then cloneAddresses[address1] = tmpAddress; end end end end function generateFileString(addressTable, depth) local depthString = ""; for i=1,depth do depthString = depthString .. "\t"; end depth = depth + 1; for address,value in pairs (addressTable) do if (type(value) == 'table') then finalAddresses = finalAddresses .. depthString .. address .. " = {\n"; generateFileString(value, depth); finalAddresses = finalAddresses .. depthString .. "},\n"; elseif (type(value) == 'string') then finalAddresses = finalAddresses .. depthString .. address .. " = string.char(" .. patternToHex(value) .. "),\n" else finalAddresses = finalAddresses .. depthString .. address .. " = 0x" .. string.format("%X", value) .. ",\n"; end end end function writeFile(fileString); local file = io.open(filename, "w"); file:write(sprintf(fileString)); file:close(); end function updateAll() updateAddresses(cloneAddresses); finalAddresses = "-- Auto-generated by update.lua\naddresses = {\n"; generateFileString(cloneAddresses, 1) finalAddresses = finalAddresses .. "}\n-- Auto-generated by update.lua"; writeFile(finalAddresses); end updateAll();