1,184
社区成员
发帖
与我相关
我的任务
分享DWORD CAXPFile::HashString(const char *lpszFileName, DWORD dwCryptIndex)
{
signed char *key = (signed char *)lpszFileName;
DWORD seed1 = 0x7FED7FED, seed2 = 0xEEEEEEEE;
signed int ch;
while(*key != 0)
{
ch = *key++;
seed1 = m_CryptTable[(dwCryptIndex<< 8) + ch] ^ (seed1 + seed2);
seed2 = ch + seed1 + seed2 + (seed2 << 5) + 3;
}
return seed1;
}BOOL CAXPFile::GetHashTablePos(const char *lpszString, int *lpFileOffset, int *lpFileSize)
{
const int HASH_A = 1, HASH_B = 2, HASH_OFFSET = 3;
int nHashA = HashString(lpszString, HASH_A);
int nHashB = HashString(lpszString, HASH_B);
int nHash = HashString(lpszString, HASH_OFFSET);
nHash &= 0x7FFF;
int nHashStart = nHash, nHashPos;
try
{
while (!((nHashPos = ((int*)m_lpAxpHashTable)[nHashStart * 3 + 2]) & 0x80000000) ||\
nHashA != ((int*)m_lpAxpHashTable)[nHashStart * 3] ||\
nHashB != ((int*)m_lpAxpHashTable)[nHashStart * 3 + 1])
{
nHashStart++;
nHashStart &= 0x7FFF;
if (nHashStart == nHash)
{
return FALSE;
}
}
}
catch (...)
{
return FALSE;
}
nHashPos &= 0x3FFFFFFF;
*lpFileOffset = ((int*)m_lpAxpFileInfo)[nHashPos * 3];
*lpFileSize = ((int*)m_lpAxpFileInfo)[nHashPos * 3 + 1];
return TRUE;
} typedef struct _AXPHeader
{
int signature;
int nUnknow0;
int nUnknow1;
int nHashTableOffset;
int nIndexTableOffset;
int nFileCount;
int nSizeOfIndexTable;
int nDataOffset;
int nUnknow3;
int nUnknow4;
}AXPHeader;
typedef struct _AXPHashTable
{
DWORD nHashA;
DWORD nHashB;
DWORD bExists;
}AXPHashTable;
typedef struct _AXPFileInfo
{
int nFileOffset;
int nFileSize;
int nFileFlag;
}AXPFileInfo;
AXPHashTable **m_lpAxpHashTable;
AXPFileInfo **m_lpAxpFileInfo; AXPHeader = packed record
signature: integer;
nUnknow0: integer;
nUnknow1: integer;
nHashTableOffset: integer;
nIndexTableOffset: integer;
nFileCount: integer;
nSizeOfIndexTable: integer;
nDataOffset: integer;
nUnknow3: integer;
nUnknow4: integer;
end;
AXPHashTable = packed record
nHashA: DWORD;
nHashB: DWORD;
bExists: DWORD;
end;
AXPFileInfo = packed record
nFileOffset: Integer;
nFileSize: Integer;
nFileFlag: Integer;
end; AXPHashTable **m_lpAxpHashTable;
AXPFileInfo **m_lpAxpFileInfo;
Function HashString(FileName:PChar;CryptIndex:Cardinal):Cardinal;
function GetHashTablePos(Str:PChar;var FileOffset:Integer;var FileSize:Integer):Boolean;
var
HASH_A,HASH_B,HASH_OFFSET:Integer;
nHashA,nHashB,nHash:Integer;
nHashStart,nHashPos:Integer;
begin
HASH_A:= 1;
HASH_B:= 2;
HASH_OFFSET:= 3;
nHashA:=HashString(Str,HASH_A);
nHashB:=HashString(Str,HASH_B);
nHash:=HashString(Str,HASH_OFFSET);
nHash:=nHash and $7FFF;
nHashStart:=nHash;
try
nHashPos:=m_lpAxpHashTable[nHashStart*3+2];
while ( (Not (nHashPos and $80000000) ) or
nHashA<>m_lpAxpHashTable[nHashStart*3] or
nHashB<>m_lpAxpHashTable[nHashStart*3+1]
) do
begin
Inc(nHashStart);
nHashStart:=nHashStart and $7FFF;
if (nHashStart=nHash) then
begin
Result:=FALSE;
end;
nHashPos:=m_lpAxpHashTable[nHashStart*3+2];
end;
except
begin
Result:=False;
end;
nHashPos:=nHashPos and $3FFFFFFF;
FileOffset:=m_lpAxpFileInfo[nHashPos*3];
FileSize:=m_lpAxpFileInfo[nHashPos*3+1];
Result:=TRUE;
end;
Cardinal HashString(FileName:PChar,Cardinal CryptIndex);
var
Seed1,Seed2:Cardinal;
ch:Integer;
Key:Integer;//变量Key用来遍历字符串中的每一个字符
begin
Key=0;//取第一个字符
seed1:=$7FED7FED;
seed2:=$EEEEEEEE;
while(FileName[key]!=#0) do
begin
ch=FileName[key];
Inc(Key);
seed1:=Power(m_CryptTable[(CryptIndex shl 8)+ch],(seed1+seed2));
seed2:=ch+seed1+seed2+(seed2 shl 5)+3;
end;
Result:=seed1;
end;


