VC实现查找纯真数据库

先用 CreateFile 打开纯真数据库 , 然后 CreateFileMapping + MapViewOfFile 做一个 内存映射文件 , 这样好 方便操作 . 最后就是按照作者给的纯真数据库的存储结构来一步步找了 . 代码如下 :
ULONG SearchIdxTargetOffer(LPVOID lpPoint, ULONG ulIp, ULONG pIdxFirstOffer, ULONG pIdxLastOffer)
{
     ULONG pTargetOffer, ulnow, pIpArea;
     ulnow = (pIdxLastOffer - pIdxFirstOffer) / 2;
     ulnow -= ulnow % 7;
     pIpArea = *(PULONG)((LPBYTE)lpPoint + pIdxFirstOffer + ulnow);
     if(ulnow == 0)
     {
         if(ulIp >= *(PULONG)((LPBYTE)lpPoint + pIdxFirstOffer + 7))
              pTargetOffer = *(PULONG)((LPBYTE)lpPoint + pIdxFirstOffer + 11);
         else pTargetOffer = *(PULONG)((LPBYTE)lpPoint + pIdxFirstOffer + 4);
     }
     else if(ulIp > pIpArea)
     {
         pTargetOffer = SearchIdxTargetOffer(lpPoint, ulIp, pIdxFirstOffer + ulnow, pIdxLastOffer);
     }
     else if(ulIp < pIpArea)
     {
         pTargetOffer = SearchIdxTargetOffer(lpPoint, ulIp, pIdxFirstOffer, pIdxLastOffer - ulnow);
     }
     else if(ulIp == pIpArea)
     {
         pTargetOffer = *(PULONG)((LPBYTE)lpPoint + pIdxFirstOffer + ulnow + 4);
     }
     return (pTargetOffer << 8) >> 8;
}
 
void SearchSetInformation(LPBYTE pPointer, LPVOID pQQWryDatPointer,
         LPTSTR lpContry, ULONG ulContryLenght,
         LPTSTR lpAddress, ULONG ulAddressLenght)
#define OFFER(pOffer) ((*(PULONG)((LPBYTE)pOffer + 1) << 8) >> 8)
{
     if(*pPointer == 0x01)
     {
         SearchSetInformation((LPBYTE)pQQWryDatPointer + OFFER(pPointer),
         pQQWryDatPointer, lpContry, ulContryLenght, lpAddress, ulAddressLenght);
     }
     else if(*pPointer == 0x02)
     {
         wcscpy_s(lpContry, ulContryLenght, CA2W((LPSTR)pQQWryDatPointer + OFFER(pPointer)));
         pPointer += 4;
         if(*pPointer == 0x01 || *pPointer == 0x02)
              wcscpy_s(lpAddress, ulAddressLenght, CA2W((LPSTR)pQQWryDatPointer + OFFER(pPointer)));
         else wcscpy_s(lpAddress, ulAddressLenght, CA2W((LPSTR)pPointer));
     }
     else
     {
         wcscpy_s(lpContry, ulContryLenght, CA2W((LPSTR)pPointer));
         pPointer += strlen((LPSTR)pPointer) + 1;
         if(*pPointer == 0x01 || *pPointer == 0x02)
              wcscpy_s(lpAddress, ulAddressLenght, CA2W((LPSTR)pQQWryDatPointer + OFFER(pPointer)));
         else wcscpy_s(lpAddress, ulAddressLenght, CA2W((LPSTR)pPointer));
     }
}
 
void SearchQQWryFromIPW(IN ULONG ulIp, OUT LPTSTR lpContry, IN ULONG ulContryLenght,
        OUT LPTSTR lpAddress, IN ULONG ulAddressLenght)
{
     HANDLE hFile = CreateFile(_T("QQWry.Dat"), GENERIC_READ,
         FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
     if(hFile)
     {
         HANDLE hMapping = CreateFileMapping(hFile, 0, PAGE_READONLY, 0, 0, 0);
         if(hMapping)
         {
              LPVOID pQQWryDatPointer;
              pQQWryDatPointer = MapViewOfFile(hMapping, FILE_MAP_READ, 0, 0, 0);
              if(pQQWryDatPointer)
              {
                   LPBYTE pip = (LPBYTE)&ulIp;
                   *pip = *pip ^ *(pip+3);
                   *(pip+3) = *pip ^ *(pip+3);
                   *pip = *pip ^ *(pip+3);
                   *(pip+1) = *(pip+1) ^ *(pip+2);
                   *(pip+2) = *(pip+1) ^ *(pip+2);
                   *(pip+1) = *(pip+1) ^ *(pip+2);
                   ULONG pContentsOffer = SearchIdxTargetOffer(pQQWryDatPointer, ulIp,
                   *(PULONG)pQQWryDatPointer, *(PULONG)((LPBYTE)pQQWryDatPointer + 4));
                   SearchSetInformation((LPBYTE)pQQWryDatPointer + pContentsOffer + 4,
                   pQQWryDatPointer, lpContry, ulContryLenght, lpAddress, ulAddressLenght);
              }
              UnmapViewOfFile(pQQWryDatPointer);
         }
         CloseHandle(hMapping);
     }
     CloseHandle(hFile);
}
 
以上代码在 VS2008 中编译通过 , ! 忘记说 , 这里我写的是 Unicode 版本的 , 如果大家想用在 VC6 中那么要改一下就可以了 .
VOID 
SearchQQWryFromIP(
    IN ULONG    
ulIP              // 将IP转换成ULONG
    OUT LPTSTR 
ipContry          // 返回国家
    IN ULONG    
ulContryLenght  
    OUT LPTSTR 
ipAddress        // 返回地区
    IN ULONG   
ulAddressLenght
    ); 
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值