Problem in parsing 2 files
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Idoneità per principianti
- 32/100
- Tipo di issue
- Bug
- Chiarezza
- Abbastanza chiara
- Stato di attività
- Ferma
- Stack tecnologico
- cpp
- Ambito
- operating-systems, reverse-engineering
Direzione di ricerca
Inizia riproducendo i malfunzionamenti con il pe-parse.zip allegato e traccia ParsePEFromPointer, getDebugDir e IterRsrc per System.Text.Json.dll e ConfKarat.exe. Confronta i dati delle risorse forniti al callback con la risorsa versione visibile nei file; il lavoro è completato quando entrambi gli eseguibili vengono analizzati senza il malfunzionamento segnalato e la risorsa versione prevista viene esposta correttamente.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Thanks for the great project! I'm trying to use it for reading versions from executables.
I've built it with Qt Creator, gcc, qbs (see my .qbs and .cpp files in the archive): pe-parse.zip
Most EXE and DLL files I've tried were parsed fine but two of them failed:
- System.Text.Json.dll - getDebugDir fails. Since this file has an Authenticode signature of .NET project, it's unlikely that the file is currupt.
- ConfKarat.exe - incorrect version resource is passed to IterRsrc callback. Windows explorer file properties box shows the version. I can also see the version in a hex editor. But res.buf->buf in my code doesn't point to anything containing VS_VERSION_INFO and 0xfeef04bd signature.
Here is my code:
struct MY_VS_FIXEDFILEINFO
{
quint32 dwSignature;
quint32 dwStrucVersion;
quint32 dwFileVersionMS;
quint32 dwFileVersionLS;
quint32 dwProductVersionMS;
quint32 dwProductVersionLS;
quint32 dwFileFlagsMask;
quint32 dwFileFlags;
quint32 dwFileOS;
quint32 dwFileType;
quint32 dwFileSubtype;
quint32 dwFileDateMS;
quint32 dwFileDateLS;
};
int extractVersionFromResourceCallback(void* ptr, const peparse::resource& res)
{
// Skip all resource types execpt RT_VERSION
if(res.type != 16) return 0;
// Find VS_FIXEDFILEINFO in the buffer
auto structSize = sizeof(MY_VS_FIXEDFILEINFO);
for(size_t offset = 0; offset + structSize <= res.size; offset += 4)
{
auto verInfo = (const MY_VS_FIXEDFILEINFO*)(res.buf->buf + offset);
if (verInfo->dwSignature == 0xfeef04bd)
{
QString& result = *(QString*)ptr;
result = QStringLiteral("%1.%2.%3.%4")
.arg(( verInfo->dwFileVersionMS >> 16 ) & 0xffff)
.arg(( verInfo->dwFileVersionMS >> 0 ) & 0xffff)
.arg(( verInfo->dwFileVersionLS >> 16 ) & 0xffff)
.arg(( verInfo->dwFileVersionLS >> 0 ) & 0xffff);
return 1;
}
}
// Maybe there's another version resource we'll understand
return 0;
}
...
// Have to use mutex because pe-parse library uses globals
static QMutex peparseMutex;
QMutexLocker locker(&peparseMutex);
// Try to parse PE
auto peptr = peparse::ParsePEFromPointer((std::uint8_t*)m_data.data(), m_data.size());
if (peptr == nullptr)
{
qWarning() << "Failed to parse PE. Code:" << peparse::GetPEErr() << endl
<< "Error:" << QString::fromStdString(peparse::GetPEErrString()) << endl
<< "Location:" << QString::fromStdString(peparse::GetPEErrLoc());
return QString();
}
// Make sure we cleanup properly
try
{
// Iterate resources
QString result;
peparse::IterRsrc(peptr, extractVersionFromResourceCallback, &result);
DestructParsedPE(peptr);
return result;
}
catch (...)
{
DestructParsedPE(peptr);
throw;
}
- Lingua principale
- C++
- Stelle
- 913
- Fork
- 171
- Metriche di merge delle PR
- Nessuna PR unita negli ultimi 30g
Preparare l'ambiente
- Include un Dockerfile o un file Docker Compose
- Nessun modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di trailofbits/pe-parse
-
Difficoltà 3/5 1-2 giorni Idoneità per principianti 48/100
trailofbits/pe-parse#216 ·
-
Difficoltà 3/5 1-2 giorni Idoneità per principianti 48/100
trailofbits/pe-parse#207 ·
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 35/100
trailofbits/pe-parse#201 ·
-
enhancement help wanted
Difficoltà 3/5 1-2 giorni Idoneità per principianti 45/100
trailofbits/pe-parse#188 · 1 commento ·
-
RIIRApertadiscussion
Difficoltà 5/5 Più di una settimana Idoneità per principianti 18/100
trailofbits/pe-parse#186 · 4 commenti · 1 reazione ·
Tutte le issue di trailofbits/pe-parse
Issue simili
-
Difficoltà 2/5 Mezza giornata Idoneità per principianti 84/100
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 84/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 1/5 1-3 ore Idoneità per principianti 88/100
ROCm/rocm-libraries#12703 ·
I maintainer di solito rispondono entro 2 giorni
-
bug
Difficoltà 1/5 1-3 ore Idoneità per principianti 88/100
isl-org/Open3D#7585 · 1 commento ·
I maintainer di solito rispondono entro 2 giorni
-
Feature request
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
qbittorrent/qBittorrent#24975 ·
I maintainer di solito rispondono entro 3 giorni