繁体   English   中英

C ++自动更新程序

[英]C++ Auto update program

我的自动更新程序出现问题

它应该从网站上下载并保存更新,但是问题是(而且我敢肯定这种情况经常发生,但我无法在Google上用词组词来回答我)将它保存.exe数据接收不到预期的结果。 它将字节保存为acsi ...让我说明一下:

Offset      0  1  2  3  4  5  6  7   8  9  A  B  C  D  E  F

00000000   4D 5A 90 00 03 00 00 00  04 00 00 00 FF FF 00 00   MZ          ÿÿ  
00000010   B8 00 00 00 00 00 00 00  40 00 00 00 00 00 00 00   ¸       @       
00000020   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00                   
00000030   00 00 00 00 00 00 00 00  00 00 00 00 B0 00 00 00               °   

该数据(正确的数据)在新程序中如下所示:

Offset      0  1  2  3  4  5  6  7   8  9  A  B  C  D  E  F

00000000   0D 0A 34 44 35 41 39 30  30 30 30 33 30 30 30 30     4D5A9000030000
00000010   30 30 30 34 30 30 30 30  30 30 46 46 46 46 30 30   0004000000FFFF00
00000020   30 30 42 38 30 30 30 30  30 30 30 30 30 30 30 30   00B8000000000000
00000030   30 30 34 30 30 30 30 30  30 30 30 30 30 30 30 30   0040000000000000

如您所见,它会将代码字节写为ascii值...这是我正在使用的代码

接收部分:

char   szRecvBuff[10000] = "" ;
string szRecvHolder = "" ;      
int    iLastCharacter = 0;

    recv(Socket, szRecvBuff, sizeof(szRecvBuff), 0);

    szRecvHolder = szRecvBuff;

    iLastCharacter = szRecvHolder.find_last_of("\n");
    if(iLastCharacter < szRecvHolder.size() && iLastCharacter > 0 ){
    szRecvHolder.erase(iLastCharacter);
    }
  return szRecvHolder;
}
...
...
{
...
...
Recv();
string Edat = Recv();
std::ofstream put("Eprog.exe", ios::hex );
put <<  Edat.c_str();
put.close();

有谁知道该怎么做,我尝试过使用google,但我无法说出一个能给我带来适当结果的问题

确保以二进制模式打开输出文件:

std::ofstream put("Eprog.exe", ios::binary | ios::hex );

我在您的代码中看到的最大问题是,当您调用Edat.c_str()时,可能是在给流一个const char* 该指针没有有关向流写入多少的信息,因此按照惯例,它必须停止在第一个“ \\0 ”处。

相反,您应该使用write()调用并使用原始char缓冲区。

我已经解决了这个问题,而不是试图使编译器将值解释为十六进制,我只是制作了一个包含所有256个可能字节的查找表。

unsigned char Table[] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F, 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF, 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF };



int GetIndexNumber(string str){
unsigned long rint = NULL;
unsigned long size = str.size() - 2;
unsigned long fi[sizeof(str)];
unsigned long mul;

for( int i = 0; i != 2; i++){
    if( str.at(i+2) == '0' ) fi[i] = 0;
    if( str.at(i+2) == '1' ) fi[i] = 1;
    if( str.at(i+2) == '2' ) fi[i] = 2;
    if( str.at(i+2) == '3' ) fi[i] = 3;
    if( str.at(i+2) == '4' ) fi[i] = 4;
    if( str.at(i+2) == '5' ) fi[i] = 5;
    if( str.at(i+2) == '6' ) fi[i] = 6;
    if( str.at(i+2) == '7' ) fi[i] = 7;
    if( str.at(i+2) == '8' ) fi[i] = 8;
    if( str.at(i+2) == '9' ) fi[i] = 9;
    if( str.at(i+2) == 'A' ) fi[i] = 10;
    if( str.at(i+2) == 'B' ) fi[i] = 11;
    if( str.at(i+2) == 'C' ) fi[i] = 12;
    if( str.at(i+2) == 'D' ) fi[i] = 13;
    if( str.at(i+2) == 'E' ) fi[i] = 14;
    if( str.at(i+2) == 'F' ) fi[i] = 15;
}

for(int i = 0; i != 2 ; i++){
    mul = (1 * pow(16, (double)size-1));
    size--;
    rint += ( mul * fi[i]);
}
return rint;
}

Recv();
string Edat = Recv();
Edat += Recv();
cout<<Edat.c_str()<<endl<<endl;

unsigned char buffer[10000] = "";

for( int i = 0; i <= Edat.size(); i++){
    int PlaceHolder = Edat.find_first_of("0x");
    if(PlaceHolder <= Edat.size() && PlaceHolder > 0){ 
        string tmpstr = Edat.substr(PlaceHolder, 4);
        int TableNumber = GetIndexNumber(tmpstr);
         buffer[i] = Table[TableNumber];
    }
    Edat.replace(PlaceHolder, 4, "");
}

std::ofstream put("Eprog.exe", ios::binary);
put.write((char *)buffer, sizeof(buffer));
put.close(); 

return 0; 
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM