|
一般情况下,C/C++程序中的字符串常量会被硬编码到程序中(.data段,也就是数据段),尤其是全局变量最容易被定位到
#include <stdio.h>
char global_string[] = "Just A Test Stings!";
int main() {
printf("%s\n", global_string);
}
在C++中利用重载运算符
C++ 允许在同一作用域中的某个函数和运算符指定多个定义,分别称为函数重载和运算符重载
这里需要使用重载运算符来方便我们编程:重载的运算符是带有特殊名称的函数,函数名是由关键字 operator 和其后要重载的运算符符号构成的。与其他函数一样,重载运算符有一个返回类型和一个参数列表
程序结构
BadString.h
#pragma once
#include <iostream>
#include <string>
#include <windows.h>
class BadString {
protected:
DWORD dwStrLength = 0;
std::string szOutStr;
std::string Base64decode(std::string szBase64String, LPDWORD lpdwLen);
public:
BadString(std::string szInStr);
operator std::string();
~BadString();
};
BadString.cpp
#include "BadString.h"
#pragma comment(lib, "crypt32")
std::string BadString::Base64decode(std::string szBase64String, LPDWORD lpdwLen)
{
DWORD dwLen;
DWORD dwNeed;
PBYTE lpBuffer = NULL;
dwLen = szBase64String.length();
dwNeed = 0;
CryptStringToBinaryA(szBase64String.c_str(), 0, CRYPT_STRING_BASE64, NULL, &dwNeed, NULL, NULL);
if (dwNeed)
{
lpBuffer = new BYTE[dwNeed + 1];
ZeroMemory(lpBuffer, dwNeed + 1);
CryptStringToBinaryA(szBase64String.c_str(), 0, CRYPT_STRING_BASE64, lpBuffer, &dwNeed, NULL, NULL);
*lpdwLen = dwNeed;
}
return std::string((PCHAR)lpBuffer);
}
BadString::BadString(std::string szInStr)
{
this->dwStrLength = szInStr.length();
this->szOutStr = this->Base64decode(szInStr, &this->dwStrLength);
}
BadString::operator std::string()
{
return this->szOutStr;
}
BadString::~BadString()
{
}
main.cpp
#include "BadString.h"
int main() {
std::cout << std::string(BadString("SGVsbG8gV29ybGQK")) << std::endl;
}
经过隐藏后在.data 段是找不到输出的字符,但是在.rdata 段还能找到base64后的字符串内容
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|