🧐🧐🧐问题🧐🧐🧐
如何确定PE数据的大小?
“VirtualAllocEx”申请的内存大小是137000,超过了PE数据最后的大小119A60(从读取的内存块中Dump出来的,其实是错的,正确的大小为119000),调用“DM”命令保存为文件后是空文件
👍👍👍问题解决更新👍👍👍
💯💯💯正确答案💯💯💯
🥰🥰🥰答案来源🥰🥰🥰
写入地址 | 读取地址 | 读取大小 |
---|---|---|
400000 | 12B15A0 | 400 |
401000 | 12B19A0 | CA600 |
4CC000 | 137BFA0 | 3DC00 |
50A000 | 13B9BA0 | 6400 |
52B000 | 13BFFA0 | 200 |
52C000 | 13C01A0 | A400 |
总计 | 119000 |
解决方式
- 在“ZwWriteVirtualMemory( IN HANDLE hProcess, IN PVOID BaseAddress, IN PVOID Buffer, IN ULONG BytesToWrite, OUT PULONG BytesWritten )”断点断下时取其参数Buffer([esp+C])为数据来源地址,BytesToWrite([esp+10])为数据大小
- Loop内判断是否在“WriteProcessMemory”断下
- 不是,则累加数据大小
- 累加结束
- 使用累加的合作为最后的PE大小,使用“DM”从数据来源地址Dump累加和
调试版
```typescript // 清除断点(咋没用)🤔🤔🤔 BPMC BPHWCALL
MSG “建瓯最坏:脚本开始\r\n请确保没有任何断点\r\nAlt+B,禁用/删除全部断点”
GPA “VirtualAllocEx”,”kernel32.dll” BP $RESULT MOV addVirtualAllocEx,$RESULT RUN BC addVirtualAllocEx
GPA “ZwWriteVirtualMemory”,”ntdll.dll” BP $RESULT MOV addZwWriteVirtualMemory,$RESULT
GPA “WriteProcessMemory”,”kernel32.dll” BP $RESULT MOV addWriteProcessMemory,$RESULT
RUN
// 数据来源 MOV bufFrom,[esp+C] MSG bufFrom
// 数据大小 MOV size2Sum,[esp+10] RUN
// 是否累加数据大小 Loop_Check: IFNEQ edx,addWriteProcessMemory JMP Loop_AddData ELSE JMP Loop_END
// 累加数据大小 Loop_AddData: ADD size2Sum,[esp+10] RUN JMP Loop_Check
// 累加完成 Loop_END: MSG “已累加完数据大小” MSG size2Sum
BC addZwWriteVirtualMemory BC addWriteProcessMemory
//Dump数据到文件 DM bufFrom,size2Sum,”C:\Users\Administrator\Desktop\Add.dump” MSG “已Dump文件,请确认\r\n建瓯最坏:脚本结束”
RET
MSG用来弹提示和数字的,调试版确认无误后,可以把“MSG”行注释掉,直接运行,只有结果。
<a name="abZVU"></a>
## 脚本运行提示
用来确认脚本可以运行,不需要就注销:<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/1632223/1638269225074-4a133f66-8953-4cf1-95b4-bb3c42fe0cad.png#clientId=u7848798d-97d4-4&from=paste&height=455&id=u24dc3396&originHeight=455&originWidth=979&originalType=binary&ratio=1&rotation=0&showTitle=false&size=144313&status=done&style=none&taskId=uc4cafe3c-6d4b-4520-91e6-6cbe6a14050&title=&width=979)
<a name="Q7Al5"></a>
## 数据来源地址
断在“ZwWriteVirtualMemory”时,[ESP+C]是源地址:<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/1632223/1638269330799-875b32d4-7b69-4abd-aa83-2e66ca332573.png#clientId=u7848798d-97d4-4&from=paste&height=224&id=ud501cdc3&originHeight=224&originWidth=1485&originalType=binary&ratio=1&rotation=0&showTitle=false&size=84363&status=done&style=none&taskId=u25a45f3d-dbad-4e9a-97e3-bc30a697abf&title=&width=1485)
<a name="PxNnX"></a>
## 数据大小
断在“ZwWriteVirtualMemory”时,[ESP+10]是读取的数据大小,将其累加求和。
<a name="Ox8f3"></a>
## Dump
从源地址,Dump出累加的PE大小数据:<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/1632223/1638269476138-7137fd95-363d-40d3-8619-aadda50a7816.png#clientId=u7848798d-97d4-4&from=paste&height=123&id=u1cbfe2a6&originHeight=123&originWidth=1761&originalType=binary&ratio=1&rotation=0&showTitle=false&size=60106&status=done&style=none&taskId=u8b5f038c-dbd6-4066-9133-a9b805bbc53&title=&width=1761)
<a name="bTZ7R"></a>
# 运行版
只有“已Dump文件,请确认”的弹框,不想要也可以注销:
```typescript
// 清除断点(咋没用)🤔🤔🤔
BPMC
BPHWCALL
MSG "建瓯最坏:脚本开始\r\n请确保没有任何断点\r\nAlt+B,禁用/删除全部断点"
GPA "VirtualAllocEx","kernel32.dll"
BP $RESULT
MOV addVirtualAllocEx,$RESULT
RUN
BC addVirtualAllocEx
GPA "ZwWriteVirtualMemory","ntdll.dll"
BP $RESULT
MOV addZwWriteVirtualMemory,$RESULT
GPA "WriteProcessMemory","kernel32.dll"
BP $RESULT
MOV addWriteProcessMemory,$RESULT
RUN
// 数据来源
MOV bufFrom,[esp+C]
// MSG bufFrom
// 数据大小
MOV size2Sum,[esp+10]
RUN
// 是否累加数据大小
Loop_Check:
IFNEQ edx,addWriteProcessMemory
JMP Loop_AddData
ELSE
JMP Loop_END
// 累加数据大小
Loop_AddData:
ADD size2Sum,[esp+10]
RUN
JMP Loop_Check
// 累加完成
Loop_END:
// MSG "已累加完数据大小"
// MSG size2Sum
BC addZwWriteVirtualMemory
BC addWriteProcessMemory
//Dump数据到文件
DM bufFrom,size2Sum,"C:\Users\Administrator\Desktop\Add.dump"
MSG "已Dump文件,请确认\r\n建瓯最坏:脚本结束"
RET