首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

加壳脱壳笔记

脱壳存根(stub) 脱壳存根执行了以下三个步骤: (1)将原始程序脱壳到内存中 (2)解析原始可执行文件的所有导入函数 (3)将可执行程序转移到原始的程序入口点(OEP) 手动查找OEP 查找尾部跳转指令...该函数上设置断点可以使你绕过脱壳存根的开头代码原始程序调用且继续向后工作的函数上设置断点。 查找OEP 一种手动查找OEP的策略是代码中每个循环后面设置断点。...使用OllyDbg的RunTrace选项 手动修复导入表 导入表在内存中实际上有两个表: 函数名称或者序号列表,其中包含加载器或脱壳存根所需要的函数名称或者序号 所有导入函数的地址列表。...exe的入口点只开始时执行一次,而dLL的入口点在整个执行过程中至少执行两次,一次是开始,另一次是退出时,用来清理dll再退出。...pushA指令:用来存在寄存器的栈地址,在这些地址上设置硬件断点 popAD指令:调用该指令时会触发设置的硬件断点,此时就能在不远的地方找到OEP(尾部跳转之前会有一个popad或者popfd指令)

1.5K40

.NET面试题系列 - .NET框架基础知识(1)

3.0之前,.NET框架的Web解决方案是ASP.NET(Webform & MVC),数据连接为ADO.NET(支持过去的ODBC,OLE等,并支持SQL Server和Oracle),Windows...开始运行.NET程序之前,编译器将代码转换为IL。...当然,如果这个类型引用了其他的类型,则会导致一连串的程序集加载,这将定义程序代码执行的环境(类似Java的JVM)。...类型加载程序(Class loader)会为每个方法插入一个存根调用方法时,CLR会检查方法的存根,如果存根为空,则执行JIT编译过程,并将该方法被编译后的本地机器代码地址写入到方法存根中。...当第二次对同一方法进行调用时,会再次检查这个存根,如果发现其保存了本地机器代码的地址,则直接跳转到本地机器代码进行执行,无需再次进行JIT编译。JIT编译还会优化本地的代码

1.7K10
您找到你想要的搜索结果了吗?
是的
没有找到

内存管理

通常,将指令与数据捆绑到内存地址可以在编译时进行,也可以加载时进行,还可以执行时进行。 在编译时绑定地址,那么生成的就是绝对代码。这样的地址对应于实际的物理地址。...一般是嵌入式系统开发的时候常用的一种做法,尤其是当裸机开发的时候。通常寄存器映射的物理地址是不变的,因此代码需要跑到别的开发板上去,可能就要做出较大的修改。...加载执行绑定地址,那么编译器就需要生成可重定位代码。这种情况下,如果起始地址改变,那么重新加载即可。地址仍旧对应于实际物理地址。 执行程序的时候绑定地址,这样进程能从一个内存段移动到另一个内存段。...Windows下常见的DLL文件就是动态链接Linux下就.so文件)。这一点特别适合于系统。每个可执行文件对每个它需要的程序的引用都是一个存根。...存根能指出如何定位内存驻留区的程序,以及该程序不再内存时,如何装入。动态链接的另一个优点是更新方便。使用动态链接,只需要更新就可以。不需要改变程序本身。

66710

你的C#代码是怎么跑起来的(二)

接上篇:你的C#代码是怎么跑起来的(一) 通过上篇文章知道了EXE文件的结构,现在来看看双击后是怎样运行的: 双击文件后OS Loader加载PE文件并解析,PE Optional Header里找到基地址和...RVA,通过这两个确定了程序的入口地址,这个地址指向MsCorEE.dll的_CorExeMain(),执行它。...JIT编译之前CLR会对Main方法的代码进行验证,确保类型安全且元数据正确,一切没问题后先检查类型方法表里这个方法的存根,不为空的话表示已经编译过就不需要再次编译,没有的话JIT把这段IL代码编译成本地代码保存到内存中并方法表的存根做上标记...程序执行到哪里就编译到哪里,没有执行到的就不会加载和编译,同样的代码再次执行的话就直接在内存里拿了,这也是为什么第一次运行C#时比较慢而后面就快的原因。...,用到了int,bool,string,这些是mscorlib.dll程序集的system命名空间下,所以先加载mscorlib.dll程序集,再把int,bool,string加到类型对象里。

1.1K90

Python 相关文件常见的后缀名详解

pyc文件和py文件一样,都可以直接执行,下面的运行结果都是等价的: python test.py python test.pyc 作用一:提升加载性能 我们知道 Python 代码执行时,会先由 Python...因此为了提高加载效率,Python 程序执行结束后会把每个文件的字节码写入到硬盘中保存为 xxx.pyc 文件,这样下一次再执行这个程序时先在目录下找有没有xxx.pyc 文件,如果有这个对应文件且修改时间和...例如有一个 C 语言编写的 Windows 动态链接 test_lib.dll,编译前的代码如下: int sum(int x, int y) { return x + y; } 我们可以...系统上,Python 还有一种 pyd格式的动态链接,上面的调用方式是先通过ctypes.windll.LoadLibrary 方法将动态链接加载进来,而pyd格式就可以 Python 代码中直接...pyo 另一种 Python 字节码缓存文件,只存在于 Python2 及 Python3.5 之前的版本。 pyi Python 的存根文件,常用于 IDE 代码格式检查时的类型提示。

