od怎么把内存中的dll保存起来

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了od怎么把内存中的dll保存起来相关的知识,希望对你有一定的参考价值。

OD中有一个专门用来调试DLL文件的程序:loaddll.exe。当你把DLL文件拖入OD的时候,OD会自动询问你是否要用这个程序来调试DLL文件,点击确定。完成后会有一个蓝框的小窗口。
但是在这个时候,DLL文件已经被加载进去了,也就是说已经被脱壳并且重定位的操作也已经完成了 。这就很头疼了。我们必须得让程序停在壳的入口处,那么我们就在它加载完后看看,按下 Alt+M或者鼠标点击OD那个小框框的M按钮。找到这个DLL文件,可以看到最下面那个节就是多出来的节,也就是壳所在位置,从这里可以得出壳入口偏移为D000。
参考技术A *加载恶意代码:**OD可以直接加载可执行文件,也可以加载DLL文件,也可以将调试器附加在进程中,我们甚至可以用命令行运行恶意代码或者执行DLL中的某个函数。

**加载可执行文件:**在加载可执行文件的时候OD会使用它的加载器来加载这个程序,并可在此过程选择运行的命令行参数。如果OD能确定程序的main函数就在main处中断,否则在程序PE头提供的程序入口点中断。

**附加调试器到一个程序:**OD在附加到一个进程时会立即暂停这个程序以及它所有的线程。

读《程序是怎么跑起来的》第5章

现在计算机采用的是存储程序方式,在存储装置中保存程序,并逐一运行的方式。磁盘缓存是指从磁盘中读取的数据存储在内存中,当该数据再次被读取时,不是从磁盘而是直接从内存中高速读取。借助虚拟内存,哪怕是内存容量不足的计算机,也可以运行很大的程序。DLLDynamic Link Library的简称。函数的加载方式有静态链接和动态链接两种。扇区是磁盘保存数据的物理单位。计算机主要的存储部件是内存和磁盘。磁盘中存储的程序,必须要加载到内存后才能运行。在磁盘中保存的原始程序是无法直接运行的。这是因为,负责解析和运行程序内容的CPU,需要通过内部程序计数器来指定内存地址,然后才能读出程序。即使CPU可以直接读出并运行磁盘中保存的程序,由于磁盘读取速度慢,程序的运行速度还是会降低。总之,存储在磁盘中的程序需要读入到内存后才能运行。

磁盘高速缓存是一种用来加快磁盘访问的高速RAM,可以是磁盘驱动器本身的一部分(有时称为硬盘缓存或缓冲),也可以是计算机中为磁盘预留的RAM(有时称为软盘高速缓存)。硬盘缓存更加高效,但也昂贵得多,因此容量较小。所有当今的磁盘几乎都包括内部缓存。

虚拟内存是为了多任务内核提供的内存管理技术,它使得应用程序,因为他拥有连续的可用的内存,而实际上它通常是成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。与没有使用虚拟内存技术的系统相比,使用这种技术的系统使得大型程序的编写变得更加容易,对真正的物理(RAM)的使用也更有效率。对虚拟内存的定义是基于对地址空间的重定义的,即把地址空间定义为“连续的虚拟内存地址”,借此“欺骗”程序,使它们以为自己正在使用一大块的“连续”地址。

1、虚拟内存使用硬盘来模拟内存。

2、虚拟内存的目的是扩大寻址空间,增加程序可用的地址集合。

3、为方便实现虚拟内存,操作系统将虚拟内存划分成若干页面,每个页面大小固定,存储在硬盘上。当需要页面时,操作系统将其从硬盘复制到内存,将虚拟地址转换为真实地址。

4、将虚拟内存转换为真实地址的过程称为映射;将虚拟页面从硬盘复制到内存的过程称为页面调度或交换。

节约内存编程的方法:

1、通过DLL文件实现函数共享。

2、通过调用_stdcall来减少程序文件的大小:C语言中,在调用函数后,需要执行栈清理处理指令。栈清理处理是指,把不需要的数据从接收和传递函数的参数时使用的内存上的栈区域中清理出去。该命令不是程序记述的,而是在程序编译时由编译器自动附加到程序中。编译器默认将该处理附加在函数调用方。通过在函数名加上_stdcall,就可以把栈清理处理变为在被调用函数一方。

 

磁盘是通过把其物理表面划分成多个空间来使用的。划分的方式有扇区方式和可变长方式两种,前者是指将磁盘划分为固定长度的空间,后者则是把磁盘划分为长度可变的空间。一般windows系统计算机所使用的硬盘,采用的都是扇区方式。扇区方式中,把磁盘表面分成若干个同心圆的空间就是磁道,把磁道按照固定大小(能存储的数据长度相同)划分而成的空间就是扇区。扇区是对磁盘进行物理读写的最小单位。Windows中使用的磁盘,一般1个扇区是512字节。不过,Windows在逻辑方面(软件方面)对磁盘进行读写的单位是扇区整数倍簇。根据磁盘容量的不同,1簇可以是512字节(1=1扇区)、1KB(1=2扇区)、2KB4KB8KB16KB32KB1=64扇区)。磁盘的容量越大,簇的容量也越大。以簇为单位进行读写时,1簇中没有填满的区域会保持不被使用的状态。虽然这看起来是有点浪费,不过该机制就是如此规定的,所以我们也没有什么好办法。另外,如果减少簇的容量,磁盘访问次数就会增加,就会导致读写文件的时间变长。由于在磁盘表面上,表示扇区区分的领域是必要的。因此,如果簇的容量过小,磁盘的整体容量也会减少。扇区和簇的大小,是由处理速度和存储容量的平衡来决定的。

