帮我看一段程序,Runtime R6002错误。。。

dandyboy 2003-12-28 05:17:19
下面这段程序是我在Hook API以后,模仿wpe的格式输出捕捉的数据,

但是在Print比较大的数据包的时候,被Hook的程序会有R6002,Runtime错误并当掉
如果把显示的数据限制为只输出10行的话,一点事都没有。。。

大家帮我看看,这段程序有什么问题?注释掉的部分是先写在缓冲区里,然后再一次
写入文件,但是问题是一样存在。。。

看了一下R6002的错误的解释,说什么

·A format string for a printf or scanf function contained a floating-point format specification, and the program did not contain any floating-point values or variables.

请大家给我挑挑毛病,我知道写得很烂。。。

void PrintRecvHexData(FILE *pf, BYTE FAR *pdata, int len)
{
int i, base;
char str0[64];
char str1[64];
char addr[32];
char temp[128];
char space[64];
int wd = 8;
int width = wd*2;
int lines = len/width;

bool flag = false;
if((len % width) != 0)
lines++;

if(lines == 0)
lines = 1;

/*
if(lines > 10)
lines = 10;

char *pBuffer = new char[lines * 100];
if(!pBuffer) return;
//memset(pBuffer, 0, lines * 100);
pBuffer[0] = '\0';
*/

for(int row=0; row<lines; row++)
{
base = row*width;
sprintf(addr, "%4.4X", base);
str0[0] = '\0';
str1[0] = '\0';

int col;
for(col=0; col<width; col++)
{
i = base + col;
if(i >= len)
{
flag = true;
break;
}
sprintf(temp, "%2.2X ", (unsigned char)pdata[i]);

if(col == (wd-1))
strcat(temp, " ");
strcat(str0, temp);

if(pdata[i] >= 32 && pdata[i] < 255)
sprintf(temp, "%c", (unsigned char)pdata[i]);
else
sprintf(temp, ".");
strcat(str1, temp);
}

int lenstr0 = strlen(str0);
if(lenstr0 < MAX_HEX_LENGTH)
{
memset(space, 32, MAX_HEX_LENGTH);
space[MAX_HEX_LENGTH] = '\0';
memcpy(space, str0, lenstr0);
strcpy(str0, space);
}

sprintf(temp, "%s %s ; %s\n", addr, str0, str1);
fprintf(pf, temp);
//strcat(pBuffer, temp);

if(flag)
break;
}

/*
if(pBuffer)
{
fprintf(pf, pBuffer);

delete[] pBuffer;
pBuffer = NULL;
}
*/
}
...全文
2557 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
dandyboy 2003-12-30
  • 打赏
  • 举报
回复
对不起大家了,程序本身应该是没有问题的,

我把 fprintf(pf, temp); 这句去掉就可以了,可能是写文件的时候耗时太多,socket函数调用等太久了,超时了还是什么,反正是系统内部的原因,这也是为什么我只输出10行的数据也是正常的原因。

也许是TCP/IP内部的问题。。。谢谢大家了:)尤其是 broadoceans

晚上结贴
lansefeng 2003-12-29
  • 打赏
  • 举报
回复
帮你up
dandyboy 2003-12-29
  • 打赏
  • 举报
回复
自己uo一下
dandyboy 2003-12-29
  • 打赏
  • 举报
回复
继续up
dandyboy 2003-12-29
  • 打赏
  • 举报
回复
BinaryTreeEx:

这是Hook API的dll,我不知道怎么跟踪啊,说实话我也想跟踪,可是我不会:(
这是一个全局钩子dll
BinaryTreeEx 2003-12-29
  • 打赏
  • 举报
回复
我试过那个if结构的代码了,单就局部的代码而言没有问题。你跟踪一下,看看strcat前和后
str1, temp的内容分别是什么?
dandyboy 2003-12-29
  • 打赏
  • 举报
回复
自己再up一下
dandyboy 2003-12-28
  • 打赏
  • 举报
回复
to broadoceans(broadoceans):

temp[1] = '\0';我试过了

我还试了在前面加
memset(temp, 0, 4); 前四个字节都为0了,即使算双字节也有2个字符了

结果还是不行,用char 也不行,问题不在这

to ckp(surge):

char *pBuffer = new char[lines * 100];

那段我根本就没有用,我注释掉的,我是怕写文件太多次,太慢,才弄了个缓冲区来试试
结果,还是出错,还有,len最大也有8192,因为这是Hook socket的函数,系统缓冲区一般默认值对大是8192,lines*100不会越界的,谢谢你的提醒:)
broadoceans 2003-12-28
  • 打赏
  • 举报
