看到一段代码,留个脚印2_ C ++ 读字节集

 

 

 前几看了个找基址的视频教学,里面有一段用易语言读取一段字节集(大约20MB的空间)的代码,于是在网上搜了,发现了有这么一段代码:

#include <iostream>
#include <stdio.h>
#include <windows.h>
#include <iomanip>
using namespace std;

byte * nc_dncbyte(DWORD pid, DWORD ShouDiZhi, DWORD Size)
{
    HANDLE handle = OpenProcess(PROCESS_ALL_ACCESS, 0, pid);
    byte * p = new byte[ Size ];
    ReadProcessMemory(handle, (LPCVOID)ShouDiZhi, p, Size, 0);
    return p;
}   

void main()
{
    byte * pbuffer = nc_dncbyte(2056, 0x0D0A4318, 10);
   
    printf("%02X,%02X,%02X,%02X", buff[0], buff[1], buff[2], buff[3]);delete []pbuffer;
}    

运行程序后显示:

 

 

 于是改到C++ 输出,代码加上:

for (int i = 0; i <= 200; i++)
    {

        cout << pbuffer[ i ] << " ";
    
    }
    cout << endl;

打印出的效果

 

 

 这应该打印的不是十六进制,想到cout 输出十六进制要加上 hex,但是不行,在网上查了下,还得这样

for (int i = 0; i <= 200; i++)
    {

        cout << hex << int (pbuffer[ i ]) << ", "; 设置十六进制显示数值显示
} cout << endl;

效果:

 

 还有问题,内在为00的只取一位,继续找资料,然后完整代码为:

#include <iostream>
#include <stdio.h>
#include <windows.h>
#include <iomanip>
using namespace std;

byte * nc_dncbyte(DWORD pid, DWORD ShouDiZhi, DWORD Size)
{
    HANDLE handle = OpenProcess(PROCESS_ALL_ACCESS, 0, pid);
    byte * p = new byte[ Size ];
    ReadProcessMemory(handle, (LPCVOID)ShouDiZhi, p, Size, 0);
    return p;
}

void main()
{
    byte * pbuffer = nc_dncbyte(3760, 0x0D0A4318, 10);
    for (int i = 0; i < 200; i++)
    {
        cout.width(2);//占宽2列
        cout.fill('0');//不足2位时前面用0补齐,多于2位时按实际倍数显示
        cout << setiosflags(ios::uppercase) << hex << int (pbuffer[ i ]) << " "; // setiosflags(ios::uppercase) 设置十六进制显示数值字母大写

    }
    cout << endl;
    for (int a = 0; a < 4; a++)
    {
        printf("%02X,", pbuffer[a]);
    }
    cout << endl;
    delete []pbuffer;
}

最终效果如下:

 

 OK,任何完成,再然后就是要把这些读取的字节集输出为exe程序。

 

posted @ 2020-03-31 17:24  人五人六  阅读(556)  评论(0)    收藏  举报