下边这个字符串数组是什么意思? 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"; 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 \x89就是一个字节,他的值是十六进制的0x89这一行就是用一串十六进制的值初始化数组,相当于engine_sig[0] = 0x89;engine_sig[1] = 0x74;engine_sig[2] = 0x24;engine_sig[3] = 0x5C;…… 我怎么觉得是UTF-8编码呢,它存的不是所需字符本身,而是字符的UTF-8编码,也就是编码串使用::MultiByteToWideChar() 可以转换成Unicode字符串 我还是不知道字符串数组里边的是什么意思呢啊,8楼能翻译一下?下边就是用到这个字符串数组的地方DWORD dwEngine = FindPattern(engine_sig, strlen(engine_sig), 0x01D60000, 0x01000000);能否顺带翻译了? 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;} 注意到没有,\x89\x74\x24 是重复出现的,看来不是编码串。从10L的代码看,似乎是一种内存数据的匹配模式。PS:按6L方法转成Unicode是这个样子的t$\t$`t$dt$ht$lt$pt$tt$xt$| 所谓编码串,就是如字串ABC,不存为“ABC”而是存为"\x00\x41\x00\x42\x00\x43"A的ASCII码是十进制65、十六进制0x41 都没说出关键,依我看,这个数组的首地址,后边竟然被当成了打开进程的pid参数,从来没见过这种写法.在FindPattern (DWORD pid 的第一个参数,就是数组的地址,后边,在这个函数里,调用了API函数 OpenProcess ,而数组的地址竟然被当做进程pid,成为了 OpenProcess 的第三个参数.....我还是不明白字符串数组怎么变成的pid 都没说出关键,依我看,这个数组的首地址,后边竟然被当成了打开进程的pid参数,从来没见过这种写法.在FindPattern (DWORD pid 的第一个参数,就是数组的地址,后边,在这个函数里,调用了API函数 OpenProcess ,而数组的地址竟然被当做进程pid,成为了 OpenProcess 的第三个参数.....我还是不明白字符串数组怎么变成的pid UTF-8的写法一般为 %1E ,所以这里这个串应该是一个标识串,就是一个匹配串。也就是是某一个串的特征,匹配时用的感谢你一直以来的支持,欢迎使用《Csdn收音机》! 还有没有高人能解释一下了?数组首地址怎么变成pid了? 我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;} 请教一下钩子函数如何与其他函数进行数据传递的? vs2005 sp1的问题 我开发游戏。想问一下一些调试的问题 OnInitDialog()返回的BOOL值在哪找? 为什么连接总是出错?(CSocket类) 新手:偶然看到theApp的声明是在.cpp文件中,而.h文件里是extern,为什么要这样呢? ADO 調SQL2000存儲過程 MFC文件头中的一些定义是什么意思啊? 急,看不懂的常见提示(关于多继承),望高手指点 很简单的一个问题 多文档切换视图会重绘吗 看不懂《Windows程序设计》中的这个语句,请大家帮忙解释下,谢谢!!
这一行就是用一串十六进制的值初始化数组,相当于
engine_sig[0] = 0x89;
engine_sig[1] = 0x74;
engine_sig[2] = 0x24;
engine_sig[3] = 0x5C;
……
使用::MultiByteToWideChar() 可以转换成Unicode字符串
{
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;
}
从10L的代码看,似乎是一种内存数据的匹配模式。PS:按6L方法转成Unicode是这个样子的
t$\t$`t$dt$ht$lt$pt$tt$xt$|
A的ASCII码是十进制65、十六进制0x41
{
char *m = (char *)dwStart;
for(; (DWORD)m < (dwStart + dwLen); m++)
if(!memcmp(m, pattern, len))
return (DWORD)m;
return NULL;
}