滴水逆向三期15611 进程通信 项目练习

本文是关于项目的总结,涉及进程通信和dll无模块注入。阐述了进程通信的原因、使用命名管道的方式,介绍了dll无模块注入中采用shellcode启动的方法,包括shellcode生成、模块注入的细节,最后总结学习成果并提及hook部分因安全问题需实践体会。

概要

最终效果

  1. 创建进程通信
    在这里插入图片描述

  2. 通信测试
    在这里插入图片描述

  3. IATHOOK 剪切板内容在这里插入图片描述

  4. inlineHook 创建进程
    在这里插入图片描述

文章分如下几部分

  1. 步骤
  2. 进程通信
  3. dll注入
  4. 问题总结
    本篇文章不是一个实现过程, 而是一个关于这个项目的一个总结, 包含了比较多外链, 帮助更好的理解.

步骤

  1. 实现进程通信
  2. 无模块注入dll
  3. hook

进程通信

为什么要进程通信

比较明显的一个作用是, 能够分工工作, 那多线程不是也可以做吗? 但是多线程都在同一个空间, 容易造成异常, 进程隔离后使不同的工作能够不影响, 最典型的例子就是浏览器: Chrome为什么使用多进程, 再给出一个多线程, 多进程的例子, 第二个例子很纠结放不放, 随便看看吧, 依然困惑也没关系(我就是…), 没关系下面的具体应用让你恍然大悟.

如果是这些, 课程为什么这样设置, 海哥为啥让做呢…
如果你对外挂有一点了解, 就知道现在的网络游戏都有驱动防护也就是R0, 内核级. 这就导致了我们没法在R3进行常规的读写申请释放内存(WriteProcessMemory, ReadProcessMemory, Allocate…), 这个时候就需要编写相应的过保护程序(当然是R0层的).
现在假设我们过掉了保护, 可以在R0对游戏进行读写了. 画方框为例(方块透视), 在R0读到人物坐标, R3实现绘制. 换为自瞄就是R0读坐标, R3控制鼠标.(你要非说全在R0实现这些操作, 那无话可说了…)
R0 R3分别对应驱动程序和普通应用程序, 这里就是内核和用户层的进程通信了.
以方块透视来说, 我们希望人物实时的显示在屏幕, 而不是读出了人物坐标, 一两秒才更新, 总是滞后于实际人物位置. 也就引出进程通信最最重要的功能, 速度…
所以才会有这么多通信方式, 当然能搜到的常用方式就不用想着能用在现在的辅助上了.
这里就不过多引申, 毕竟我们只是了解, 实际应用还是靠自己去发掘了.
本文就用练习要求的命名管道.

命名管道

这个基本就是面向api编程, 其中比较难理解的是PIPE_TYPE, 有字节和消息两个类型.
就不拾人牙慧了, 给出两个网址 以及一个demo
代码有点多且没啥意思, 但不加又有违标题哈哈, 希望csdn能支持代码折叠…
点此跳过代码

https://www.cnblogs.com/lizhanzhe/p/10966253.html 命名管道的基本使用
http://blog.sina.com.cn/s/blog_71b3a9690100usem.html 命名管道的延伸, 以及传递方式

demo

Server

class HandleGatewayServer {
public:
	int Init();
	int Gateway();
	BOOL AnswerMsg();

protected:
	BOOL m_clientConnected = FALSE;
	DWORD  m_threadId = 0;
	HANDLE m_pipeHandle = INVALID_HANDLE_VALUE;
	LPTSTR m_lpszPipename = (LPTSTR)TEXT("\\\\.\\pipe\\mynamedpipe");
};

