LPTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle("Kernel32"), "LoadLibraryA"); //在目标进程的地址空间内分配一个内存块...VirtualAllocEx(hDestProcess, NULL, strlen(szDllName) + , MEM_COMMIT, PAGE_READWRITE); //向上一步的内存块中写入数据...,估计是DLL是32的,我换个DLL编译方式再试试 //我编译了64位的DLL,然后还是崩溃的,之后我发现了应该是我函数地址传的有问题 //因为32位的...//另外一个需要注意的问题就是,为什么我在我这个进程中得到的LoadLibrary在远程进程中也可以用 //答案就是,系统DLL在各个进程中的映射地址都是一样的,不过具体情况具体分析...,加载dll只能一次,第二次就不会弹了 //原因,我目测是,DLL已经被加载了,所以第二次就不加载了,也就不执行DllMain那个函数了 //除非我创建一个线程再
直接系统调用和规避“系统调用标记” 拆除挂钩ntdll.dll 欺骗线程调用堆栈 信标的内存加密 自定义反射加载器 可扩展配置文件中的 OpSec 配置 1、Shellcode加密 让我们从一个基本但重要的话题开始...一个更优雅的解决方案是设计和实现一种算法,将 shellcode 混淆(编码/加密)成英文单词(低熵)。那将用一块石头杀死两只鸟。 3....简而言之,他的方法调整了典型 shellcode 加载器的以下行为: 与其分配一大块内存并直接将 ~250KB 植入 shellcode 写入该内存,不如分配小的连续块,例如 <64KB 内存并将它们标记为...当我们在加载器进程空间的线程中运行 shellcode 时,更容易混入进程中良性线程执行和内存操作的噪音。然而,不利的一面是任何崩溃的开发后模块也会导致加载程序的进程崩溃,从而导致植入程序崩溃。...10.信标内存加密 内存检测的另一个规避方法是在休眠时加密植入程序的可执行内存区域。
那么当调用分类的方法时,步骤是否和调用对象方法一样呢? 分类中的对象方法依然是存储在类对象中的,同对象方法在同一个地方,那么调用步骤也同调用对象方法一样。.../* __dst : 移动内存的目的地 * __src : 被移动的内存首地址 * __len : 被移动的内存长度 * 将__src的内存移动__len块内存到__dst中 */ void...未经过内存移动和拷贝时 经过memmove方法之后,内存变化为 // array()->lists 原来方法、属性、协议列表数组 // addedCount 分类数组长度 // oldCount * sizeof...那么为什么要将分类方法的列表追加到本来的对象方法前面呢,这样做的目的是为了保证分类方法优先调用,我们知道当分类重写本类的方法时,会覆盖本类的方法。...load 和 initialize load方法会在程序启动就会调用,当装载类信息的时候就会调用。 调用顺序看一下源代码。 ?
Word在处理displacedByCustomXml属性时未对customXml标签对象进行有效性验证,可以通过传入其他标签对象,由类型混淆进而达到任意内存写。...图片12 第二次计算Dst Address 可以看到[[Parameter 1]+0xC]为之前写入值。第二次写入覆盖MSVCR71.DLL虚函数表中函数调用地址: ?...图片19 劫持执行流 由上图可知第二次内存写入——覆盖MSVCR71.DLL虚函数表中函数调用地址,第四次内存写入——覆盖传递参数。...图片49 Normal.vbs 0x03.2 Normal.domx分析 该文件本质为VBE格式,可由wscript.exe正常加载。分析时需通过工具解密出VBS脚本。...图片55 数字签名 其用于加载恶意DLL——jli.dll。 0x03.4 jli.dll分析 MD5:051573B9173DE6886E0575F81778EA03 查看其导出函数: ?
而 lua51.dll 会被加载到 compiler.exe 中,lua51.dll 是 compiler.exe 运行需要的 DLL,攻击者将该 DLL 文件与程序文件放在一起。...从而执行 ErrorHandler.cmd 调用 compiler.exe 加载恶意 Lua 代码。...恶意代码 使用 lua51 的导出函数 luaL_loadfile 加载 LuaJIT 字节码,会使用 fread 函数读取 JIT 字节码,然后使用 memmove 函数移动到分配的内存。...调试信息 调试信息 文件中的字节码使用 memmove 函数将字节码从一个偏移量更改为另一个偏移量。使用 memmove 函数复制 JIT 字节码中 200 字节定长数据。...创建名为 Winter750 的互斥量: 调试信息 也会使用 ntdll.dll 中的 LdrLoaddll 函数在运行时加载 dll,使用 LuaJIT ffi 调用该函数。
为什么日志可以解决文件系统操作中出现的崩溃呢?如果崩溃发生在提交之前,那么磁盘上的日志文件就不会被标记为已完成,恢复系统的代码就会忽视它,磁盘的状态就好像写操作从未进行一样。...lh; //日志头 }; struct log log; 这个结构体只存在于内存,用来记录当前的日志信息。...调用 $bread$ 将数据从磁盘读取到缓存块中,然后将缓存块中超级块的数据复制一份到内存中定义的超级块数据结构中去,最后再释放缓存块的锁,因为 $bread$ 调用 $bget$ 获取了锁,使用完该缓存块就该释放...所以 write_log 就主要是将日志块和数据块读到内存中的缓存块,其实可能并没有真正的从磁盘读取,这要视当前缓存块是否缓存了磁盘块。...所以先读取两部分的数据到内存中的缓存块(不一定真的从磁盘中读出来,要视磁盘数据在内存中是否有缓存),在内存中把数据复制过去,再同步到磁盘块中去,最后释放掉缓存块。
具体的实现流程后期可以优化的更完美,因为时间原因只测试了基本功能的实现。只是提供一种思路,大家可以发散思维,把流程更加简化或自动化。...下面直接就从木马上线传入文件后的操作开始演示:我们需要传入的文件是一个exe一个dll,都需要传入C盘根目录且dll的名字必须命名为Dll1.dll(因为懒惰我都写死到源码中了,大家可根据源码自行修改)...(bBuffer + 0 * 4, &dwZero, 4); memmove(bBuffer + 1 * 4, &dwCount, 4); memmove(bBuffer + 2 * 4...fputs(msg, file)) //调用fputs函数写入文件,不管成功或失败都会返回一条信息。 ...虽然这个方法的实战作用并不大但是大家可以参考思路改进或优化方法,比如我们可以使用dll劫持直接劫持QQ程序需要加载的DLL,用户一执行QQ就会自动加载窃取clientkey的dll,这样就免去了使用我编写的
.dll[/url] CreateThread [url=file://KnownDLLs/]\\KnownDLLs[/url]是系统加载时对象管理器加载最新磁盘DLL到内存的,当其他进程想调用某个...DLL时,就不用重复从磁盘加载了,而会从这里映射一份到自己的进程空间中去。...修改CreateThread函数的开头5字节跳转到这个间隙,当系统任何一个线程创建时,会走到CreateThread函数,然后执行空隙中的ShellCode,其负责调用LoadLibrary加载我们的DLL...,过滤出是加载Kernel32.dll的情况,从参数中取得其基址,Inline Hook其EAT中的CreateThread函数,跳转到在这个进程虚拟地址空间中申请的Buffer,在其中完成DLL的加载过程...(5) 内核感染常用模块,让感染模块帮我们Load DLL 这个方法就有点绕远了,开始了最本质最原始的感染,可增加新节,可插空隙,总之,让别人的模块Load进内存时顺路的帮我们加载下DLL,DLL
日志记录层允许更高层在一次事务(transaction)中将更新包装到多个块,并确保在遇到崩溃时自动更新这些块(即,所有块都已更新或无更新)。...完成这些写入后,系统调用将擦除磁盘上的日志。 如果系统崩溃并重新启动,则在运行任何进程之前,文件系统代码将按如下方式从崩溃中恢复。...为什么xv6的日志解决了文件系统操作期间的崩溃问题?如果崩溃发生在操作提交之前,那么磁盘上的登录将不会被标记为已完成,恢复代码将忽略它,并且磁盘的状态将如同操作尚未启动一样。...Xv6的write系统调用将大的写入分解为适合日志的多个较小的写入,unlink不会导致此问题,因为实际上Xv6文件系统只使用一个位图块。...注:日志需要写入磁盘,以便重启后读取,但日志头块和日志数据块也会在block cache中有一个副本 ---- end_op(kernel/log.c:146)首先减少未完成系统调用的计数。
只有当有C指针引用某个inode时,内核才会在内存中存储该inode。...当它找到一个时,它通过将新type写入磁盘来声明它,然后末尾通过调用iget(kernel/fs.c:210)从inode缓存返回一个条目。...iput()不会在文件的链接计数降至零时立即截断文件,因为某些进程可能仍在内存中保留对inode的引用: 进程可能仍在读取和写入该文件,因为它已成功打开该文件。...因此,可以从inode中列出的块加载文件的前12 kB(NDIRECT x BSIZE)字节,而只有在查阅间接块后才能加载下一个256 kB(NINDIRECT x BSIZE)字节。...当文件用完时,filealloc为什么不panic?为什么这更常见,因此值得处理? 假设在sys_link调用iunlock(ip)和dirlink之间,与ip对应的文件被另一个进程解除链接。
下载解压缩得到一个dump文件和一个pcap文件,windbg加载一下这个dump文件并执行!analyze -v指令可以得到最后的崩溃信息。 ?...Windbg加载完成了之后发现程序崩溃在man.sys这个加载的内核驱动当中,并且崩溃的位置在man + 0x1ce7的位置。...这个函数当中调用recv接收数据,VirtualAlloc新建了0x3000字节大小的堆块。...我们可以通过vaddump命令dump出pid为876程序加载的所有使用的内存页,会dump出一系列的内容,内容比较的多。 ....6666端口和8888端口数据亦或的key的内容更加容易得到,不知道为什么传输的时候既传送了一个亦或加密之后的数据包,又传输了一个没有亦或加密的数据包。
在知乎看见一个比较好的问题,整理下分享给大家。 memmove相比memcpy增加了内存重叠的判断,更加安全,效率只是差了那么一丢丢, 为什么经常看见memcpy, 很少看见memmove 呢 ?...(加粗是我加的) 当然他这是从库函数的角度来说,他觉得从一开始就干脆搞成memcpy就是memmove,然后就没这么多毛病了。 另外有人质疑说到底性能差多少。...题主全用 memmove 代替 memcpy 的想法,不仅不可笑,而且如果放到现在来设计标准库,只提供一个函数才是正确的设计。...此时让程序崩溃掉反而是好事,因为崩溃能够更明显的提醒你这里有个bug memmove 误用 memcpy 不一定会崩掉,可能只会让复制结果不正确。...关于效率,也就是 memmove 开头加一个分支,不重叠时走 memcpy 一样的代码。调用一次函数比那个分支贵多了,真在极端情况下要省一两个 cycle,也应该先考虑内联。
就会调用访问操作; 4.访问操作导致vftable进程崩溃; 5.已崩溃的vftable进程将代码执行转移至返回导向编程(ROP)链; 6.ROP链将代码执行转移到shellcode; 7.通过反射DLL...加载来进行EoP模块加载; 8.PE模块启动已加载完成的Win32k EoP漏洞利用程序; 9.一旦EoP漏洞利用成功,就会在Startup文件夹中释放一个名为.vbs的文件,作为下载其他payloads...JavaScript中的shellcode 反射DLL加载进程 Shellcode(以下提到的伪代码)通过反射DLL加载PE模块,这是高级攻击活动里试图在内存中躲避检测时的常用技巧。...把控制权传递给已加载的DLL模块中的入口点 Win32k **提权漏洞利用** Win32k提权(EoP)漏洞利用是从已加载的PE模块中运行,利用新的Windows漏洞CVE-2018-8120对Windows...FWORD指令来调入虚假的GDT入口指令; 6.成功调用虚假GDT入口指令; 7.这些指令运行从内核模式内存空间的用户模式中分配的shellcode; 8.修改shellcode进程中EPROCESS.Token
.dll 和 kernel32.dll 里,我们只需要能加载这几个DLL 就可以调用强大的 WinAPI 了 image.png 大家可以使用 PE Explorer 查看一个DLL有哪些输出函数 var...大家可以看到,在这里我们使用的是SendMessageW,而不是SendMessageA,因为go语言底层调用DLL接口时,传入的是utf16,看看下面的代码就明白了 func SetWindowText...我们需要使用API VirtualAllocEx 向银企直联进程申请一块内存空间,用于我们的外挂进程和银企直联进行数据沟通,当我们发送 LVM_GETITEMTEXT 消息之前,我们需要把参数信息写到这个内存块里...,然后再使用SendMessage,ListView的数据会写到这个内存块,最后我们通过 ReadProcessMemory 来读取获取到列表的数据 这里就是为什么32位不能读64位程序的内容的原因了,...image.png 箭头代表数据流向,所有的API调用都是在外挂这边完成的 整个流程大概就是这样的,我们需要借助远程进程的内存块来做数据交互,但最后切记一定要使用VirtualFreeEx 释放掉不用的内存块
将DLL加载到进程A的内存里,修改 RWX-S 权限的section的代码进行patch 3....发生时,调用执行相关的操作加载远程的恶意代码: 然后将这段代码patch到DllMain的位置: ShellCodeEnd 是我定义的一个空的函数,他紧跟在myDllMain后面,主要是为了帮助我们定位出函数...patch hook procedure 函数防止程序崩溃 只经过上述patch的DLL是可以满足执行恶意代码的功能,但是会引起被注入程序的异常或者崩溃,因为我们是调用 SetWindowsHookEx...设置的消息钩子,我们传入的 hook procedure 也并非一个钩子处理函数,它并不会调用 CallNextHookEx ,就导致被注入的进程无法响应相关的消息,甚至运行异常代码而崩溃,这样会导致获取的...当钩子被卸载之后,KbdEditDllPremium.dll 也会从内存中卸载,此时主程序其实可以直接删掉 KbdEditDllPremium.dll进行彻底的毁尸灭迹。
将 ntdll.dll 的新副本从磁盘映射到进程内存 查找被 hook 的 ntdll.dll的 .text 部分的虚拟地址 获取ntdll.dll基址 模块基址 + 模块的 .text 段 VirtualAddress...PE 文件映射绕过 hook 如果被打开文件是PE格式,那么这个文件会按照内存展开,那么我们猜想是不是这个被第二次载入内存的ntdll是不是就是一个干净的ntdll,能不能帮助我们绕过一些inline...所以我们里的思路是: 新挂起进程的内存是干净的,没有被 hook 的 所有的系统 dll 在被加载时的内存空间都是一样的启动一个进程,挂起它,读取他的干净的ntdll,然后自己使用。...这将为我们提供指向PEB(过程环境块)的指针 从PEB结构中,我们可以找到Loader数据或Ldr的地址 然后,我们使用Ldr遍历加载的模块,以获得所需的ntdll基础 通过Loader数据提取加载的模块...wininet模块准备联网 总结 杀软会在程序运行后加载一些基础dll的时候,让程序加载他自己的dll。
系统引导启动时会通过int 15中断查询内存信息,此时挂钩15号中断的木马便得以第二次获得CPU控制权,获得控制权后木马挂钩BILoadImageEx函数,调用原始15号中断并将控制权交回给系统继续引导...当引导完毕进入windows内核时,挂钩ntoskrnl入口点的木马代码第四次获得CPU控制权,此时木马已真正进入windows内核中,获得控制权后,分配一块内存空间,将木马内核的主功能代码拷贝到分配的空间中...插入到svchost代码只实现一个简单的功能:判断操作系统类型,从云端下载相应的Addata.dat模块到本地,解密执行,云端模块的URL硬编码在Shellcode中。 ? 图3....云端模块1解密后的数据结构 该模块的前4字节为标志“CODE”,仅作为数据合法性校验,校验成功后直接执行其后的Shellcode,而Shellcode的功能则是负责将Addata.dll在内存中加载,最终从其入口点处开始执行之...应用层Shellcode被插入指定进程后开始执行,其功能是在内存中动态加载jmdm.dll文件并跳到其入口点执行。
strerror 函数功能 C语言有一系列的库函数,当这些库函数调用失败时,会返回相应的错误码,而strerror函数的作用就是获取错误码对应的错误信息的首地址,让使用者知道程序发生错误的原因。...memcpy 函数功能 内存拷贝,将一块内存中num个字节的内容拷贝到另一块内存中,常用来处理不重叠内存数据的拷贝。...memmove 函数功能 内存移动,将一块内存数据中的内容移动覆盖至另一块内存数据,常用来处理重叠内存数据的拷贝。...,比较两块内存中前num个字节的大小。...,把一块内存中num个字节的内容设置为指定的数据。
main.au3 脚本执行后会从配置文件 config.ini 中加载加密的代码段,以及解密所需的密钥和其他配置参数。...DllStructGetSize:用于获取 DLL 某指定字节数的数据内容。 DllCall:调用一个 DLL。 DllOpen:加载一个 DLL 文件到内存,以等待调用。...观察到 CreationFlags = CREATE_SUSPENDED,其作用是程序启动后便立即停止运行,只分配了内存空间。...随后观察到注入的 DLL 数据被分成五次写入到新建的 RegSvcs.exe 进程内存: 第一次: ? 第二次: ? 第三次: ? 第四次: ? 第五次: ?...提取五次注入的内存块,即得到注入到 RegSvcs.exe 进程的 DLL 完整数据,我们将其命名为 inject.dll。
当我们用指针来引用内存的时候,指针的值表示的是进程自己的地址空间的一个虚拟的内存地址。进程不能通过指针来引用其他进程地址空间的内存。...我们知道DLL被首次载入到进程中时,会收到DLL_PROCESS_ATTACH的通知,即调用DllMain函数,并且参数fdwReason的值被设为DLL_PROCESS_ATTACH。...下面是一个最简单的dll的源码,在被注入成功后(即收到DLL_PROCESS_ATTACH通知时)弹出消息提示框: BOOL APIENTRY DllMain(HMODULE hModule, DWORD...(dll都是通过LoadLibrary(Ex)函数来加载的),所以我们一般会在DLL_PROCESS_ATTACH通知处理过程中创建一个子线程,将业务逻辑放置到该子线程中执行,代码如下: #include...; } 另外,当DLL被从目标进程卸载时,DLL会收到DLL_PROCESS_DETACH通知,我们需要在该通知的处理过程中做好最后的善后工作,防止资源泄漏、程序崩溃等问题出现。
领取专属 10元无门槛券
手把手带您无忧上云