PE之写入MessageBox(2)

源码见GitHub: https://github.com/TL-SN/_TLSN_RES.PE

一、公式

/************************************************/
/* */
/*真正要跳转的地址 = E8这条指令的下一行地址 + X */
/* */
/*X = 真正要跳转的地址 - E8这条指令的下一行地址 */
/* */
/************************************************/

二、部分关键代码:(我是用c++的类来分装的,考虑篇幅,这里只贴了部分代码)

/************************************************/ /* */ /*真正要跳转的地址 = E8这条指令的下一行地址 + X */ /* */ /*X = 真正要跳转的地址 - E8这条指令的下一行地址 */ /* */ /************************************************/ BYTE shellcode[]= { 0x6A,00,0x6A,00,0x6A,00,0x6A,00, 0xE8,00,00,00,00, 0xE9,00,00,00,00 }; VOID _PE::InjectMessageBoxA(LPVOID* pImageBuffer) { DWORD Misc_VirtualSize; DWORD SectionAlignment; DWORD dwMessageBoxA; _PE_S File_PE_s; conBuffToAddr(File_PE_s,*pImageBuffer); for(size_t i = 0;i < File_PE_s.pPEHeader->NumberOfSections; i++, (File_PE_s.pSectionHeader)++) { Misc_VirtualSize = File_PE_s.pSectionHeader->Misc.VirtualSize; SectionAlignment = File_PE_s.pOptionHeader->SectionAlignment; if(SectionAlignment - (Misc_VirtualSize % SectionAlignment) >= 0x12) break; } if(i == File_PE_s.pPEHeader->NumberOfSections) { printf("节表空隙中无可用的空间,使用其他方式试试吧\n"); free(*pImageBuffer); return; } dwMessageBoxA = (DWORD)MessageBoxA; PBYTE codeBegin=(PBYTE)((DWORD)*pImageBuffer + File_PE_s.pSectionHeader->VirtualAddress + Misc_VirtualSize); memcpy(codeBegin,shellcode,0x12); //修改E8// DWORD RelE8Addr=(DWORD)(dwMessageBoxA)- ((DWORD)codeBegin + 0xD - (DWORD)*pImageBuffer + File_PE_s.pOptionHeader->ImageBase); *(PDWORD)(codeBegin + 0x09)=RelE8Addr; //修改E9// DWORD RelE9Addr = File_PE_s.pOptionHeader->ImageBase + File_PE_s.pOptionHeader->AddressOfEntryPoint - ((DWORD)codeBegin + 0xD - (DWORD)*pImageBuffer + File_PE_s.pOptionHeader->ImageBase); *(PDWORD)(codeBegin + 0x0E) = RelE9Addr; //修改ope// File_PE_s.pOptionHeader->AddressOfEntryPoint=(DWORD)codeBegin - (DWORD)*pImageBuffer; }

三、

结果:

 

 

 

 四、

注意,弹出MessageBox窗口后,飞鸽程序正常运行才算成功


__EOF__

本文作者_TLSN
本文链接https://www.cnblogs.com/lordtianqiyi/articles/15758745.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   TLSN  阅读(37)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示