int _tmain(int argc, _TCHAR* argv[]) { int retVal(0); int arg = FindNextArg(argc, argv, 0); if (arg <= 0) { Help(); retVal = 1; } else { for (int i = 1; i < argc; ++i) _tprintf(_T("%s\n"), argv[i]); BinaryFind bf; { BinaryData findBuffer; findBuffer.BuildFromString(FindArgValue(argc, argv, _T("-f=")), FindArgValue(argc, argv, _T("-fs")) != NULL); if (findBuffer.DataSize() > 0) bf.SetFindPattern(findBuffer); } const TCHAR *fileOrString(argv[arg]); if (Path(fileOrString).Exists()) { Path filePath(fileOrString); HDFDCB_Data cbData = { argc, argv, bf }; if (filePath.IsDir()) { Finder f((FindCallBack)HEXDump_FindCallBack, &cbData, FindArgValue(argc, argv, _T("-mp=")), FindArgValue(argc, argv, _T("-ep="))); f.StartFind(fileOrString); } else { FindData fd(NULL, filePath, true); HEXDump_FindCallBack(fd, &cbData); } if (cbData.nFiles > 1) _tprintf(_T("Total files: %d\n"), cbData.nFiles); if (cbData.nFound > 1) { _tprintf(_T("Total files matching: %d\n"), cbData.nFound); if (cbData.nMaxMatchPerFile > 1) _tprintf(_T("max matching in a file : %d\n"), cbData.nMaxMatchPerFile); } } else { if (bf.HasFindPattern()) { bf.SetFindBuffer((const void *)fileOrString, _tcslen(fileOrString)*sizeof(fileOrString[0])); while (true) { long long findPos = bf.FindNext(); if (findPos >= 0) _tprintf(_T("%08llX\n"), findPos); else break; } } else HexDump((const void *)fileOrString, _tcslen(fileOrString)*sizeof(fileOrString[0])); } } return retVal; }
size_t BinaryData::Append(const BinaryData &inData) { if (inData.DataSize() == 0) return 0; if (m_pBuffer != NULL) SetData(m_pBuffer, DataSize()); if (Size() - DataSize() < inData.DataSize()) { mBuffer.resize(Size() + inData.DataSize(), 0); mBufferSize = mBuffer.size(); } memcpy_s((void *)(*this + DataSize()), Size() - DataSize(), inData, inData.DataSize()); mDataSize += inData.DataSize(); return DataSize(); }
int BinaryData::Compare(const BinaryData & inData) const { int diff((int)DataSize() - (int)inData.DataSize()); if (!diff && DataSize() > 0) diff = memcmp((const void *)*this, (const void *)inData, DataSize()); return diff; }
bool CPdfFileRecover::ParseBuffer(BinaryData &inData) { switch (GetState()) { case ReadTillEndOffset: { mObjFind.SetFindBuffer(inData, true); long long findPos(mObjFind.FindNext()); bool bEndFound(findPos < 0); // obj found // check all character from start till obj should be printable for (size_t i = 0; i < (size_t)findPos && !bEndFound; ++i) { char ch(inData[i]); if (!STR_CHAR_IS_SPACE(ch) && !isprint(ch)) bEndFound = true; } if (!bEndFound) { m_iCurrrentEndPatternSkipCount = 0; SetState(FindEnd); } else { for (m_iCurrentEndOffset = 0; m_iCurrentEndOffset < (int)inData.DataSize(); ++m_iCurrentEndOffset) { char ch(inData[m_iCurrentEndOffset]); if (!(STR_CHAR_IS_SPACE(ch))) break; } if (m_iCurrentEndOffset > 0 && m_iCurrentEndOffset == inData.DataSize()) // Reach end of buffer and all isprint found ++m_iCurrentEndOffset; // increment 1 to check more isprint from next buffer } } break; default: break; } return __super::ParseBuffer(inData); }
static long long HexDump(const BinaryData &buffer, long long startAddress = 0) { _tprintf(_T("%s"), buffer.HexDump(startAddress).c_str()); return startAddress + buffer.DataSize(); }