回复
sprintf(temp, "%c", (unsigned char)pdata[i]);是没有错的,


主要是存在类型转换。
你都用所有变量都用unsigned char试一试。

sprintf(temp, "%uc", (unsigned char)pdata[i]);
ckp 2003-12-28
  • 打赏
  • 举报
回复
关键在这两句:
int lines = len/width;
char *pBuffer = new char[lines * 100];

你的lines是四个字节的整型变量,如果你的len太大,len/width后再乘以100,lens就会发生溢出产生负数。导致系统产生runtime error.
解决办法;
将数据写入缓冲区时,不要一次写入要分批写入,只要等到缓冲区一满,就写入文件。
然后再重新对pBuffer进行初始化。这样就不会产生缓冲区溢出和int溢出的问题拉。
例子如下:
int bptr = 0;
#define MAXBUFSIZE 16384;
int pBuffer[MAXBUFSIZE];
#define put_byte(x) { pBuffer[bptr++] = x; if(bptr >= MAXBUFSIZE) { flush_buffer(); bptr = 0;} }
#define flush_buffer() { 将缓冲区中的数据写入指定的文件中;};
只需定义以上的宏后;
你只需在你的程序中调用put_byte()就可以了,最后在程序结束时,再调用一次flush_buffer(),以将缓冲区中的剩余数据全部写入文件中,再关闭数据文件,close(handle)或者fclose(FILE);
OK,全部搞定。^___^很简单嘛。
ablefirst 2003-12-28
  • 打赏
  • 举报
回复
strcat(str1, (LPCSTR)temp);
试一下这个
dandyboy 2003-12-28
  • 打赏
  • 举报
回复
不好意思,弄错了

if(pdata[i] >= 32 && pdata[i] < 255)
sprintf(temp, "%c", (unsigned char)pdata[i]);
else
sprintf(temp, ".");
strcat(str1, temp);

这段的sprintf(temp, "%c", (unsigned char)pdata[i]);是没有错的,

主要是这句 strcat(str1, temp);
把这句换成 strcat(str1, "."); 就没有事了,

加了一句 temp[1] = '\0'; 在strcat(str1, temp);前面 也不行。。。
broadoceans 2003-12-28
  • 打赏
  • 举报
回复
中间不出现unsigned char,全部用char

改为:
if(pdata[i] >= 32 && pdata[i] < 127)
sprintf(temp, "%c", (char)pdata[i]);
else
sprintf(temp, ".");
//你每次temp没有清除,是不是越界了,加一句吧
temp[1] = '\0';
strcat(str1, temp);

试一试?
dandyboy 2003-12-28
  • 打赏
  • 举报
回复
还是不行哪,高手请帮忙看看。。。

什么floating point not loaded! 错误R6002

浮点,哪有浮点啊?
shines77 2003-12-28
  • 打赏
  • 举报
回复
不懂,帮你顶,可能是pdata[i]溢出
dandyboy 2003-12-28
  • 打赏
  • 举报
回复
这个我试过了:)也是不行,不过我改为二进制输出以后没试过,我试试看啊

输出结果类似这样,

