首页 新闻 会员 周边 捐助

c++基础问题?

0
悬赏园豆:15 [已解决问题] 解决于 2014-02-26 16:27

最近在研究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类。

空明流光的主页 空明流光 | 初学一级 | 园豆:111
提问于:2014-02-25 18:17
< >
分享
最佳答案
0

看了一下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;
}
收获园豆:15
天方 | 大侠五级 |园豆:5432 | 2014-02-25 21:47

貌似不是这个问题,我从新从网上抄了一段代码,好像很稳定的样子。没人来,分就给你了

空明流光 | 园豆:111 (初学一级) | 2014-02-26 16:26
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册