simplify try/catch std impl

This commit is contained in:
hyugogirubato
2026-04-28 20:51:08 +02:00
parent 0690170b85
commit fa4b80376a
-20
View File
@@ -68,37 +68,28 @@ Memory.readStdString = function (address) {
// [char* _M_p][size_t length][SSO buf 16B or capacity]
// _M_p always points to the data (heap or local SSO buffer).
Memory.readStdStringGnuCxx11 = function (address) {
try {
const dataPtr = address.readPointer();
if (dataPtr.isNull() || dataPtr.compare(ptr(0x1000)) < 0) return null;
const length = address.add(Process.pointerSize).readU32();
if (length === 0 || length > 0x10000000) return null;
return Memory.readByteArray(dataPtr, length);
} catch (e) {
return null;
}
}
// libstdc++ classic (pre-C++11) COW std::string:
// [char* _M_p @+0] + _Rep header before data: [length][capacity][refcount]
// Container is a single pointer; length sits 3*pSize before the data.
Memory.readStdStringGnuCow = function (address) {
try {
const dataPtr = address.readPointer();
if (dataPtr.isNull() || dataPtr.compare(ptr(0x1000)) < 0) return null;
const length = dataPtr.sub(3 * Process.pointerSize).readU32();
if (length === 0 || length > 0x10000000) return null;
return Memory.readByteArray(dataPtr, length);
} catch (e) {
return null;
}
}
// 24-byte vector-style std::string (old MediaTek/ARMv7 Widevine):
// [SSO buf 12B][cap/alloc ptr][char* _M_finish][char* _M_start] (offsets 0/12/16/20)
// Length = _M_finish - _M_start (matches IDA *((_DWORD*)s+5)==*(s+4) empty check).
Memory.readStdStringRange = function (address) {
try {
const finish = address.add(16).readPointer();
const start = address.add(20).readPointer();
if (start.isNull() || start.compare(ptr(0x1000)) < 0) return null;
@@ -106,9 +97,6 @@ Memory.readStdStringRange = function (address) {
const length = finish.sub(start).toInt32();
if (length === 0 || length > 0x10000000) return null;
return Memory.readByteArray(start, length);
} catch (e) {
return null;
}
}
// Try every known std::string ABI and return the first plausible result.
@@ -154,22 +142,17 @@ Memory.readStdVector = function (address) {
// [vptr][void* mStorage][size_t mCount][uint32_t mFlags][size_t mItemSize]
// Data ptr = mStorage @+pSize, byte count = mCount @+2*pSize (T = uint8_t).
Memory.readAndroidVector = function (address) {
try {
const dataPtr = address.add(Process.pointerSize).readPointer();
if (dataPtr.isNull() || dataPtr.compare(ptr(0x1000)) < 0) return null;
const count = address.add(2 * Process.pointerSize).readU32();
if (count === 0 || count > 0x10000000) return null;
return Memory.readByteArray(dataPtr, count);
} catch (e) {
return null;
}
}
// std::vector<T> (libc++ and libstdc++ C++11):
// [pointer begin][pointer end][pointer capacity_end]
// For vector<uint8_t> the byte count is end - begin.
Memory.readStdVectorRange = function (address) {
try {
const begin = address.readPointer();
const end = address.add(Process.pointerSize).readPointer();
if (begin.isNull() || begin.compare(ptr(0x1000)) < 0) return null;
@@ -177,9 +160,6 @@ Memory.readStdVectorRange = function (address) {
const length = end.sub(begin).toInt32();
if (length === 0 || length > 0x10000000) return null;
return Memory.readByteArray(begin, length);
} catch (e) {
return null;
}
}
// Try every known vector layout and return the first plausible result.