游客发表
安全圈里混久了,载器谁手里没几个shellcode加载器?下载这东西本身不复杂,就是载器一段把机器码塞进内存跑起来的代码。但网上公开的下载加载器,十有八九被杀软盯得死死的载器。你下载一个改改,下载过不了两天就失效了。载器与其到处求人,下载不如自己动手写一个——这事儿的载器门槛比你想象的低。
先看最基础的下载思路。Windows下加载shellcode,载器无非就是下载VirtualAlloc申请一块可执行内存,memcpy把字节拷进去,载器然后函数指针一调。下载三步走,载器十行代码搞定。我见过有人用C写,有人用Python的ctypes,甚至还有人用PowerShell。但问题来了——这种写法太直白,特征码早就被拉黑了。你哪怕改几个变量名,换换API调用顺序,也就多活几个小时。
真正的分水岭在编码和混淆。我常用的一个法子是异或加密。拿一个随机字节当key,把shellcode逐字节异或一遍。加载的时候先解密再执行。就这么个简单操作,能干掉一半的静态检测。别小看这一步,很多杀软就靠特征字符串吃饭,你一加密,它们就瞎了。当然,key别硬编码在代码里,从环境变量或者注册表读,哪怕从系统时间算出来都行。
再往深了走,进程注入是躲不开的话题。直接在当前进程跑,行为太显眼。我习惯先开个挂起状态的进程,比如rundll32.exe或者svchost.exe,把shellcode写进它的内存,再改它的线程上下文让它跑起来。这一步能骗过那些只监控当前进程的行为引擎。具体操作上,CreateProcess开进程时要带CREATE_SUSPENDED标志,然后WriteProcessMemory写数据,最后SetThreadContext改入口点。听着麻烦,但代码量也就多三十行。
还有个坑得提醒你——内存权限。VirtualAlloc默认是RW,你写完数据再改成RX。别一步到位给PAGE_EXECUTE_READWRITE,那种内存块是行为检测的重点关照对象。分两步走,先RW写入,再VirtualProtect改成RX,能躲过不少沙箱的检查。我测试过,这招对某些EDR特别有效,它们就盯着内存属性变化。
写完了别急着收工。拿VT扫一遍是基本功,但别全信。VT上检出率低于10%才算能用的货。我自己的标准是,主流的那几家——360、火绒、Windows Defender——不报才算过。你要是想更稳,就加个延迟执行,程序启动后sleep个十几秒再加载。很多沙箱等不了那么久就超时了,这招土但管用。
最后说句掏心窝子的话。加载器这东西,网上抄的代码永远不如自己写的顺手。你花一个下午从头写一个,比下载十个改来改去都强。毕竟杀软更新快,你的加载器也得跟着迭代。写多了就熟,熟了就快,快了你就能把精力放在更值得研究的事情上——比如shellcode本身怎么免杀,或者怎么让加载器更隐蔽。
别嫌麻烦,动手写吧。第一次跑通的时候,那种感觉比下载别人的代码爽多了。
友情链接