WINDOWS黑客基础(5):利用内存来进行获取计算结果
在前面的注入代码的章节中,我们利用了VirtualAllocEx来在对方的进程开辟了一块内存,并且将代码复制进对方进程的内存里面,从而执行那段内存的代码,但是这里有一个问题,就是代码不是执行在我们进程内的,所以我们无法像在本进程编程那样直接利用返回值或者传入指针来获取计算结果,这个时候我们可能需要到很多通讯手段,但是这样将会让我们的注入代码变得非常复杂,所以我自己想了一个方法,就是利用VirtualAllocEx开辟的内存区域来进行通讯
整体的步骤是这样的:
1.在对方的内存开始一块内存,
2.复制代码进去
3.根据代码计算出我们的结果应该放在哪里,比如我们申请了100字节的内存,其中50字节是代码,那么我们应该想办法把我们的结果放在50字节以后的地方
4.假设根据上面的步骤,我们的结果放在了内存偏移地址为60的地方,那么我们可以将指向这快内存的指针向后移动60个字节,那么这个就是我们存放结果的地方
上面的这种方法当然只是适合存放小数据的,如果有大的数据需要传出来,我们还是需要其他的手段,比如开辟共享内存,利用SOCKET等手段
有人也会说专门开辟一块内存存放数据,这样的话我们就可以把内存放在这个地方,而不是把代码跟计算结果混淆,但是要知道,因为内存映射的原因,指向同一块物理内存的不同进程对应的虚拟内存地址不一定是一样的,也就是说,我们把代码从A进程注入了B进程,此时我们的在A进程向B进程VirtualAllocEx了一块内存,在A进程的地址是1000,我们的代码也是把数据写入到虚拟内存地址1000的,但是这段代码是在B进程执行的,那么B进程虚拟内存地址1000是什么东西??没人会知道
在这个方法中还有一个比较重要的就是取得当前代码运行的地址,本来寄存器是有EIP这个寄存器可以让我们看到究竟程序运行到了哪个内存地址的代码,但是我们在编译器中无法使用EIP,也无法读取,所以我们使用另外一种方法,就是call 命令,CPU在执行CALL命令后,会把我们的下一段代码的地址push到栈里面,这个时候我们可以利用这样获取下一段代码的地址
call Next
Next:pop eax
这样,eax里面就是我们next:pop eax这段代码的地址了
但是后来我想了下,这种方法不是很安全,原因跟上面说的那个一样,指向同一块物理内存的不同进程对应的虚拟地址不一定是一样的,而编译器在给我们编译cal next的时候已经把地址写死了,我试验了下,两个不同进程的虚拟内存地址是一样的,但是我没找到肯定的说明,所以没办法确定,因此这种方法不是很安全
我本来还想用另外一种方法就是CONTEXT,windows下有GetThreadContxt可以获取当前线程的context,但是这个方法也没办法拿到正确的EIP,因为如果一个线程没有停止运行,EIP会变,但是我想了下,在我们debug的时候有办法拿到函数调用栈,那么应该也有办法获取函数的调用栈,这个办法也许虽然不能拿到EIP,但是却可以拿到线程一些函数的地址,后面也可以通过函数地址+offset来将数据放到内存的某个地方
WINDOWS黑客基础(5):利用内存来进行获取计算结果的更多相关文章
- WINDOWS黑客基础(4):查找进程运行的基址
		从WINDOWS VISITA开始以后,windows已经开始支持随机基址的关系,也就是说以前我们的进程基址都是从0x40000开始的,如果一个变量在我们第一次运行的时候地址为0x50000,那么以后 ... 
- WINDOWS黑客基础(3):注入代码
		有使用过外挂的朋友应该知道,我们在玩游戏的时候,有很多辅助功能给你使用,比如吃药,使用物品等功能,这个时候我们就是使用注入代码的技术,简单的来将就是我们让另外一个进程去执行我们想让它执行的代码,这中间 ... 