3.3K20

.NET简谈互操作(五:基础知识之Dynamic平台调用)

,然后用DllImport来标识相关调用约定;这篇文章我们将介绍怎么通过动态的方式调用非托管代码进行讲解之前我们有必要简单的了解一下,托管代码调用非托管代码的大概的步骤或者说是相关细节吧;只有当我们脑子里有一套属于自己的理解思路时...在内存的代理存根,当我们下次又进入到内核的时候,系统去检查一下,发现有过一次调用了,所以下次就去读取存根中的地址进行调用),系统会去加载非托管DLL文件到内存并设置相关数据,以便后期使用;动态调用的原理就是我们把这部分的工作自己手动来做...,比如第一次调用非托管DLL肯定是要慢于后面调用的;所以一些必要的场合下,我们真的有必要进行动态P/Invoke; 动态平台调用示例1 托管的.NET中我们可以通过使用Win32API中的LoadLibrary...LoadLibrary(string iplibfilenmae); 这样的操作就好比我们图1中的第一次调用过程要执行的操作; [DllImport("Win32DLL.dll", EntryPoint...,我们来看全部代码; namespace CSharp.Interop { /// /// 动态平台调用,手动加载非托管DLL文件 /// </summary

37920

.Net 框架

MsCorEE.dll是一个很细的软件层。加载了MsCorEE.dll之后,会调用其中的_CorExeMain()函数,该函数会加载合适版本的CLR。CLR运行之后,程序的执行权就交给了CLR。...CLR会找到程序的入口点,通常是Main()方法,然后执行它。这里又包含了以下过程: 加载类型。执行Main()方法之前,首先要找到拥有Main()方法的类型并且加载这个类型。...Class loader找到并加载完这个类型之后,它的类型信息会被缓存起来,这样就无需再次进行相同的过程。加载这个类以后,还会为它的每个方法插入一个存根(stub)。 验证。...这一步就是将托管的CIL代码编译为可以执行的机器代码的过程,由CLR的即时编译器(JIT Complier)完成。即时编译只有方法的第一次调用时发生。回想一下,类型加载程序会为每个方法插入一个存根。...调用方法时,CLR会检查方法的存根,如果存根为空,则执行JIT编译过程,并将该方法被编译后的本地机器代码地址写入到方法存根中。

1.8K21

.NET平台上运行Java程序-IKVM.NET入门

* IKVM.GNU.Classpath.dll: 被编译的GNU Classpath版本,它是由自由软件基金会实现的java类和一些IKVM.NET附加代码组成的。...[Mono|CLR-Win32].dll: 通过实现JNI接口管理C++汇编。作为一个可选部分,只程序使用自己的本地时才被用到。而对于纯java程序来讲是不会被用到的。...2..NET应用中使用java类 IKVM.NET包含ikvmc,这个java bytecode与.NET中间语言的转换器。...3.设置环境 我们开始编写代码之前需要准备一下我们的环境,添加以下路径到系统PATH环境变量中: * 包含IKVM执行文件的目录。...ikvmc如何找到GNU Classpath dll,例如: ikvmc -reference:/usr/lib/IKVM.GNU.Classpath.dll hello.jar 命令执行完后,我们将发现

2.2K50

模拟隐蔽操作 - 动态调用(避免 PInvoke 和 API 挂钩)

加载 .NET 程序集时,其导入地址表将使用您正在调用的函数的地址进行更新。这被称为“静态”引用,因为应用程序调用它之前不需要主动定位函数。相反,“动态”引用是指应用程序被设计为手动查找函数的地址。...为了易于使用,有一个(不断增长的)委托和函数包装,用于常用的 Windows NT/Win32 API 调用。我们还提供了以多种方式加载执行文件的函数,从而更容易秘密地执行代码。...模块中执行代码的线程似乎正在执行来自合法 DLL代码。可以采用字节数组或磁盘上文件的名称。 示例 - 查找导出 下面的示例演示了如何使用这些函数来查找和调用 DLL 的导出。...为了演示,notepad.exe向其中注入 .NET 程序集(例如使用 SharpSploit 的东西)之前查看加载了哪些模块: image.png 现在,将 .NET 程序集注入进程后,您可以看到各种...但是,无论是托管代码和本机代码执行时,它仍然是用于检测恶意行为的非常有价值的数据源。

2K00

代理存根DLL的创建

进程外服务器的代理存根DLL的创建 源代码下载 http://download.csdn.net/source/1792728 源自于一位网友的提问 http://topic.csdn.net...出错的原因 :跨进程或跨套间调用接口时,需要代理存根的支持.上述问题出错的原因也就是缺少代理存根DLL....代理存根DLL的创建 : 1.通过MIDL编译器自动生成 projectXX.h,dlldata.c,projectXX_i.c,projectXX_p.c文件   对于vc6.0,文件视图(FileView...做完这一步之后,项目文件夹下面我们会找到上述的四个文件. 3.新的项目工作区或现有的工作区中,创建一个态链接项目.将前面的四个文件添加到该项目之中.  ...打开project->setting,然后选择您的项目,单击c + + 选项卡并添加到预处理器定义字段的值REGISTER_PROXY_DLL以及_win32_winnt=0x400;    link

38920

CobaltStrike的狩猎与反狩猎

Stage.magic_mz_*/Stage.magic_pe_*对其进行修改 官方建议:需要注意的是,对于magicmz* 选项,提供的值必须是有效的(无)操作码,因为它们是作为shellcode存根的一部分执行的第一条指令...被反射加载到内存中时,它会导致两个内存分配:原始Beacon DLL(实际上将执行shellcode存根和反射加载器函数)和虚拟Beacon DLL(正确加载到内存中并准备就绪) 在内存中的情况如下,RWX...0x0314 配置混淆 通过配置Stage.obfuscate为true,可以实现反射加载器复制Beacon,而不带它的DLL头,这就意味着在内存中无法再找到反射加载程序存根,而且这个选项还会混淆:...头部 yara检测设置obfuscate为true的前后对比 0x0315 Sleep_Mask 官方解释如下: 启用Sleep_Mask之前,先了解一下userwx配置 set userwx "false..."; 反射加载时是否要把内存设置为可读可写可执行,默认为RWX,设置为false时内存设置为RX 然后配置启用sleep_mask set sleep_mask "true"; 正如官方所说,确实对字符串进行了加密

9610

CobaltStrike的狩猎与反狩猎

Stage.magic_mz_*/Stage.magic_pe_*对其进行修改 官方建议:需要注意的是,对于magic_mz_* 选项,提供的值必须是有效的(无)操作码,因为它们是作为shellcode存根的一部分执行的第一条指令...被反射加载到内存中时,它会导致两个内存分配:原始Beacon DLL(实际上将执行shellcode存根和反射加载器函数)和虚拟Beacon DLL(正确加载到内存中并准备就绪) 在内存中的情况如下,RWX...0x0314 配置混淆 通过配置Stage.obfuscate为true,可以实现反射加载器复制Beacon,而不带它的DLL头,这就意味着在内存中无法再找到反射加载程序存根,而且这个选项还会混淆:...头部 yara检测设置obfuscate为true的前后对比 0x0315 Sleep_Mask 官方解释如下: 启用Sleep_Mask之前,先了解一下userwx配置 set userwx "false..."; 反射加载时是否要把内存设置为可读可写可执行,默认为RWX,设置为false时内存设置为RX 然后配置启用sleep_mask set sleep_mask "true"; 正如官方所说,确实对字符串进行了加密

12311

VisualStudio中的单元测试

进行代码更改时,它会自动执行单元测试。 实时单元测试: 让你更有信心地对代码进行重构和更改。 Live Unit Testing 在编辑代码时自动执行所有受影响的测试,确保所做更改不会中断测试。...Fakes有两种风格: Stub(存根) 将类替换为可实现同一接口的小型替代项。 Shim(填充码) 在运行时修改应用的编译代码,这样就可以运行测试提供的垫片代码,而不用执行指定的方法调用。...一般原则是,为 Visual Studio 解决方案中进行的调用使用存根,并为对其他引用的程序集的调用使用填充码。...这是因为在你自己的解决方案中,通过按照存根要求的方式定义接口来分离组件是一个很好的做法。 但是,外部程序集(如 System.dll)通常没有单独的接口定义,因此必须改用填充码。...填充码运行较慢,因为它们在运行时会重新编写你的代码存根没有这项性能开销,与虚方法运行的速度一样快。 静态方法和密封类型方法。 你只能使用存根实现接口。

3.7K50

干货 | HOOK技术实战

因为系统钩子会影响系统中所有的应用程序,所以钩子函数必须放在独立的动态链接(DLL) 中。...了解IAT表之前,需要知道PE数据目录项的第二个结构 -- 导入表 由于导入函数就是被程序调用但其执行代码又不在程序中的函数,这些函数的代码位于一个或者多个DLL 中。...这里又有一个注意的地方,就是加载之前INT、IAT表里面存放的都是函数的名称并指向IMAGE_IMPORT_BY_NAME结构,如下图所示 PE文件加载到内存后,INT表的内容和指向的结构都不变,...调用api的时候,只要是通过LoadLibrary加载dll,都会在IAT表里面,我们通上面了解到IAT表里面存放的地址,那么我们可以将IAT表里面的地址修改成我们自己写的函数的地址来执行我们函数的功能...,那么我们还需要将之前覆盖的汇编代码给还原回去 //执行之前覆盖的代码 _asm { push ebp mov ebp, esp

1.8K10
领券