本帖最后由 s3233431 于 2016-11-25 20:17 编辑
主要功能类似与易语言到字节集这个命令
应用到的知识点C++ STL的 stirng sstream 和 tmeplate
这是要包含的头文件
[C++] 纯文本查看 复制代码 //系统函数
#include <windows.h>
//字符串
#include <string>
//字符串流
#include<sstream>
using std::string;
using std::wstring;
using std::stringstream;
using std::wstringstream;
下面这两个函数是进行转换可以转换成Unicode 和Ascii字符
对应的就是char * 和 Wchar*
[C++] 纯文本查看 复制代码
template<class out_type, class in_value>
inline out_type Convert(const in_value & t)
{
stringstream stream;
stream << t;//向流中传值
out_type result;//这里存储转换结果
stream >> result;//向result中写入值
return result;
}
template<class out_type, class in_value>
inline out_type ConvertW(const in_value & t)
{
wstringstream stream;
stream << t;//向流中传值
out_type result;//这里存储转换结果
stream >> result;//向result中写入值
return result;
}
用法 :
[C++] 纯文本查看 复制代码
//可以是double类型 float类型
int i=123;
string str;
str = Convert<string>(i);
cout<<str;
//即可转把整数 i 换成 string Ascii字符串
//可以是double类型 float类型
int ii=123;
wstring str;
str = ConvertW<wstring>(i);
cout<<str;
//即可转把整数 i 换成 wstring Unicode字符串
易语言到字节集 下面代码是我自己实现的主要代码,写的有点乱,大家凑合看下,或者改进一下代码
还没有实现float类型 和double类型转换,有兴趣的朋友可以自己试试
[C++] 纯文本查看 复制代码
//T in_value 要转换成字节集的数据
//UINT &uSize 返回转换后PBYTE的大小
template<class T>
inline const PBYTE ToBit(T in_value,OUT UINT &uSize)
{
//str把模板in_value值保存转换成string类型的字符串
//str1保存临时文本用于交换值
string str, str1;
//判断类型是否为整数
if (typeid(in_value) == typeid(int))
{
//保存转换16进制的文本
char hex[10];
//转换成16进制并强制显示8个字符长度
sprintf_s(hex, 10, "%.8x", in_value);
//转换成string字符串类型
str = hex;
//一个整数4个字节,所以申请一个str字符串大小(8)/2 的BYTE指针
//用作返回值
BYTE * pStr = new BYTE[str.size() / 2];
//数据容器
int * i = new int[str.size() / 2];
//读取2CHAR个为单位的字符串并转换成10进制
for (UINT ii = 0; ii < str.size() / 2; ii++)
{
//接收转换成10进制的值
int iii;
//读取子字符串
str1 = str.substr(ii * 2, 2); //读取2个字符
//把str1的值转换成10进制保存给iii变量
sscanf_s(str1.data(), "%x", &iii);//转换成10进制
//i数组把转换的10进制给临时保存其数值
i[ii] = iii;
}
//把的到的数值以内存的形式倒序保存到数组中
for (UINT ii = 0; ii < str.size() / 2; ii++)
{
//[str.size() / 2 - 1 - ii] 等于取的数组最后一个索引
//并且把值给变量iii保存
int iii = i[str.size() / 2 - 1 - ii];//倒转顺序
//把iii的值赋值给返回的pStr BYTE数组[ii]的值
pStr[ii] = iii;
//获取BYTE pStr[]的大小
uSize = uSize + 1;
}
//删除申请的堆栈地址防止内存溢出
delete[]i;
return pStr;
}
//判断类型是否为Ascii字符串
if (typeid(in_value) == typeid(const char *))
{
//文本到字节集
//把模板参数in_value转换成stirng字符串
str = Convert<string>(in_value);
//申请一个str字符串大小的BYTE指针
//用作返回值
BYTE * pStr = new BYTE[str.size()];
//循环复制给pStr
for (UINT i = 0; i < str.size(); i++)
{
//把字符转换成无符号CHAR
pStr[i] = (BYTE)str[i];//转换成无符号字符不然出负号
//获取BYTE pStr[]的大小
uSize = uSize + 1;
}
return pStr;
}
}
用法:
[C++] 纯文本查看 复制代码
int main()
{
const UCHAR* str;
UINT i=0;
CSystem sm;
str = ToBit(123456,i);
for (UINT ii = 0; ii < i; ii++)
{
//打印出类似与易语言的字节集数据
//可以进行对比易语言的 调试输出 (到字节集 (123456))
cout << (int)str[ii] << endl;
}
return 0;
}
笔记做到这里,希望得到各位大神的指点
有人问肯定会问有什么用我告诉一点
可以把有些写SHELLCODE代码的,懒得转换的可以直接用这函数进行转换
还有有些人写内存搜索的时候是不是只能搜索PBYTE 想搜索整数都觉得要重新写很多代码,
有了它也可以通过这个函数转换成 PBYTE直接传入参数匹配内存
至于还有什么用,就看各位同学的挖掘了
|