> For the complete documentation index, see [llms.txt](https://wbglil.gitbook.io/cobalt-strike/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://wbglil.gitbook.io/cobalt-strike/cobalt-strike-yuan-li-jie-shao/untitled-1.md).

# Stager Payload原理分析

先说一下stager也就是那个远程加载Beacon.dll的shellcode，具体你可以转到resources\httpstager.bin里查看，然后比对msf的stager\_reverse\_http.asm你会发现基本这两个shellcode基本没啥区别，这主要是因为cs借鉴和使用msf项目相关的代码

我这里以http(s) stager为例其他几种的stager基本上大同小异

### msf http(s) stager

先来整体看一下msf的stager

![](/files/-MHpSUFpZis5j_t_O9ma)

可以看出msf http stager基本上就两大块

一个经典的call pop将api\_call函数地址存到ebp中(block\_api.asm这一整个文件是api\_call函数)

api\_call怎么实现的具体可以去看block\_api.asm里的代码，我这里就简单说一下它的作用，api\_call接收一个API的哈希值，然后在链表中搜索解析，并获取函数的地址，最后调用函数（所以除了要传入API的哈希值还要压入API的参数值）

![代码就不全截图了](/files/-MHpV0DaCbvuxOU5qIIG)

block\_reverse\_http.asm文件

![load\_wininet前面的宏定义是用来分别https和http](/files/-MHpVEMdlgqMkoxWIQUG)

msf的就说到这里吧，这个基本上就是调用api\_call通过它调用Win API使用http接收反射dll然后loader没太多可说的

### CS http(s) stager

首先先用cs生成一个stager格式选择raw，然后反汇编

![](/files/-MHpUoJh4oftMgU2kGpw)

![](/files/-MHpUiQ6Fp9C4um1nE8S)

从这里应该可以看出cs的stager和msf的非常相似基本一样

在加载完wininet.dll后就可以正式搜索并调用wininet.dll里的函数

![](/files/-MHp_yL1R-d8WWa33Kya)

基本上都是这个套路没啥好说的

`push API参数1`\
`push API参数2`\
`push ....`\
`push API哈希值` \
`call ebp(api_call) ;搜索并调用函数`

整体上cs stager和msf stager都是一样的，都是通过WinInet系列函数远程加载stage并使用VirtualAlloc为其分配一块可写可读可执行的内存，最后转去执行stage

但是如果你真的有细心去看msf和cs的stager你应该会发现一个奇怪的地方，cs比msf多调用了几个函数

```
InternetErrorDlg 0xBE057B7
GetDesktopWindow 0x315E2145
GetLastError 0x5DE2C5AA
```

### 杂谈

1.我这里插一句题外话，msf或cs的stager如果想要对它做混淆（我这里指的混淆，不是利用xor not或AES等方式对shellcode加密，而是指利用花指令，流程混淆，代码膨胀，指令替换等等方式的代码混淆）就必须得要考虑混杂在指令之中的数据，因为在msf或cs里都是使用call pop，这种方式来使用数据传参，这会导致反汇编引擎在解析的时候极有可能直接把数据解析成代码，导致误操作数据（向原本的数据中插入指令导致数据被修改）

如图本来这里原来的意图是call一个地址然后把ip的地址压入到栈中，随后pop到寄存器当作参数使用但是，如果这里被解析成代码，在混淆时被插入了垃圾指令，就会导致原本的ip被修改从而在运行时会出错，所以在做shellcod指令混淆时要注意这点

![](/files/-MHpp8B2X22r7hzCZOen)

2.关于这个hash算法你可以自行谷歌GetProcAddressWithHash，这个是c代码，基本上许多shellcode的开发都使用此算法
