char engine_sig[] = "\x89\x74\x24\x5C\x89\x74\x24\x60\x89\x74\x24\x64\x89\x74\x24\x68\x89\x74\x24\x6C\x89\x74\x24\x70\x89\x74\x24\x74\x89\x74\x24\x78\x89\x74\x24\x7C\0";

解决方案 »

  1.   

    \x89就是一个字节,他的值是十六进制的0x89
    这一行就是用一串十六进制的值初始化数组,相当于
    engine_sig[0] = 0x89;
    engine_sig[1] = 0x74;
    engine_sig[2] = 0x24;
    engine_sig[3] = 0x5C;
    ……
      

  2.   

    我怎么觉得是UTF-8编码呢,它存的不是所需字符本身,而是字符的UTF-8编码,也就是编码串
    使用::MultiByteToWideChar() 可以转换成Unicode字符串
      

  3.   

    我还是不知道字符串数组里边的是什么意思呢啊,8楼能翻译一下?下边就是用到这个字符串数组的地方DWORD dwEngine = FindPattern(engine_sig, strlen(engine_sig), 0x01D60000, 0x01000000);能否顺带翻译了?
      

  4.   

    DWORD CMemoryPatcher::FindPattern (DWORD pid, BYTE * pattern, DWORD pattern_length, DWORD start_addr, DWORD process_len)
    {
    DWORD found_addr = 0;
    HANDLE hProcess = OpenProcess (PROCESS_VM_OPERATION|PROCESS_VM_READ|PROCESS_VM_WRITE, FALSE, pid);
    BYTE * tempbuf = new BYTE [PAGE_SIZE];
    if ( hProcess )
    {
    for ( DWORD current = 0; current < process_len && found_addr == 0; )
    {
    DWORD amount = process_len - current > PAGE_SIZE ? PAGE_SIZE : process_len - current;
    if ( !ReadFromProcessToBuf(hProcess, (void*) (start_addr + current), tempbuf, amount) )
    break;
    for ( int i = 0; i < amount - pattern_length; i++ )
    {
    if ( !memcmp (tempbuf+i, pattern, pattern_length) )
    {
    found_addr = start_addr + current + i;
    break;
    }
    }
    current += amount;
    }
    CloseHandle (hProcess);
    }
    else
    Error ("OpenProcess error: %s", strerror(errno));
    delete tempbuf;
    return found_addr;
    }
      

  5.   

    注意到没有,\x89\x74\x24 是重复出现的,看来不是编码串。
    从10L的代码看,似乎是一种内存数据的匹配模式。PS:按6L方法转成Unicode是这个样子的
    t$\t$`t$dt$ht$lt$pt$tt$xt$|
      

  6.   

    所谓编码串,就是如字串ABC,不存为“ABC”而是存为"\x00\x41\x00\x42\x00\x43"
    A的ASCII码是十进制65、十六进制0x41
      

  7.   

    都没说出关键,依我看,这个数组的首地址,后边竟然被当成了打开进程的pid参数,从来没见过这种写法.在FindPattern (DWORD pid 的第一个参数,就是数组的地址,后边,在这个函数里,调用了API函数 OpenProcess ,而数组的地址竟然被当做进程pid,成为了 OpenProcess 的第三个参数.....我还是不明白字符串数组怎么变成的pid
      

  8.   

    都没说出关键,依我看,这个数组的首地址,后边竟然被当成了打开进程的pid参数,从来没见过这种写法.在FindPattern (DWORD pid 的第一个参数,就是数组的地址,后边,在这个函数里,调用了API函数 OpenProcess ,而数组的地址竟然被当做进程pid,成为了 OpenProcess 的第三个参数.....我还是不明白字符串数组怎么变成的pid
      

  9.   

    UTF-8的写法一般为 %1E ,所以这里这个串应该是一个标识串,就是一个匹配串。也就是是某一个串的特征,匹配时用的感谢你一直以来的支持,欢迎使用《Csdn收音机》!
      

  10.   

    还有没有高人能解释一下了?数组首地址怎么变成pid了?
      

  11.   

    我10楼的代码发错了,别拿10楼的代码做参考,实际上函数是这样写的DWORD FindPattern(char *pattern, int len, DWORD dwStart, DWORD dwLen)
    {
        char *m = (char *)dwStart;
        for(; (DWORD)m < (dwStart + dwLen); m++)
        if(!memcmp(m, pattern, len))
        return (DWORD)m;
        return NULL;
    }