- WINDOWS黑客基础(6):查看文件里面的导入表
		int main(void) { HANDLE hFile = CreateFile("D:\\Shipyard.exe", GENERIC_READ, FILE_SHARE_RE ... 
- 【黑客基础】Windows PowerShell 脚本学习(上)
		视频地址:[黑客基础]Windows PowerShell 脚本学习 2019.12.05 学习笔记 1.$PSVersionTable :查看PowerShell的版本信息. 2.PowerShel ... 
- Windows内核基础知识-8-监听进程、线程和模块
		Windows内核基础知识-8-监听进程.线程和模块 Windows内核有一种强大的机制,可以在重大事件发送时得到通知,比如这里的进程.线程和模块加载通知. 本次采用链表+自动快速互斥体来实现内核的主 ... 
- Windows内核基础知识-5-调用门(32-Bit Call Gate)
		Windows内核基础知识-5-调用门(32-Bit Call Gate) 调用门有一个关键的作用,就是用来提权.调用门其实就是一个段. 调用门: 这是段描述符的结构体,里面的s字段用来标记是代码段还 ... 
- Windows Server基础架构云参考架构:硬件之上的设计
		作者 王枫 发布于2014年1月27日 综述 毫无疑问,移动互联网.社交网络.大数据和云计算已经成为IT发展的四个大的趋势.其中云计算又为前三个提供了一个理想的平台.今天不仅互联网公司,很多传统行业的 ... 
- c语言基础学习08_内存管理
		=============================================================================涉及到的知识点有:一.内存管理.作用域.自动变 ... 
- windows powershell基础
		windows powershell基础 目录: 1.管道和重定向 2.命令执行 3.变量 4.数组和哈希表 #@()创建数组,使用","把每个值分隔开,@{}创建哈希表,用&qu ... 
随机推荐
- 如何让Visual Studio  清除最近打开项目 关闭上次未关闭的标签窗口
			删除最近打开的文件: 打开HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\9.0\FileMRUList 删除最近打开的项目: 打开HKEY_CUR ... 
- SQL参数化查询--最有效可预防SQL注入攻击的防御方式
			参数化查询(Parameterized Query 或 Parameterized Statement)是访问数据库时,在需要填入数值或数据的地方,使用参数 (Parameter) 来给值. 在使用参 ... 
- 百度APIStore
			链接 http://apistore.baidu.com/ 提供了许多免费的api接口,用来做功能性的查询 
- JavaWeb学习记录(八)——servlet获取配置信息
			jdbc.properties内容如下: jdbcUrl=jdbc\:mysql\://localhost\:3306/animaluser=rootpass=root servlet获取资源信息代码 ... 
- HDU 5957 Query on a graph
			HDU 5957 Query on a graph 2016ACM/ICPC亚洲区沈阳站 题意 \(N(N \le 10^5)\)个点,\(N\)条边的连通图. 有\(M \le 10^5\)操作: ... 
- 4-3 yum命令
			1.常用yum命令 <1>查询 yum list #查询所有可用软件包列表(以 包名 - 版本 - yum源所在名称 格式显示) yum search 关键字 #搜索服务器上所有和关键字相 ... 
- POJ3308   Paratroopers(网络流)(最小割)
			Paratroopers Time Limit: 1000MS Memory Limit: 655 ... 
- HDU-5536 Chip Factory (字典树)
			题目大意:给n个数,编号为1~n,取三个编号不同的数,使表达式(a+b)^c的值最大. 题目分析:将这n个数按二进制位建立一棵trie.枚举i.j的和,查询亦或最大值,但在查询之前要把i.j在trie ... 
- Attention and Augmented Recurrent Neural Networks
			Attention and Augmented Recurrent Neural Networks CHRIS OLAHGoogle Brain SHAN CARTERGoogle Brain Sep ... 
- linux重启和关闭系统命令
			重启命令: 1.reboot 2.shutdown -r now 立刻重启(root用户使用) 3.shutdown -r 10 过10分钟自动重启(root用户使用) 4.shutdown -r 2 ... 
