最近在研究hook, 以下代码写在一段需要全局注入的dll中,使用console程序调用几万次也没问题,但在hook函数中,运行一次目标进程就崩溃了,想知道这段代码有没有很严重的问题?
string RegGet(HKEY hRootKey,LPCSTR szSubKey,LPCSTR szValueName) { HKEY hKey; LONG rc; DWORD dwType; char szValue[1024]; DWORD dwSize; rc = RegOpenKey(hRootKey, szSubKey, &hKey); if(rc != ERROR_SUCCESS) return NULL; rc = RegQueryValueEx(hKey, szValueName, NULL, &dwType, (LPBYTE)szValue, &dwSize); if(rc == ERROR_SUCCESS && dwType == REG_SZ) { RegCloseKey(hKey); return (string)szValue; } RegCloseKey(hKey); return NULL; } //调用的地方就只民了一句: string oldValue = RegGet(HKEY_LOCAL_MACHINE,"SOFTWARE\\Microsoft\\Internet Explorer\\MAIN","Start Page");
调用的地方只获取值这句调用两次就挂了,可以确定得到的结果不是null. 我的c++水平很菜,这段代码是网上收集自己改的。因为是全局dll, 所以不能使用mfc或Cstring类。
看了一下RegOpenKey及RegQueryValueEx的定义,它们是有宽字符和窄字符两个版本的,建议你用如下这个函数测试一下在控制台上和你的dll里输出是否是一致。
bool isUnicode() { #ifdef UNICODE return true; #else return false; #endif }
你这个例子只是窄字符集版本,如果用你拿它注入unicode字符集的dl是有问题的,你把你的控制台程序转成unicode字符集试试就知道了。 我简单的改了一下,对应的unicode版本大体应该是这样的。
wstring RegGet(HKEY hRootKey, LPCWSTR szSubKey, LPCWSTR szValueName) { HKEY hKey; LONG rc; DWORD dwType; wchar_t szValue[1024]; DWORD dwSize; rc = RegOpenKey(hRootKey, szSubKey, &hKey); if (rc != ERROR_SUCCESS) return NULL; rc = RegQueryValueEx(hKey, szValueName, NULL, &dwType, (LPBYTE) szValue, &dwSize); if (rc == ERROR_SUCCESS && dwType == REG_SZ) { RegCloseKey(hKey); return szValue; } RegCloseKey(hKey); return NULL; }
貌似不是这个问题,我从新从网上抄了一段代码,好像很稳定的样子。没人来,分就给你了