175 192.168.1.2 211.234.22.189 [168] 49 WSARecv
0000 04 60 01 80 04 00 00 00 4C 00 00 00 19 00 00 00 ; .`.€....L.......
0010 14 00 00 00 00 00 00 00 01 00 01 01 01 01 00 01 ; ................
0020 01 01 01 01 01 01 00 00 01 01 01 01 01 01 00 00 ; ................
0030 01 ; .

176 192.168.1.2 211.234.22.189 [168] 7042 WSARecv
0000 01 00 00 00 01 00 00 00 05 00 00 00 05 00 00 00 ; ................
0010 62 86 00 00 00 00 00 00 FF D8 FF E0 00 10 4A 46 ; b?.....??.JF
0020 49 46 00 01 02 00 00 64 00 64 00 00 FF EC 00 11 ; IF.....d.d..?.
0030 44 75 63 6B 79 00 01 00 04 00 00 00 1D 00 00 FF ; Ducky..........
0040 EE 00 0E 41 64 6F 62 65 00 64 C0 00 00 00 01 FF ; ?.Adobe.d?...
0050 DB 00 84 00 10 0B 0B 0B 0C 0B 10 0C 0C 10 18 0F ; ??............
0060 0D 0F 18 1C 15 10 10 15 1C 20 17 17 17 17 17 20 ; ......... .....
0070 1F 18 1B 1A 1A 1B 18 1F 1F 24 26 29 9C FF D8 FF ; .........$&)??
0080 E0 00 10 4A 46 49 46 00 01 02 00 00 64 00 64 00 ; ?.JFIF.....d.d.
0090 00 FF EC 00 11 44 75 63 6B 79 00 01 00 04 00 00 ; .?.Ducky......
00A0 00 1D 00 00 FF EE 00 0E 41 64 6F 62 65 00 64 C0 ; ....?.Adobe.d?
00B0 00 00 00 01 FF DB 00 84 00 10 0B 0B 0B 0C 0B 10 ; ....??.......
00C0 0C 0C 10 18 0F 0D 0F 18 1C 15 10 10 15 1C 20 17 ; .............. .
00D0 17 17 17 17 20 1F 18 1B 1A 1A 1B 18 1F 1F 24 26 ; .... .........$&
00E0 29 26 24 1F 31 31 35 35 31 31 41 41 41 41 41 41 ; )&$.115511AAAAAA
00F0 41 41 41 41 41 41 41 41 41 01 11 0F 0F 12 14 12 ; AAAAAAAAA.......
0100 16 13 13 16 15 11 14 11 15 1A 15 17 17 15 1A 26 ; ...............&
0110 1A 1A 1D 1A 1A 26 32 23 1F 1F 1F 1F 23 32 2C 2F ; .....&2#....#2,/
0120 29 29 29 2F 2C 36 36 32 32 36 36 41 41 41 41 41 ; )))/,662266AAAAA
0130 41 41 41 41 41 41 41 41 41 41 FF C0 00 11 08 01 ; AAAAAAAAAA?...
0140 97 02 33 03 01 22 00 02 11 01 03 11 01 FF C4 00 ; ?3..".......?
0150 9E 00 00 02 03 01 01 01 00 00 00 00 00 00 00 00 ; ?..............
0160 00 00 03 04 01 02 05 00 06 07 01 00 03 01 01 01 ; ................
0170 00 00 00 00 00 00 00 00 00 00 00 00 01 02 03 04 ; ................
0180 05 10 00 02 01 02 04 04 04 03 06 04 05 04 01 03 ; ................
0190 05 00 01 02 03 00 11 21 31 12 04 41 51 22 05 61 ; .......!1..AQ".a
01A0 71 32 13 81 42 52 91 A1 B1 C1 23 14 F0 62 33 15 ; q2.丅R憽绷#.餬3.
01B0 D1 E1 72 43 06 F1 82 53 24 34 A2 25 16 73 D3 54 ; 厌rC.駛S$4⒂T
01C0 D4 55 11 00 02 02 02 02 02 02 02 02 01 02 07 00 ; 訳..............
(后面太长,省略。。。。)
dandyboy 2003-12-28
  • 打赏
  • 举报
回复
sprintf(temp, "%c", (unsigned char)pdata[i]);

这句的问题,注释掉就没事了

printf里的格式说明, sprintf也是类似的:

Character Type Output Format
c int or wint_t When used with printf functions, specifies a
single-byte character; when used with wprintf
functions, specifies a wide character.

谁知道怎么回事啊?
broadoceans 2003-12-28
  • 打赏
  • 举报
回复
改为:

if(pdata[i] >= 32 && pdata[i] < 127)
sprintf(temp, "%c", (unsigned char)pdata[i]);
else
sprintf(temp, ".");
strcat(str1, temp);

试一试?
broadoceans 2003-12-28
  • 打赏
  • 举报
回复
因为并不是每个>=32,<256的都可以利用%c输出,只要>0x80的就有问题。
我不知道你想达到什么样的输出结果,能告诉我吗?
dandyboy 2003-12-28
  • 打赏
  • 举报
回复
调用它的函数是下面这样的,

fp = fopen(g_szSocketFile, "a+b");
这句是原来没有使用b(即是文本方式打开文件)的,
我怀疑是没有用二进制的方式打开文件
所以我加了b,并且把全部 /n 换成 /r/n,还是不行

int SaveRecvData(int socket, char FAR *p, int len)
{
FILE *fp;
if(len < 0) return len;

fp = fopen(g_szSocketFile, "a+b");
if(fp != NULL)
{
fprintf(fp, "\r\n%d 192.168.1.2 211.234.22.189 [%d] %d Recv \r\n", g_nPackageCount, socket, len);
PrintRecvHexData(fp, (BYTE FAR *)p, len);
fclose(fp);
}
return len;
}
加载更多回复(1)

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