现在计算机采用的是存储程序方式,在存储装置中保存程序,并逐一运行的方式。磁盘缓存是指从磁盘中读取的数据存储在内存中,当该数据再次被读取时,不是从磁盘而是直接从内存中高速读取。借助虚拟内存,哪怕是内存容量不足的计算机,也可以运行很大的程序。DLLDynamic Link Library的简称。函数的加载方式有静态链接和动态链接两种。扇区是磁盘保存数据的物理单位。计算机主要的存储部件是内存和磁盘。磁盘中存储的程序,必须要加载到内存后才能运行。在磁盘中保存的原始程序是无法直接运行的。这是因为,负责解析和运行程序内容的CPU,需要通过内部程序计数器来指定内存地址,然后才能读出程序。即使CPU可以直接读出并运行磁盘中保存的程序,由于磁盘读取速度慢,程序的运行速度还是会降低。总之,存储在磁盘中的程序需要读入到内存后才能运行。

磁盘高速缓存是一种用来加快磁盘访问的高速RAM,可以是磁盘驱动器本身的一部分(有时称为硬盘缓存或缓冲),也可以是计算机中为磁盘预留的RAM(有时称为软盘高速缓存)。硬盘缓存更加高效,但也昂贵得多,因此容量较小。所有当今的磁盘几乎都包括内部缓存。

虚拟内存是为了多任务内核提供的内存管理技术,它使得应用程序,因为他拥有连续的可用的内存,而实际上它通常是成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。与没有使用虚拟内存技术的系统相比,使用这种技术的系统使得大型程序的编写变得更加容易,对真正的物理(RAM)的使用也更有效率。对虚拟内存的定义是基于对地址空间的重定义的,即把地址空间定义为“连续的虚拟内存地址”,借此“欺骗”程序,使它们以为自己正在使用一大块的“连续”地址。

1、虚拟内存使用硬盘来模拟内存。

2、虚拟内存的目的是扩大寻址空间,增加程序可用的地址集合。

3、为方便实现虚拟内存,操作系统将虚拟内存划分成若干页面,每个页面大小固定,存储在硬盘上。当需要页面时,操作系统将其从硬盘复制到内存,将虚拟地址转换为真实地址。

4、将虚拟内存转换为真实地址的过程称为映射;将虚拟页面从硬盘复制到内存的过程称为页面调度或交换。

节约内存编程的方法:

1、通过DLL文件实现函数共享。

2、通过调用_stdcall来减少程序文件的大小:C语言中,在调用函数后,需要执行栈清理处理指令。栈清理处理是指,把不需要的数据从接收和传递函数的参数时使用的内存上的栈区域中清理出去。该命令不是程序记述的,而是在程序编译时由编译器自动附加到程序中。编译器默认将该处理附加在函数调用方。通过在函数名加上_stdcall,就可以把栈清理处理变为在被调用函数一方。

磁盘是通过把其物理表面划分成多个空间来使用的。划分的方式有扇区方式和可变长方式两种,前者是指将磁盘划分为固定长度的空间,后者则是把磁盘划分为长度可变的空间。一般windows系统计算机所使用的硬盘,采用的都是扇区方式。扇区方式中,把磁盘表面分成若干个同心圆的空间就是磁道,把磁道按照固定大小(能存储的数据长度相同)划分而成的空间就是扇区。扇区是对磁盘进行物理读写的最小单位。Windows中使用的磁盘,一般1个扇区是512字节。不过,Windows在逻辑方面(软件方面)对磁盘进行读写的单位是扇区整数倍簇。根据磁盘容量的不同,1簇可以是512字节(1=1扇区)、1KB(1=2扇区)、2KB4KB8KB16KB32KB1=64扇区)。磁盘的容量越大,簇的容量也越大。以簇为单位进行读写时,1簇中没有填满的区域会保持不被使用的状态。虽然这看起来是有点浪费,不过该机制就是如此规定的,所以我们也没有什么好办法。另外,如果减少簇的容量,磁盘访问次数就会增加,就会导致读写文件的时间变长。由于在磁盘表面上,表示扇区区分的领域是必要的。因此,如果簇的容量过小,磁盘的整体容量也会减少。扇区和簇的大小,是由处理速度和存储容量的平衡来决定的。

 

以上是关于od怎么把内存中的dll保存起来的主要内容,如果未能解决你的问题,请参考以下文章

PE文件结构 输入表

c++如何找到进程中的输出表内存地址(OD的bp)

Windows 逆向OD 调试器工具 ( 显示模块窗口 | 显示记录窗口 | 显示内存窗口 | 显示线程 | 显示句柄 | 显示 CPU | 多窗口界面 )

学习:脱壳之VB程序快速寻找OEP

《程序是怎么跑起来的》第五章

C#调用C++的dll,dll中需要传入一个 uchar *的一个 500M内存空间的首地址,现在