在前面的注入代码的章节中,我们利用了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):利用内存来进行获取计算结果的更多相关文章

  1. WINDOWS黑客基础(4):查找进程运行的基址

    从WINDOWS VISITA开始以后,windows已经开始支持随机基址的关系,也就是说以前我们的进程基址都是从0x40000开始的,如果一个变量在我们第一次运行的时候地址为0x50000,那么以后 ...

  2. WINDOWS黑客基础(3):注入代码

    有使用过外挂的朋友应该知道,我们在玩游戏的时候,有很多辅助功能给你使用,比如吃药,使用物品等功能,这个时候我们就是使用注入代码的技术,简单的来将就是我们让另外一个进程去执行我们想让它执行的代码,这中间 ...

  3. WINDOWS黑客基础(6):查看文件里面的导入表

    int main(void) { HANDLE hFile = CreateFile("D:\\Shipyard.exe", GENERIC_READ, FILE_SHARE_RE ...

  4. 【黑客基础】Windows PowerShell 脚本学习(上)

    视频地址:[黑客基础]Windows PowerShell 脚本学习 2019.12.05 学习笔记 1.$PSVersionTable :查看PowerShell的版本信息. 2.PowerShel ...

  5. Windows内核基础知识-8-监听进程、线程和模块

    Windows内核基础知识-8-监听进程.线程和模块 Windows内核有一种强大的机制,可以在重大事件发送时得到通知,比如这里的进程.线程和模块加载通知. 本次采用链表+自动快速互斥体来实现内核的主 ...

  6. Windows内核基础知识-5-调用门(32-Bit Call Gate)

    Windows内核基础知识-5-调用门(32-Bit Call Gate) 调用门有一个关键的作用,就是用来提权.调用门其实就是一个段. 调用门: 这是段描述符的结构体,里面的s字段用来标记是代码段还 ...

  7. Windows Server基础架构云参考架构:硬件之上的设计

    作者 王枫 发布于2014年1月27日 综述 毫无疑问,移动互联网.社交网络.大数据和云计算已经成为IT发展的四个大的趋势.其中云计算又为前三个提供了一个理想的平台.今天不仅互联网公司,很多传统行业的 ...

  8. c语言基础学习08_内存管理

    =============================================================================涉及到的知识点有:一.内存管理.作用域.自动变 ...

  9. windows powershell基础

    windows powershell基础 目录: 1.管道和重定向 2.命令执行 3.变量 4.数组和哈希表 #@()创建数组,使用","把每个值分隔开,@{}创建哈希表,用&qu ...

随机推荐

  1. iOS学习笔记---oc语言第一天

    第一讲 初始类和对象 c语言的超集,允许在oc中使用c语言源代码.编译器兼容c语言程序 具备完善的面向对象特性 包含一个运行时系统 类库丰富 面向对象编程 oop 面向对象语言:c++  java   ...

  2. Linux下Find命令的使用

    Find命令的一般形式为: findpathname-options[-print-exec-ok] pathname:find命令所查找的目录路径.例如用.来表示当前目录,用/来表示系统根目录. - ...

  3. python 函数性能分析

    1 使用profile分析函数性能示例1, 以profile为例: import profile def profileTest(): Total =1; for i in range(10): To ...

  4. Linux 线程--那一年, 我们一起忽视的pthread_join

    前言: 通过linux的pthread库, 相信大家对创建/销毁线程肯定很熟悉, 不过对pthread_join是否知道的更多呢?实验: 先编写一个常规的程序 #include <pthread ...

  5. Apache CXF 101 Win Eclipse开发环境搭建

    前言 博客草稿中“SOA生态系统初探”一文一直没有进展,感觉要将SOA.Web Service(WS).REST等概念阐述清楚还需要一些酝酿. 顶天须得立地,这里记录一些“下里巴人”的实践,主要考察A ...

  6. HDU 5918 KMP/模拟

    Sequence I Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total ...

  7. 4-3 yum命令

    1.常用yum命令 <1>查询 yum list #查询所有可用软件包列表(以 包名 - 版本 - yum源所在名称 格式显示) yum search 关键字 #搜索服务器上所有和关键字相 ...

  8. 解决dede搜索页面只能显示10条信息解决方案

    解决dede搜索页面只能显示10条信息解决方案,感觉显示的信息太少,这时就要想办法去解决一下.看看有什么好办法来解决一下这个问题. dede搜索页模板中,默认只能显示10条记录. 打开dede搜索页模 ...

  9. 《苹果开发之Cocoa编程》挑战1 创建委托 练习

    <苹果开发之Cocoa编程>第4版 P87 新建一个单窗口应用程序,设置某对象为窗口的委托,当用户调整窗口尺寸时,确保窗口高度为宽度的2倍. 需要实现的委托方法为:-(NSSize)win ...

  10. 常用的文件和目录操作命令【转vbird】

    cdpwdmkdirrmdirlscprmmvcattacnlmorelessheadtailtouch cd (变换目录) 我们知道vbird这个使用者的家目录是/home/vbird/,而root ...