C++网络编程,实现超级链接到指定目标地址GotoURL()

桑夏艾 2014-08-03 05:48:17

HINSTANCE CHyperLink::GotoURL(LPCTSTR url, int showcmd)
{
TCHAR key[MAX_PATH + MAX_PATH];

// 调用函数ShellExecute()
HINSTANCE result = ShellExecute(NULL, _T("open"), url, NULL,NULL, showcmd);

// 如果错误,则检查注册表获得.htm文件的注册键值
if ((UINT)result <= HINSTANCE_ERROR) {

if (GetRegKey(HKEY_CLASSES_ROOT, _T(".htm"), key) == ERROR_SUCCESS) {
lstrcat(key, _T("\\shell\\open\\command"));

if (GetRegKey(HKEY_CLASSES_ROOT,key,key) == ERROR_SUCCESS) {
TCHAR *pos;
pos = _tcsstr(key, _T("\"%1\""));
if (pos == NULL) { // 没有发现
pos = strstr(key, _T("%1")); // 检查%1
if (pos == NULL) // 没有参数
pos = key+lstrlen(key)-1;
else
*pos = '\0'; // 删除参数
}
else
*pos = '\0'; // 删除参数

lstrcat(pos, _T(" "));
lstrcat(pos, url);
result = (HINSTANCE) WinExec(key,showcmd);
}
}
}

return result;
}

这个函数实现的功能是链接到指定的目标地址,如果我调用
GotoURL(_T("www.google.con.hk"),SW_SHOW);
就会跳转到google页面
问题是:
1 .这个函数中这段操作注册表的代码什么意思?
2 ._T("\%1")代表的是什么?

下面这段代码,大家重点解释一下哈:

if (GetRegKey(HKEY_CLASSES_ROOT,key,key) == ERROR_SUCCESS) {
TCHAR *pos;
pos = _tcsstr(key, _T("\"%1\""));
if (pos == NULL) { // 没有发现
pos = strstr(key, _T("%1")); // 检查%1
if (pos == NULL) // 没有参数
pos = key+lstrlen(key)-1;
else
*pos = '\0'; // 删除参数
}
else
*pos = '\0'; // 删除参数
...全文
617 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
桑夏艾 2014-08-05
  • 打赏
  • 举报
回复
既然代码已经懂了,结贴了~~~
桑夏艾 2014-08-04
  • 打赏
  • 举报
回复
还请
引用 1 楼 sniffer12345 的回复:
1 .这个函数中这段操作注册表的代码什么意思? 用浏览器打开目标url。。注册表里头填写了默认浏览器的可执行文件路径 2 ._T("\%1")代表的是什么? 因为注册表里头你要是有去研究的话,那么shell/open/command这一个是dword值,一般格式是: "path_to_executable" %1 %1就是参数一了,跟windows下bat文件语法一样的 不过你贴的这代码,啧啧,软件漏洞就是这样出来的。
真心请2楼大神,讲解一下为什么会有漏洞,麻烦说基础点,不然我又不懂了~~~~学渣在这给膜拜了~~~
桑夏艾 2014-08-04
  • 打赏
  • 举报
回复
这段代码只是书上的一个例子,应该不是很严谨的,至于为什么会有软件漏洞,我不知道也没看出来。
如果可能你给我讲解一下,为什么会出现漏洞可以不?

以上代码,我基本弄懂了,下面是我的理解
HINSTANCE CHyperLink::GotoURL(LPCTSTR url, int showcmd)
{
TCHAR key[MAX_PATH + MAX_PATH];

// 调用函数ShellExecute()
//ShellExecute:mailto:用户账号@邮件服务器地址
//如:ShellExecute(Handle, "open"," mailto:who@mail.neu.edu.cn", NULL, NULL, SW_SHOWNORMAL);打开新邮件窗口,
//并自动填入收件人地址。若指定多个收件人地址,则收件人地址之间必须用分号或逗号分隔开(下同)。
//ShellExecute:mailto:用户账号@邮件服务器地址
//subject=邮件主题&body=邮件正文
//如:ShellExecute(handle, ‘open’, ‘ mailto:who@mail.neu.edu.cn?subject=Hello&Body=This is a test’,NULL,
// NULL, SW_SHOWNORMAL);打开新邮件窗口,并自动填入收件人地址、邮件主题和邮件正文。
//若邮件正文包括多行文本,则必须在每行文本之间加入换行转义字符%0a。

HINSTANCE result = ShellExecute(NULL, _T("open"), url, NULL,NULL, showcmd);

// 如果错误,则检查注册表获得.htm文件的注册键值
if ((UINT)result <= HINSTANCE_ERROR) {
//获取默认的浏览器
//现在key = Liebao.HTML

if (GetRegKey(HKEY_CLASSES_ROOT, _T(".htm"), key) == ERROR_SUCCESS) {
lstrcat(key, _T("\\shell\\open\\command")); // key = Liebao.HTML\shell\open\command
// key = "C:\User\桑夏艾\AppData\Local\libao\liebao.exe""%1"
if (GetRegKey(HKEY_CLASSES_ROOT,key,key) == ERROR_SUCCESS) {
TCHAR *pos;
pos = _tcsstr(key, _T("\"%1\""));
if (pos == NULL) { // 没有发现
pos = strstr(key, _T("%1")); // 检查%1
if (pos == NULL) // 没有参数
pos = key+lstrlen(key)-1;
else
*pos = '\0'; // 删除参数
}
else
*pos = '\0'; // 删除参数 *pos = "%1"

lstrcat(pos, _T(" "));
lstrcat(pos, url);
//pos是key的指针,现在Key =" "C:\User\桑夏艾\AppData\Local\libao\liebao.exe" mailto:729017304@qq.com
result = (HINSTANCE) WinExec(key,showcmd);
}
}
}

return result;
}



有心的人稍稍推理一下,就应该明白代码的原理和作用了
sniffer12345 2014-08-03
  • 打赏
  • 举报
回复
1 .这个函数中这段操作注册表的代码什么意思? 用浏览器打开目标url。。注册表里头填写了默认浏览器的可执行文件路径 2 ._T("\%1")代表的是什么? 因为注册表里头你要是有去研究的话,那么shell/open/command这一个是dword值,一般格式是: "path_to_executable" %1 %1就是参数一了,跟windows下bat文件语法一样的 不过你贴的这代码,啧啧,软件漏洞就是这样出来的。

64,676

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