6.6 KiB
Static .NET DB wrapper analysis for MsgLib.db
Date: 2026-07-10
Question
Can the copied MsgLib.db files be opened through the same .NET wrapper path used by the iSphere/IMPP client, and which tables/fields are likely to unlock contact, group, message, and file metadata?
Evidence checked
Ignored read-only IL/metadata generated from the copied archive:
runs/offline-evidence-intake/zyl-qqfile-20260709/metadata/c25-il/HYHC.IMPP.DAL.dll.ilruns/offline-evidence-intake/zyl-qqfile-20260709/metadata/c25-il/Utilities.Lib.DBBase.dll.ilruns/offline-evidence-intake/zyl-qqfile-20260709/metadata/c25-il/Utilities.Lib.DBModel.dll.ilruns/offline-evidence-intake/zyl-qqfile-20260709/metadata/c25-il/Utilities.Lib.DBSQLite.dll.ilruns/offline-evidence-intake/zyl-qqfile-20260709/metadata/c25-il/Utilities.Lib.SQLiteInteraction.dll.ilruns/offline-evidence-intake/zyl-qqfile-20260709/metadata/c25-il/RepairDatabase.exe.ilruns/offline-evidence-intake/zyl-qqfile-20260709/metadata/c25-il/IMPP.Model.dll.ilruns/offline-evidence-intake/zyl-qqfile-20260709/metadata/c25-wrapper-il-summary.json
IMPP.Model.dll, Utilities.Lib.DBBase.dll, and Utilities.Lib.SQLiteInteractionBase.dll were added to the C25 static inspection because the original C24 wrapper candidates reference them directly. No client executable was run, no original DB was modified, and no raw DB bytes/decrypted message content are committed.
Connection/password flow findings
HYHC.IMPP.DAL.IMPPDALis the client DAL entry point forMsgLib.db. Its private constructor acceptsdbPathanduserInfoDomain, creates aDBConfigElement, and configures:DBID = 0x1a0a;DBConInfoType = 1;DatabaseName = dbPath;Password = "123";ConName = Path.GetFileName(dbPath);DBFactory = "Utilities.Lib.DBSQLite.Core.SQLiteDBFactory,Utilities.Lib.DBSQLite".
- The same constructor registers the config through
ConfigManager.AddConfigItem(...), obtains_dbAccessthroughDBAccessManager.GetDBAccessInstance(DBID), and checks the DB withIsDBDamage(dbPath)when the file exists. Utilities.Lib.DBBase.Base.DBInteractionBase.GetDBConStr(...)is the central connection-string switch:- if
DBConfigElement.Decryptionis empty andDBConInfoType == 0, it usesConStrdirectly; - if
DBConfigElement.Decryptionis empty andDBConInfoType != 0, it callsGenerateDBConStr(config, visitType); - if
Decryptionis set, it instantiates anIConStrDecryptionimplementation and delegatesGetDBConStr(config, visitType)to it.
- if
Utilities.Lib.SQLiteInteraction.Interaction.GenerateDBConStr(...)constructs aSystem.Data.SQLite.SQLiteConnectionStringBuilderand, for the DAL path above, sets:Pooling = true;DataSource = GetFullPath(DatabaseName);Password = DBConfigElement.Passwordwhen non-empty;ReadOnly = true;- then returns the builder
ConnectionString.
Utilities.Lib.SQLiteInteraction.Interaction.GetConnection(...)createsSystem.Data.SQLite.SQLiteConnection(connectionString).Utilities.Lib.DBSQLite.Core.SQLiteInteraction.CreateReadConnection(...)callsGetDBConStr(config, DBVisitType)and thenGetConnection(...).
Candidate table/model findings
The static IL gives enough table and model names to target schema-only DB extraction next.
Message and conversation tables
tblMsgGroupPersonMsgis the main group/discussion message table. Static SQL references include create/insert/update/select paths for:Id,SndPerson,SndPersonId,MsgType,MsgText,MsgFont,MsgTime;MsgGroupId,MsgGroupName,SessionTitle,SessionPersonId,SessionPersonName,GroupType;MsgReadState,MsgRecaptionState,IsReceipt,MessageBody,InterOut,MsgContent,MsgVersion,MsgReadStatus;- later-added fields such as
ReadMembers,UnreadTotal, andMemInfoVersion.
tblPersonMsgis the main one-to-one message table. Static SQL/model fields include sender, receiver, object person, message text/body/content/version/read state, and receipt state fields.tblRecentlikely stores recent conversation entries; model fields includePersonIdandPersonName.
Contact and display-name sources
TD_Rosteris explicitly queried withJId,Nick,Ask,Subscription,Show,Status, andGroupName.tblChatLevelhasPersonIdandPersonNamefields.tblRecenthasPersonIdandPersonNamefields.CustomEffigyModelincludesPersonJid,PersonName,PersonSex, avatar/local path style fields.
Group and member-display sources
tblMsgGroupPersonMsgprovidesMsgGroupId,MsgGroupName,SessionPersonId,SessionPersonName,GroupType, and read/member summary fields.TD_WorkGroupAuthhas create/update/select evidence and modelWorkGroupAuthcontainsGroupJID,GroupName,SendPersonJid,SendPersonName, andChildGroupJid.GetDiscussMemberNames(groupJid)queries distinctSessionPersonIdfromtblMsgGroupPersonMsgbyMsgGroupId.
File metadata candidates
tblRecvFileand the receive/send file models exposeFileName, file id/path-like fields,SndPerson,SndPersonId, and sender/receiver display-name fields.- Group file-message insert/update paths write file-transfer references through
tblMsgGroupPersonMsg.
Decision
C25 recovered the wrapper route. The next safe path is no longer blind DB-format guessing.
High-confidence local hypothesis:
A copied
MsgLib.dbshould be attempted through the exact bundledSystem.Data.SQLite.dllpath with a read-only connection string equivalent toData Source=<copied MsgLib.db>;Password=123;Read Only=True;Pooling=Falseor the wrapper-generated equivalent.
C26 can attempt read-only schema extraction from copied DB files under ignored paths. C26 should only query schema/table/column names and row counts first; it must not dump message bodies, personal values, or write to any DB.
If the direct read-only System.Data.SQLite open fails, the next fallback is to record the exact exception and use the DAL/wrapper path as the reference for a wrapper-assisted schema-only probe.
Next slice
Loop C26 should perform copied-DB read-only schema extraction:
- Use the bundled
System.Data.SQLite.dllfrom the extracted iSphere client files. - Open only copied DB files under
runs/offline-evidence-intake/.../extracted/msgdb-*. - Use the recovered password
123and force read-only mode. - Query
sqlite_masterandPRAGMA table_info(...)for target tables only. - Save schema metadata under ignored
runs/.../metadata/and commit only docs/matrix/status updates.