int HandleGatewayServer::Init() 
{
	while (1) {
		m_pipeHandle = CreateNamedPipe(m_lpszPipename, PIPE_ACCESS_DUPLEX, PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT, PIPE_UNLIMITED_INSTANCES, MAXPIPEFILESIZE, MAXPIPEFILESIZE, 0, NULL);
		printf(">>>管道建立成功, 等待客户端.\n");
		if (m_pipeHandle == INVALID_HANDLE_VALUE) {
			printf(">>>>>管道建立失败, LastError: %d\n", (DWORD)GetLastError());
			return -1;
		}

		//等待客户端连接, 如果成功, 返回非零值, 否则GetLastError返回ERROR_PIP_CONNECTED
		m_clientConnected = ConnectNamedPipe(m_pipeHandle, NULL);
		if (m_clientConnected) {
			printf(">>>客户端已连接, 建立网关\n");
			if (HandleGatewayServer::Gateway() == ERROR_BROKEN_PIPE)
				return -1;
		}
	
第1讲:2015-01-12(进制01) 第2讲:2015-01-13(进制02) 第3讲:2015-01-14(数据宽度-逻辑运算03) 第4讲:2015-01-15(通用寄存器-内存读写04) 第5讲:2015-01-16(内存寻址-堆栈05) 第6讲:2015-01-19(EFLAGS寄存器06) 第7讲:2015-01-20(JCC) 第8讲:2015-01-21(堆栈图) 第8讲:2015-01-21(宝马问题) 第9讲:2015-01-22(堆栈图2) 第10讲:2015-01-23(C语言01_后半段) 第10讲:2015-01-23(C语言完整版) 第11讲:2015-01-26(C语言02_数据类型) 第12讲:2015-01-27(C语言03_数据类型_IF语句) 第13讲:2015-01-28(C语言04_IF语句逆向分析上) 第14讲:2015-01-28(C语言04_IF语句逆向分析下) 第15讲:2015-01-29(C语言04_正向基础) 第16讲:2015-01-30(C语言05_循环语句) 第17讲:2015-02-02(C语言06_参数_返回值_局部变量_数组反汇编) 第18讲:2015-02-02(2015-01-30课后练习) 第19讲:2015-02-03(C语言07_多维数组) 第20讲:2015-02-03(2015-02-02课后练习) 第21讲:2015-02-04(C语言08_结构体) 第22讲:2015-02-05(C语言09_字节对齐_结构体数组) 第23讲:2015-02-06(C语言10_Switch语句反汇编) 第24讲:2015-02-26(C语言11_指针1) 第25讲:2015-02-27(C语言11_指针2) 第26讲:2015-02-28(C语言11_指针3) 第27讲:2015-02-28(C语言11_指针4) 第28讲:2015-03-02(C语言11_指针5) 第29讲:2015-03-03(C语言11_指针6) 第30讲:2015-03-04(C语言11_指针7) 第31讲:2015-03-06(C语言11_指针8) 第32讲:2015-03-09(位运算) 第33讲:2015-03-10(内存分配_文件读写) 第34讲:2015-03-11(PE头解析_手动) 第35讲:2015-03-12(PE头字段说明) 第36讲:2015-03-13(PE节表) 第37讲:2015-03-16(FileBuffer转ImageBuffer) 第38讲:2015-03-17(代码节空白区添加代码) 第39讲:2015-03-18(任意节空白区添加代码) 第40讲:2015-03-19(新增节添加代码) 第41讲:2015-03-20(扩大节-合并节-数据目录) 第42讲:2015-03-23(静态连接库-动态链接库) 第43讲:2015-03-24(导出表) 第44讲:2015-03-25(重定位表) 第45讲:2015-03-26(移动导出表-重定位表) 第46讲:2015-03-27(IAT表) 第47讲:2015-03-27(导入表) 第48讲:2015-03-30(绑定导入表) 第49讲:2015-03-31(导入表注入) 第50讲:2015-04-01(C++ this指针 类 上) 第51讲:2015-04-01(C++ this指针 类 下) 第52讲:2015-04-02(C++ 构造-析构函数 继承) 第53讲:2015-04-03(C++ 权限控制) 第54讲:2015-04-07(C++ 虚函数表) 第55讲:2015-04-08(C++ 动态绑定-多态-上) 第56讲:2015-04-08(C++ 动态绑定-多态-下) 第57讲:2015-04-09(C++ 模版) 第58讲:2015-04-10(C++ 引用-友元-运算符重载) 第59讲:2015-04-13(C++ new-delete-Vector) 第60讲:2015-04-14(C++Vector实现) 第61讲:2015-04-15(C++链表) 第62讲:2015-04-16(C++链表实现) 第63讲:2015-04-16(C++二叉树) 第64讲:2015-04-17(C++二叉树实现) 第65讲:2015-04-20(Win32 宽字符) 第66讲:2015-04-21(Win32 事件-消息-消息处理函数) 第67讲:2015-04-22(Win32 ESP寻址-定位回调函数-条件断点) 第68讲:2015-04-23(Win32 子窗口-消息处理函数定位) 第69讲:2015-04-24(Win32 资源文件-消息断点) 第70讲:2015-04-27(Win32 提取图标-修改标题) 第71讲:2015-04-28(Win32 通用控件-VM_NOTIFY) 第72讲:2015-04-29(Win32 PE查看器-项目要求) 项目一:PE查看器 开发周期(5天) 需求文档 第73讲:2015-05-07(Win32 创建线程) 第74讲:2015-05-08(Win32 线程控制_CONTEXT) 第75讲:2015-05-11(Win32 临界区) 第76讲:2015-05-12(Win32 互斥体) 第77讲:2015-05-13(Win32 事件) 第78讲:2015-05-14(Win32 信号量) 第79讲:2015-05-15(Win32 线程同步与线程互斥) 第80讲:2015-05-18(Win32 进程创建_句柄表) 第81讲:2015-05-20(Win32 以挂起形式创建进程) 第82讲:2015-05-21(Win32 加密壳_项目说明) 项目二:加密壳 开发周期(5天) 需求文档 第83讲:2015-05-28(Win32 枚举窗口_鼠标键盘事件) 第84讲:2015-05-29(Win32 CE练习) 第85讲:2015-06-01(Win32 OD练习) 第86讲:2015-06-03(Win32 ShellCode_远程线程注入) 第87讲:2015-06-04(Win32 加载EXE_模块隐藏) 第88讲:2015-06-09(Win32 IAT_HOOK) 第89讲:2015-06-10(Win32 InlineHook) 第90讲:2015-06-11(Win32 进程通信) 第91讲:2015-06-11(Win32 进程监控_项目说明) 项目三:进程监控 开发周期(5天) 需求文档 第92讲:2015-06-15(硬编码_01) 第93讲:2015-06-16(硬编码_02) 第94讲:2015-06-17(硬编码_03) 第95讲:2015-06-18(硬编码_04) 第96讲:2015-06-19(硬编码_05)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

四位

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值