gpt4 book ai didi

c++ - Cryptopp.dll访问冲突读取位置0x74736554

转载 作者:太空宇宙 更新时间:2023-11-04 16:22:20 28 4
gpt4 key购买 nike

我正在尝试使用 cryptopp,以下代码会导致 stringsource 函数发生访问冲突。这可能是什么原因?我以前成功运行过类似的代码,几乎没有什么区别。

AesHelper.cpp

#include "dll.h"
#include "AesHelper.h"

#include "aes.h"
using CryptoPP::AES;
#include "ccm.h"
using CryptoPP::CBC_Mode;

#include "filters.h"
using CryptoPP::StringSink;
using CryptoPP::StringSource;
using CryptoPP::StreamTransformationFilter;

#include "hex.h"
using CryptoPP::HexEncoder;
using CryptoPP::HexDecoder;

#include <string>
using namespace std;

#include "osrng.h"
using CryptoPP::AutoSeededRandomPool;

byte AesHelper::_key[AES::DEFAULT_KEYLENGTH];
byte AesHelper::_iv[AES::BLOCKSIZE];

void AesHelper::encrypt(const char* str, char ** outIv, char ** encrypted )
{
try
{
AutoSeededRandomPool prng;

byte key[AES::DEFAULT_KEYLENGTH];
prng.GenerateBlock(key, sizeof(key));

byte iv[AES::BLOCKSIZE];
prng.GenerateBlock(iv, sizeof(iv));

string cipher, encoded;
string plain = "CBC Test Mode";

CBC_Mode<AES>::Encryption e;
e.SetKeyWithIV(key, sizeof(key), iv);

// The StreamTransformationFilter removes
// padding as required.
StreamTransformationFilter *stf = new StreamTransformationFilter(e,
new StringSink(cipher),
CryptoPP::BlockPaddingSchemeDef::ZEROS_PADDING
);

StringSource s(plain, true, stf); // This line cause Access Violation

StreamTransformationFilter filter(e);
filter.Put((const byte*)plain.data(), plain.size());
filter.MessageEnd();

const size_t ret = filter.MaxRetrievable();
cipher.resize(ret);
filter.Get((byte*)cipher.data(), cipher.size());

//encode the cipher to hexadecimal
StringSource(cipher, true,
new HexEncoder(
new StringSink(encoded)
) // HexEncoder
); // StringSource


//set the output parameter
outIv = (char**)_iv;
encrypted = (char**)cipher.c_str();
}
catch(const CryptoPP::Exception& e)
{
cerr << "exception : " << e.what() << endl;
exit(1);
}

}

错误

Unhandled exception at 0x550714CA (cryptopp.dll) in PaymentManager.exe: 0xC0000005: Access violation reading location 0x74736554.

cryptopp.dll!memcpy(unsigned char * dst, unsigned char * src, unsigned long count) Line 188 Unknown

更新:将 DLL 和 Exe 程序都制作为“发布”后问题解决了。但是现在有新的问题。在这一行上,问题也在 stringsource 函数中

StringSource(cipher, true,
new HexEncoder(
new StringSink(encoded)
) // HexEncoder
); // StringSource

错误

PaymentManager.exe has triggered a breakpoint.

程序停止在

void __cdecl _free_base (void * pBlock) {

int retval = 0;


if (pBlock == NULL)
return;

RTCCALLBACK(_RTC_Free_hook, (pBlock, 0));

retval = HeapFree(_crtheap, 0, pBlock); // program stop at this line
if (retval == 0)
{
errno = _get_errno_from_oserr(GetLastError());
} }

最佳答案

0x74736554 是四个 ASCII 字符 "tseT"(大端)或 "Test"(小端)的十六进制 - 后者正是string plain 索引 4-7 处的字节。 StringSource 构造函数试图读取该地址这一事实表明您的可执行文件和 DLL 不同意 std::string 的外观。特别是,该库正在取消引用您传递给它的对象的偏移量 4 处的内存地址,但您传递给它的对象在那里没有有效的指针值。

换句话说,你传递的string(或者可能是它的一些子对象)在内存中看起来像这样:

Offset    0      1      2      3      4      5      6      7
+------+------+------+------+------+------+------+------+--
Value | 0x43 | 0x42 | 0x43 | 0x20 | 0x54 | 0x65 | 0x73 | 0x74 | ...
| 'C' | 'B' | 'C' | ' ' | 'T' | 'e' | 's' | 't' | ...
+------+------+------+------+------+------+------+------+--

但是,图书馆是这样对待它的:

Offset    0      1      2      3      4      5      6      7
+------+------+------+------+------+------+------+------+--
Value | ????? | Pointer to character data | ...
+------+------+------+------+------+------+------+------+--

我意识到导致错误的地址完全由与源代码中的值匹配的 ASCII 值组成,从而弄清楚了这一切。

这几乎可以肯定是因为您的代码和库使用了不同的 std::string 实现,它们具有不同的对象布局。这与 Allocating and freeing memory across module boundaries 完全相同的问题.为了在模块之间传递 C++ 对象(即主可执行文件和它加载的任何 DLL),两个模块需要就对象的布局方式达成一致。如果模块是在不同时间编译的,那么您需要更加努力地确保它们是针对相同的头文件编译的。

如果您从源代码编译 DLL,那么最简单的事情就是确保 DLL 和您的可执行文件都使用相同的 C++ 标准库实现。如果您使用的 DLL 已经由其他人编译过,那么您需要询问他们或查看文档以找到编译它所针对的 C++ 标准库,然后针对同一库编译您的可执行文件。

如果您做不到,那么下一个最佳解决方案是避免在所有情况下跨模块边界传递 C++ 对象——仅使用采用预定义数据类型(如整数和原始指针)的 API ) 或 DLL 的头文件中定义的数据类型。这将完全避免该问题,但也会使您的代码更难编写,因为您无法再传递或接收 std::string

关于c++ - Cryptopp.dll访问冲突读取位置0x74736554,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15491062/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com