在前面的注入代码的章节中,我们利用了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. 按Right-BICEP的测试用例

    测试方法:Right-BICEP 测试计划 1.Right-结果是否正确? 2.B-是否所有的边界条件都是正确的? 3.P-是否满足性能要求? 4.结果是否有符合要求的20道题目? 5.所得到的最大数 ...

  2. ZOJ-3870 Team Formation

    题目大意:给n个正数,找出满足A^B>max(A,B)的对数. 题目分析: 代码如下: # include<iostream> # include<cstdio> # i ...

  3. java计算文件32位md5值

    protected static String getFileMD5(String fileName) { File file = new File(fileName); if(!file.exist ...

  4. vc++ mfc 里保存缩放的bmp图片 不失真

    void CSaveView::OnFileSave() { BITMAP info;//原始图片 m_bitmap.GetBitmap(&info); CDC DC1; DC1.Create ...

  5. lua for循环

    <转自网络,仅供学习> for循环是一个循环控制结构,可以有效地编写需要执行的特定次数的循环. 语法 Lua编程语言的for循环的语法是: for init,max/min value, ...

  6. unity3D游戏开发之详解Animation类和Animator类

    详解Animator类和Animation类 链接: http://wenku.baidu.com/link?url=SiaUYcdrNYjOYrWVDJSKGAYdJOntMTOhsVJtyBk2i ...

  7. IIS_PUT

    [*] Put file success http://58.16.95.114:80/1470546504.01.txt [*] Put file success http://58.17.121. ...

  8. SQL2005:使用varchar(max)代替text

    SQL Server 2005 联机丛书 中文相关说明 1.在 Microsoft SQL Server 的未来版本中将删除 ntext.text 和 image 数据类型.请避免在新开发工作中使用这 ...

  9. 014. asp.net实现记住密码的功能

    protected void Button1_Click(object sender, EventArgs e) { if (txtname.Text.Trim().Equals("mr&q ...

  10. SmartAdmin 打开速度慢的原因

    最近在使用SmartAdmin做个小东西,发布在公网上,我的机器打开飞快,但是到了其它人的机器上变得极慢了.而且在我的手机上也打开变慢.     查找原因,原来如此.      <link re ...