首页
社区
课程
招聘
[求助]来看看 这是语法问题吗? 还是C基础不过关
发表于: 2015-7-3 13:39 3576

[求助]来看看 这是语法问题吗? 还是C基础不过关

2015-7-3 13:39
3576
遇到个奇怪的问题....

先代码

unsigned int GetCrc32(PCHAR chText, int len)
{
  //生成Crc32的查询表  
  unsigned int Crc32Table[256];
  int i, j;
  unsigned int Crc;
  for (i = 0; i < 256; i++){
    Crc = i;
    for (j = 0; j < 8; j++){
      if (Crc & 1)
        Crc = (Crc >> 1) ^ 0xEDB88320;
      else
        Crc >>= 1;
    }
    Crc32Table[i] = Crc;
  }

  //开始计算CRC32校验值  
  Crc = 0xffffffff;
  for (i = 0; i < (int)len; i++){
    Crc = (Crc >> 8) ^ Crc32Table[(Crc & 0xFF) ^ chText[i]];
  }

  Crc ^= 0xFFFFFFFF;
  return Crc;
}



那么问题来了
在用户层程序

void Check()
{
  ULONG64 tick = GetTickCount64();
  
  GetCrc32((PCHAR)&tick,8);    毫无问题.

}


但是在驱动中.  直接PAGE_FAULT_IN_NONPAGE_AREA 切直接忽视 try.except

但是如果把GetCrc32的参数 PCHAR chText 改成 PBYTE chText,

切调用的时候改成

GetCrc32((PBYTE)&tick,8);   就毫无问题.

看了驱动<WINDEF.H>

typedef unsigned char       BYTE;
typedef BYTE near           *PBYTE;

<ntedf.h>
typedef char CHAR;
typedef CHAR *PCHAR, *LPCH, *PCH;

x64系统

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 54
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
目测是符号的问题   当你用char类型做数组索引,如果这个char是一个负数 可能会做符号扩展成32位  比如-1 值为0xFF被扩展成0xFFFFFFFF   然后再被解释为一个无符号数 这个数会非常大  如果是unsigned char 则0xFF被扩展为0x000000FF 就不会越界 这是我的猜测  胡言乱语
2015-7-3 16:00
0
雪    币: 135
活跃值: (106)
能力值: ( LV2,RANK:140 )
在线值:
发帖
回帖
粉丝
3
应该是符号问题. 我曾经写rc4算法也遇到过符号问题导致崩溃。
2015-7-3 16:36
0
雪    币: 135
活跃值: (106)
能力值: ( LV2,RANK:140 )
在线值:
发帖
回帖
粉丝
4
Crc32Table[(Crc & 0xFF) ^ chText[i]];  这里如果chText[i]取出来是负数, 然后就索引就超限了, 访问异常崩溃
2015-7-3 16:38
0
雪    币: 99
活跃值: (110)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
[QUOTE=kingsdows;1379202]Crc32Table[(Crc & 0xFF) ^ chText[i]];  这里如果chText[i]取出来是负数, 然后就索引就超限了, 访问异常崩溃[/QUOTE]

应该是这样了。 3Q
2015-7-3 21:01
0
游客
登录 | 注册 方可回帖
返回
//