🧐🧐🧐问题🧐🧐🧐

如何确定PE数据的大小?
“VirtualAllocEx”申请的内存大小是137000,超过了PE数据最后的大小119A60(从读取的内存块中Dump出来的,其实是错的,正确的大小为119000),调用“DM”命令保存为文件后是空文件

👍👍👍问题解决更新👍👍👍

💯💯💯正确答案💯💯💯

image.png

🥰🥰🥰答案来源🥰🥰🥰

写入地址 读取地址 读取大小
400000 12B15A0 400
401000 12B19A0 CA600
4CC000 137BFA0 3DC00
50A000 13B9BA0 6400
52B000 13BFFA0 200
52C000 13C01A0 A400
总计 119000

解决方式

  1. 在“ZwWriteVirtualMemory( IN HANDLE hProcess, IN PVOID BaseAddress, IN PVOID Buffer, IN ULONG BytesToWrite, OUT PULONG BytesWritten )”断点断下时取其参数Buffer([esp+C])为数据来源地址,BytesToWrite([esp+10])为数据大小
  2. Loop内判断是否在“WriteProcessMemory”断下
    1. 不是,则累加数据大小
    2. 累加结束
  3. 使用累加的合作为最后的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

  1. MSG用来弹提示和数字的,调试版确认无误后,可以把“MSG”行注释掉,直接运行,只有结果。
  2. <a name="abZVU"></a>
  3. ## 脚本运行提示
  4. 用来确认脚本可以运行,不需要就注销:<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)
  5. <a name="Q7Al5"></a>
  6. ## 数据来源地址
  7. 断在“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)
  8. <a name="PxNnX"></a>
  9. ## 数据大小
  10. 断在“ZwWriteVirtualMemory”时,[ESP+10]是读取的数据大小,将其累加求和。
  11. <a name="Ox8f3"></a>
  12. ## Dump
  13. 从源地址,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)
  14. <a name="bTZ7R"></a>
  15. # 运行版
  16. 只有“已Dump文件,请确认”的弹框,不想要也可以注销:
  17. ```typescript
  18. // 清除断点(咋没用)🤔🤔🤔
  19. BPMC
  20. BPHWCALL
  21. MSG "建瓯最坏:脚本开始\r\n请确保没有任何断点\r\nAlt+B,禁用/删除全部断点"
  22. GPA "VirtualAllocEx","kernel32.dll"
  23. BP $RESULT
  24. MOV addVirtualAllocEx,$RESULT
  25. RUN
  26. BC addVirtualAllocEx
  27. GPA "ZwWriteVirtualMemory","ntdll.dll"
  28. BP $RESULT
  29. MOV addZwWriteVirtualMemory,$RESULT
  30. GPA "WriteProcessMemory","kernel32.dll"
  31. BP $RESULT
  32. MOV addWriteProcessMemory,$RESULT
  33. RUN
  34. // 数据来源
  35. MOV bufFrom,[esp+C]
  36. // MSG bufFrom
  37. // 数据大小
  38. MOV size2Sum,[esp+10]
  39. RUN
  40. // 是否累加数据大小
  41. Loop_Check:
  42. IFNEQ edx,addWriteProcessMemory
  43. JMP Loop_AddData
  44. ELSE
  45. JMP Loop_END
  46. // 累加数据大小
  47. Loop_AddData:
  48. ADD size2Sum,[esp+10]
  49. RUN
  50. JMP Loop_Check
  51. // 累加完成
  52. Loop_END:
  53. // MSG "已累加完数据大小"
  54. // MSG size2Sum
  55. BC addZwWriteVirtualMemory
  56. BC addWriteProcessMemory
  57. //Dump数据到文件
  58. DM bufFrom,size2Sum,"C:\Users\Administrator\Desktop\Add.dump"
  59. MSG "已Dump文件,请确认\r\n建瓯最坏:脚本结束"
  60. RET