简体   繁体   English

C ++自动更新程序

[英]C++ Auto update program

I'm having problems with an auto-update program of mine 我的自动更新程序出现问题

It's supposed to download & save an update from a website, but the problem is(And I'm sure that this happens alot yet I couldn't phrase the keywords that would get me the answer on google) it saves the .exe data it receives not as it's supposed to. 它应该从网站上下载并保存更新,但是问题是(而且我敢肯定这种情况经常发生,但我无法在Google上用词组词来回答我)将它保存.exe数据接收不到预期的结果。 It saves the bytes in acsi... let me illustrate that: 它将字节保存为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               °   

This data, (which is the correct data) Looks like this in the new program: 该数据(正确的数据)在新程序中如下所示:

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

As you can see it writes the codebytes as ascii values... This is the code I'm using 如您所见,它会将代码字节写为ascii值...这是我正在使用的代码

The receiving part: 接收部分:

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();

Does anyone know how to go about it, I've tried using google, but I couldn't phrase a question that would give me proper results 有谁知道该怎么做,我尝试过使用google,但我无法说出一个能给我带来适当结果的问题

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

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

The bigger problem I see with your code is that when you call to Edat.c_str() you're giving presumably a const char* to the stream. 我在您的代码中看到的最大问题是,当您调用Edat.c_str()时,可能是在给流一个const char* This pointer has no information on how much to write to the stream, so it has to stop, by convention, at the first ' \\0 '. 该指针没有有关向流写入多少的信息,因此按照惯例,它必须停止在第一个“ \\0 ”处。

You should instead use the write() call and use a raw char buffer. 相反,您应该使用write()调用并使用原始char缓冲区。

I've solved the problem, instead of trying to make the compiler interpret the values as hex I've simply made an lookup table containing all 256 possible bytes. 我已经解决了这个问题,而不是试图使编译器将值解释为十六进制,我只是制作了一个包含所有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