前段时间用手机浏览论坛,下了个登陆协议源码,一直没看.很久没有发帖了,今天趁此机会,把其中的一个bug告诉感兴趣的朋友.
这里贴出一个朋友的问题.(当然不是问的本人,这里表达一下我的观点)
帝高阳
你好,逆上次上传的“QQ登陆协议分析”代码,我运行出错,先是<openssl/e_os.h>不存在。我查资料后,先是安装了perl,MASM32,也成功安装了openssl。动态库我是生成成功了,并且在VC6里面的tool->options->directory的"Show directories for:"的"Include files"选项中新增目录"C:/openssl/include";"Library files"选择中新增目录"C:\Openssl\out32dll"。
1.我运行程序,出错:“Cannot open include file: 'openssl/e_os.h”,我就在“C:\Openssl\include\openssl”下添加了一个文件“os.h”,(这个os.h是在C:\Openssl里已经存在的,不知道这个文件对不对)。
2.在运行,问题1不再出现,但是出现了:“error LNK2001: unresolved external symbol _EC_POINT_point2oct
Debug/MFCQQClient.exe : fatal error LNK1120: 6 unresolved externals”。连接出错。我网上看看了,在“StdAfx.h”文件里面添加了“
#include <openssl/ssl.h>
#include <openssl/bio.h>
#pragma comment(lib, "libeay32.lib")
#pragma comment(lib, "ssleay32.lib") ”编译,能运行,但是输入QQ号码和密码后直接被终止了,我跟中调试了一下,找到QQOutPaket.cpp文件的“push(out,out_len); delete out;”这里,溢出。我猜想是不是我添加的代码有误,或者在安装OPNESSL时没有正确。
麻烦指正一下。谢谢!
很奇怪的是作者编译好的版本可以正常运行,而你用源码编译的却会出错.原因当然很简单,源码是有bug的,作者想让大家开动开动脑筋而已.;):
当然作者是世外高人,他也不会告诉我答案,我等也只能仰视.废话不说,直接给出源码错误的地方:
unsigned char *out=new unsigned char[len*2];
push(out,out_len);
delete out;
一句话,原作者一开始编程时可能没有考虑到QQ加密算法运算结果的最小长度16,想当然的只是开辟了2倍的明文长度用来存放运算结果.如果明文长度足够小的话,输出缓冲区就小了.在执行push(out,out_len);这句时,也就是下面的代码:
void COutPacket::push(const void *buff, unsigned int size)
{
PACKET_DATA data;
data.ptr=new char[size];
memcpy(data.ptr,buff,size); //这里越界访问内存
data.size=size;
plist.push_back(data);
length+=size;
}
delete out; //这里直接出错(先前的操作已经破坏了缓冲区)
如有错误,敬请指出.谢谢!
这里贴出一个朋友的问题.(当然不是问的本人,这里表达一下我的观点)
帝高阳
你好,逆上次上传的“QQ登陆协议分析”代码,我运行出错,先是<openssl/e_os.h>不存在。我查资料后,先是安装了perl,MASM32,也成功安装了openssl。动态库我是生成成功了,并且在VC6里面的tool->options->directory的"Show directories for:"的"Include files"选项中新增目录"C:/openssl/include";"Library files"选择中新增目录"C:\Openssl\out32dll"。
1.我运行程序,出错:“Cannot open include file: 'openssl/e_os.h”,我就在“C:\Openssl\include\openssl”下添加了一个文件“os.h”,(这个os.h是在C:\Openssl里已经存在的,不知道这个文件对不对)。
2.在运行,问题1不再出现,但是出现了:“error LNK2001: unresolved external symbol _EC_POINT_point2oct
Debug/MFCQQClient.exe : fatal error LNK1120: 6 unresolved externals”。连接出错。我网上看看了,在“StdAfx.h”文件里面添加了“
#include <openssl/ssl.h>
#include <openssl/bio.h>
#pragma comment(lib, "libeay32.lib")
#pragma comment(lib, "ssleay32.lib") ”编译,能运行,但是输入QQ号码和密码后直接被终止了,我跟中调试了一下,找到QQOutPaket.cpp文件的“push(out,out_len); delete out;”这里,溢出。我猜想是不是我添加的代码有误,或者在安装OPNESSL时没有正确。
麻烦指正一下。谢谢!
很奇怪的是作者编译好的版本可以正常运行,而你用源码编译的却会出错.原因当然很简单,源码是有bug的,作者想让大家开动开动脑筋而已.;):
当然作者是世外高人,他也不会告诉我答案,我等也只能仰视.废话不说,直接给出源码错误的地方:
unsigned char *out=new unsigned char[len*2];
push(out,out_len);
delete out;
一句话,原作者一开始编程时可能没有考虑到QQ加密算法运算结果的最小长度16,想当然的只是开辟了2倍的明文长度用来存放运算结果.如果明文长度足够小的话,输出缓冲区就小了.在执行push(out,out_len);这句时,也就是下面的代码:
void COutPacket::push(const void *buff, unsigned int size)
{
PACKET_DATA data;
data.ptr=new char[size];
memcpy(data.ptr,buff,size); //这里越界访问内存
data.size=size;
plist.push_back(data);
length+=size;
}
delete out; //这里直接出错(先前的操作已经破坏了缓冲区)
如有错误,敬请指出.谢谢!