--by.神之名 --交流群:237380601 --以神之名,你还愿意吗 local abc = { pointers = {}, strings = {}, types = {}, metadata = {} } local dlli=0 local lmxl=0 local function val(addresses) if not addresses or #addresses == 0 then return {} end local suc, results = pcall(gg.getValues, addresses) if not suc or type(results) ~= "table" then return {} end for i, v in ipairs(addresses) do abc.pointers[v.address..':'..v.flags] = results[i].value end return results end local function getName(addr) if abc.strings[addr] then return abc.strings[addr] end local bytes = {} for i = 0, 127 do bytes[i+1] = {address = addr + i, flags = gg.TYPE_BYTE} end bytes = val(bytes) local buffer = {} for i = 1, 128 do local v = bytes[i].value if v == 0 then break end if v < 0 then abc.strings[addr] = "" return "" end buffer[#buffer+1] = string.char(v & 0xFF) end abc.strings[addr] = table.concat(buffer) return abc.strings[addr] end local function getPointer(Address, Flags) local key = Address..":"..Flags if not abc.pointers[key] then abc.pointers[key] = val({{address = Address, flags = Flags}})[1].value end return abc.pointers[key] end local function aycXa(lib) ranges = {} for i, v in pairs(gg.getRangesList(lib)) do modjs = v.type:sub(2, 3) if modjs == '-x' then table.insert(ranges, v) end end return ranges[1].start end local xa=aycXa("libil2cpp.so") local function va(address, Type) local result = val({{address = address, flags = Type}}) return result[1].value end local function fastest() return gg.getRangesList("global-metadata.dat") end local function faster() local allRanges = gg.getRangesList() local stringOffset = {} local strStart = {} for i, v in ipairs(allRanges) do stringOffset[i] = {address=v.start+0x18, flags=gg.TYPE_DWORD} end stringOffset = gg.getValues(stringOffset) for i, v in ipairs(allRanges) do strStart[i] = {address=v.start+stringOffset[i].value, flags=gg.TYPE_DWORD} end strStart = gg.getValues(strStart) for i, v in ipairs(strStart) do if v.value==0x6F63736D then return {allRanges[i]} end end return {} end local function fast() local searchMemoryRange = { gg.REGION_C_ALLOC, gg.REGION_ANONYMOUS, gg.REGION_OTHER, } gg.clearResults() for i, v in ipairs(searchMemoryRange) do gg.setRanges(v) gg.searchNumber("h 00 67 65 74 5F 66 69 65 6C 64 4F 66 56 69 65 77 00", gg.TYPE_BYTE, false, gg.SIGH_EQUAL, 0, -1, 1) local res = gg.getResults(gg.getResultsCount()) gg.clearResults() if #res>0 then for ii, vv in ipairs(gg.getRangesList()) do if res[1].address < vv["end"] and res[1].address > vv["start"] then return {vv} end end end end return {} end local function get_metadata() local findingMethods = { [1] = fastest, [2] = faster, [3] = fast, } local metadata = {} for i=1, 3 do metadata = findingMethods[i]() if #metadata>0 then return metadata end end return {} end local metadata=get_metadata() local met={} local b66=metadata[1]["start"]+0x18 local c66=va(b66,4) local c166=metadata[1]["start"]+c66 table.insert(met,{address=c166,flags=4}) function fflx(a2) if abc.types[a2] then return abc.types[a2] end local a1 = getPointer(a2,32) local a3 = getPointer(a1,32) local a4 = va(a1,4) local a5 = met[1].address+a4 local a6 = getName(a5) local add = val({{address = a2 + 0xA, flags = 1}})[1].value local typeMap = { [1] = "void", [2] = "bool", [3] = "char", [4] = "sbyte", [5] = "byte", [6] = "short", [7] = "ushort", [8] = "int", [9] = "uint", [10] = "long", [11] = "ulong", [12] = "float", [13] = "double", [14] = "string", [22] = "TypedReference", [24] = "IntPtr", [25] = "UIntPtr", [28] = "object" } abc.types[a2] = typeMap[add] or a6 return abc.types[a2] end local function zdlx(d3) if abc.types[d3] then return abc.types[d3] end local bg = getPointer(d3, 32) local gf = getPointer(bg, 32) local bg1 = va(bg, 4) local bg2 = met[1].address + bg1 local bg3 = getName(bg2) local add = val({{address = d3 + 0xA, flags = 1}})[1].value local typeMap = { [1] = "void", [2] = "bool", [3] = "char", [4] = "sbyte", [5] = "byte", [6] = "short", [7] = "ushort", [8] = "int", [9] = "uint", [10] = "long", [11] = "ulong", [12] = "float", [13] = "double", [14] = "string", [22] = "TypedReference", [24] = "IntPtr", [25] = "UIntPtr", [28] = "object" } abc.types[d3] = typeMap[add] or bg3 return abc.types[d3] end local function xsf(a2) local ad = getPointer(a2, 32) + 0x18 local ad2 = val({{address=a2+0x18,flags=4}})[1].value local fff = ad2 & 7 if fff == 6 then return "public" elseif fff == 2 or fff == 3 then return "internal" elseif fff == 1 then return "private" elseif fff == 4 then return "protected" elseif fff == 5 then return "protected internal" else return "" end end local function lmxsf(d2) local ad = d2 + 0x68 local ad2 = getPointer(ad, 32) + 0x1C local ad3 = val({{address=ad2,flags=4}})[1].value local fff = ad3 & 7 if fff == 1 or fff == 2 then return "public" elseif fff == 5 or fff == 6 or fff == 0 then return "internal" elseif fff == 3 then return "private" elseif fff == 4 then return "protected" elseif fff == 7 then return "protected internal" else return "" end end local function zdxsf(b1) local b11 = va(b1+0x8,1) local b12 = b11 & 7 if b12 == 6 then return "public" elseif b12 == 2 or b12 == 3 then return "internal" elseif b12 == 1 then return "private" elseif b12 == 4 then return "protected" elseif b12 == 5 then return "protected internal" else return "" end end gg.clearResults() gg.setRanges(4|-2080896|32) gg.searchNumber("Q00'".."mscorlib.dll".."'00", gg.TYPE_BYTE, false, gg.SIGN_EQUAL, 0, -1) local results = gg.getResults(gg.getResultsCount()) local firstChar = string.sub("mscorlib.dll", 1, 1) local function readString(address) local str = "" local offset = 0 while true do local byte = gg.getValues({{address = address + offset, flags = gg.TYPE_BYTE}})[1].value if byte == 0 then break end if byte < 0 then byte = byte + 256 end str = str .. string.char(byte) offset = offset + 1 end return str end local agg={} for i, v in ipairs(results) do local add = v.address local strValue = readString(add) if string.sub(strValue, 1, 1) == firstChar then table.insert(agg,{address=add,flags=1}) end end gg.loadResults(agg) gg.searchPointer(0) local re=gg.getResults(100) local add=re[1].address local dll={} local xx={} local i=1 for _,bb in ipairs(re) do local a3=bb.address while true do local a4=getPointer(a3,32) local a5=getName(a4) table.insert(dll,a5) table.insert(xx,"// Image "..i..": "..a5) if not a5:find(".dll") then break end a3=a3+0x48 i=i+1 end end local xxk=table.concat(xx,"\n") local hasMscorlib = false for _, dll in ipairs(dll) do if dll == "mscorlib.dll" then hasMscorlib = true break end end if hasMscorlib then table.insert(dll, 1, "mscorlib.dll") end for _,dl in ipairs(dll) do gg.searchNumber("Q00'" .. dl .. "'00", gg.TYPE_BYTE, false, gg.SIGN_EQUAL, 0, -1) local time=os.clock() local results = gg.getResults(gg.getResultsCount()) local firstChar = string.sub(dl, 1, 1) local function readString(address) local str = "" local offset = 0 while true do local byte = gg.getValues({ { address = address + offset, flags = gg.TYPE_BYTE } })[1].value if byte == 0 then break end str = str .. string.char(byte) offset = offset + 1 end return str end local all = {} for i, v in ipairs(results) do local add = v.address local strValue = readString(add) if string.sub(strValue, 1, 1) == firstChar then local ffm = gg.getValues({ { address = add, flags = 1 } }) table.insert(all, ffm[1]) end end if #all > 0 then gg.setRanges(4|-2080896|32) gg.loadResults(all) gg.searchPointer(0) gg.searchPointer(0) local tar = gg.getTargetInfo() local Name = gg.getTargetInfo()["activities"][1]["label"] local zz = gg.getResults(gg.getResultsCount()) local file = io.open(Name..".cs", "a") file:write(xxk.."\n") gg.toast("正在输出至本目录:"..Name) local lm = {} for _, item in ipairs(zz) do local gb = item.address local lmname = getName(getPointer(gb + 0x10, 32)) or "" if (lmname:find("`1") or lmname:find("`2") or lmname:find("%[%]")) then goto continue end lm[lmname] = true local Dumpzd = {} local Dumpff = {} local zd1 = getPointer(gb + 0x80, 32)--字段获取 if zd1 ~= 0 then for b1 = 0, 99999 do local b0 = zd1 + b1 * 0x20 local b2 = getPointer(b0 + 0x00, 32) if namePtr == 0 then break end local zdname = getName(b2) if zdname == "" then break end local b4 = getPointer(b0 + 0x8, 32) local zdlx = zdlx(b4) local zdxsf = zdxsf(b4) local offset = va(b0 + 0x18, 4) table.insert(Dumpzd, string.format("%s %s %s; // 0x%X",zdxsf, zdlx, zdname, offset)) end end local m1=gb+0x98--方法获取 local bv=va(m1,4) if bv~="0" then local f1 = getPointer(m1, 32) for ff0 = 0, 99999 do local ff1 = f1 + ff0 * 0x8 local m4=getPointer(ff1,32) local name = getPointer(m4+0x10,32) local ffname = getName(name) local ff2 = getPointer(m4 + 0x20, 32) local xsf2 = getPointer(m4 + 0x30, 32) if ffname == "" then name = getPointer(m4+0x18,32) ffname = getName(name) ff2 = getPointer(m4 + 0x28, 32) xsf2 = getPointer(m4 + 0x38, 32) end if ffname == "" then break end local fflx = fflx(ff2) local ffxsf = xsf(xsf2) local m5=getPointer(m4,32) local rva = m5 - xa local off = string.format("%X",rva) if #off<7 then table.insert(Dumpff, string.format(" // RVA: 0x%X Offset: 0x%X VA: 0x%X\n %s %s %s() { }", rva, rva, rva, ffxsf, fflx, ffname)) end end lmxl=lmxl+1 gg.toast("✔进度["..lmxl.."/"..#zz.."]") end local c1=getPointer(gb+0x58,32) +0x10 local c2=getName(getPointer(c1,32)) local fl = c2 or "object" local out = string.format([[ // DLL: %s %s class %s : %s { // Fields %s // Methods %s }]], dl, lmxsf(gb), lmname, fl, #Dumpzd > 0 and table.concat(Dumpzd, "\n ") or "", #Dumpff > 0 and table.concat(Dumpff, "\n\n") or "") file:write(out.."\n\n") ::continue:: end file:close() dlli=dlli+1 lmxl=0 gg.toast("已DumpDll["..dlli.."/"..#xx.."]") print("已DumpDll["..dlli.."/"..#xx.."]") gg.toast("输出成功") print(os.clock()-time.."秒") end end