1\根据作者思路,重写了代码,大概300行. 去掉了一些学习过程中没必要的代码.
2\这源码是没过CFG和堆栈地址检查的第一版,也就是原博客文章第一篇;过CFG和堆栈地址检查的是原博客文章第二篇(作者说为了避免被坏人利用,没放源码)
3\转眼间就从15PB毕业了, 感谢老师和同学们的帮助!
4\在重写过程中,碰到了许多问题,我会在"三"中一一列出. 这些问题,对我来说,都是那种"第一次震惊"的类型
5\"二"中主要讲实现思路(基本就那篇博客讲的,重复)
6\就一个CPP直接加到工程里就行, 一个PID, 指定目标进程PID. 32位, 或wow64process
把剩余过cfg和堆栈检查的做了,现在可以日notepad和mspaint了
修改:
1\ROPList放到目标线程堆栈中,放的位置比较随意,故可能放到stack RW+Guard部分,也可能覆盖线程堆栈数据.
2\shellcode中开始那一段就没有必要了
3\大部分代码作者都提供了,抄的作者代码.
此文章为本人原创, 未经本人允许, 可随意转载. 哈哈哈
1\NtQueueApcThread(x,x,x,x,x) 跟QueueUserApc类似,前者支持queue 3个参数的函数,后者支持queue 1个参数的函数.
2\GlobalAddAtomA(W)和GlobalGetAtomNameA(W)可以用来进行跨进程数据传递.
3\寻找目标进程中的Alertable 线程方式: 在本进程中,为每一个目标进程中的线程创建一个Event, 通过DuplicateHandle使得本进程句柄在目标进程中有效,再对每一个线程QueueUserApc(SetEvent,x,x),之后WaitForMultipleObjects即可找到一个Alertable线程. (有关清理目标进程中的句柄, 作者用了DuplicateHandle(x,x,x,x,x,x,DUPLICATE_CLOSE_SOURCE)这种方式,我觉得蛮巧妙)
4\在目标进程中寻找RW区域,作者就找了kernelbase.dll的.data段+SizeOfRawData,这个位置. 这一点,有问题.(这个位置后面的空间并非不用的)
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!