upx脱壳
参考链接:手动去upx特性_upx -d-CSDN博客参考链接:linux 下 upx 脱壳笔记
参考链接:三叶草二进制招新培训
参考链接:怎样用x64dbg UPX手动脱壳(64位)
upx壳简介
upx壳是一种压缩壳,在CTF比赛中比力常见。
针对upx壳有专业的脱壳工具。
当然我们也可以直接手脱,手动脱壳我们就需要找到加壳步伐的OEP然后dump文件内存。
OEP原始步伐入口点。EP(Entry Point),意即步伐的入口点。而OEP是步伐的原始入口点,一个正常的步伐只有EP,只有入口点被修改的步伐(加壳等),才会拥有OEP。
工具脱壳
UPX(Ultimate Packer for eXecutables)是一个开源的可执行文件压缩器,用于减小可执行文件的巨细,同时保持其功能。UPX 支持多种操纵系统,包罗 Linux、Windows 和 macOS。
upx工具使用请参考这篇文章。
upx工具使用:【逆向】UPX工具使用及加壳_upx.exe-CSDN博客
常规upx工具脱壳
直接使用 upx -d 进行脱壳
#exe文件
upx -d demo.exe
#elf文件
upx -d demo
例题
UPX
分析
exeinfo查察发现upx加壳。
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvNzg1NWIzZDBmZjVkNDJkZDk5ODJkNzM1ZDYxMzVkMjUucG5nI3BpY19jZW50ZXI=
脱壳
直接使用upx -d进行脱壳。
可以看到脱壳成功。
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvNDAwMTI1NjJiNTA0NDcxYjk0N2ZhMmM1YWFhYTM0ODMucG5nI3BpY19jZW50ZXI=
exeinfo查察确认一下
确认脱壳成功
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvZjg3MjBhYmQzYWU0NDdjYmI5OTRhNWM1MjZjZWMxY2IucG5nI3BpY19jZW50ZXI=
ida打开查察反编译代码,发现flag
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvNTAxZWU3NDAxNWQ4NDdlNmI2ZmU4OTc0ZTg5ODZjY2EucG5nI3BpY19jZW50ZXI=
upx魔改壳
常规upx壳只要利用upx工具直接执行upx -d下令即可脱壳。
不外只要做一些简单的修改就可以让upx工具失效。
这种魔改壳在CTF中很常见。
1.修改区段名
我们先来查察一下未修改前的文件信息。
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvZWY2ZTlmYTU0OWQ0NDg3NjgxZTg5N2FkNWE2YzM4ZDAucG5nI3BpY19jZW50ZXI=
可以看到图中显示了upx1和3.91 upx这两个特性标识。
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvOTZkMjFmYTc1YjdiNDQ5NDhlYzE0Nzk2NjI1MjFhNjAucG5nI3BpY19jZW50ZXI=
然后查察一下加壳后的区段窗口,发现只有三个区段。最明显的特性upx0和upx1.
我们只需要修改它,就可以让upx工具无法脱壳。
我们利用二进制编辑工具将upx改成rpx
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvMjBhZjYxZjA2MWEwNDgzNmIzMTI1ZWFiNjBlYWNkZjIucG5nI3BpY19jZW50ZXI=
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvNWZkZjc1ODdmNjI5NDExOGJmZGJlMDlkYjMyZWMwNTYucG5nI3BpY19jZW50ZXI=
尝试脱壳
效果:
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvZTRmMDM1MjI4ZWZkNDE0NWFiMjA0NThhZmNjNzUzMjUucG5nI3BpY19jZW50ZXI=
可以看到失败了。
只要改回原样就可以进行脱壳。
2.修改标识
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvYTk5Y2QwZjNmOWMyNGM5ZmE3Yzc0NzhlMDkwMmY4MjUucG5nI3BpY19jZW50ZXI=
可以看到3.96.UPX!特性码。我们可以修改3.96版本号开始24个字节的内容。都不会对步伐运行产生影响。
修改标识之后,upx工具就无法脱壳。不外可以利用UPX Unpacker for Dummies工具进行脱壳也可以直接手脱。
反面我们会讲怎样手动脱壳。
例题
hello_upx
分析
exe文件,查壳发现存在upx壳。
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvM2NiMzJmYWU5OTI2NGEyN2E3N2VmMDNiNzExYjJiMDAucG5nI3BpY19jZW50ZXI=
直接使用脱壳机,脱壳失败。
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvNWRkMDkxMmE4ZTExNGRkY2I0YWY0YjVjMTAzYzAzNjUucG5nI3BpY19jZW50ZXI=
提示信息文件被修改,用010_Editor打开
发现有四处地方被修改
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvODc1N2M2NWVlZjJkNDljOWE1ODBlYjViNjVmNmY3MGEucG5nI3BpY19jZW50ZXI=
这里我们列出正常upx加壳文件的区段信息进行对比
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvYWNkODhlODI2Mjg3NDJjOTk2OTM3OTFjZThmM2Q1NGEucG5nI3BpY19jZW50ZXI=
UPX0和UPX1是加UPX壳后的两个区段名。此中UPX1区段包罗了需要解压的数据块。
.rsrc是步伐资源信息区段名,这个区段含有原资源段的完整头部以及图标、Manifest、版本等未被压缩的资源,当然另有UPX自身需要的导入信息等(假如步伐自身不含资源段,加壳后就是UPX2)
分析修改
1. upx0被改成了小写
2. upx1被改成了小写
3. upx2被改成了小写
4. upx!被改成了小写
恢复
将upx0、upx1、upx2和upx!全部修改为大写
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvMzdkYjIzNWIyMjZiNGVmOWI5MmRhMDM5MWNiYjU5ZmMucG5nI3BpY19jZW50ZXI=
脱壳
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvMzU2MzM4Mjk3ZTIyNGU5ZWEyOWRjYWQwYjQ4Mjc2ZDcucG5nI3BpY19jZW50ZXI=
可以看到脱壳成功。
分析代码逻辑
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvNzNmNzBmMTU3NGE5NDA5OWEzYWY3M2JhNzY3MzJlNmIucG5nI3BpY19jZW50ZXI=
exp
根据代码逻辑构造exp
data=
flag=""
for i in range(len(data)):
flag+=chr((data+i))
print(flag)
#LitCTF{w3lc0me_t0_l1tctf}
手脱
exe
自己写的步伐加壳,手脱。
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvNDMwNTg5ZTA4Y2UyNDQ4MWJhODZiN2JhOWJiODU5MGQucG5nI3BpY19jZW50ZXI=
入口不是pushad,只能一步一步单步步过。
pushad意味着upx壳解压缩代码的入口。
64位步伐中没有puahad,而是用几个push汇编代码替代。32位步伐中存在pushad。
遵照单步定律,向下跳转答应实现,向上跳转不答应实现。
向下的红色小箭头就是向下的跳转,线为红色即是跳转建立,线为白色就是跳转不建立。
同理向上的红色小箭头就是向上的跳转。
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvODY4NWYxM2IyYmI2NGVkMDljZTk4YTczZTVkNWNhMmYucG5nI3BpY19jZW50ZXI=
一直单步步过,直到发现这样的多个push指令为止。
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvMjZmNjQ0OTNlMTJiNDI1YTg2ODI2YWY4ZDQxZWYyOGUucG5nI3BpY19jZW50ZXI=
根据esp定律下断点探求OEP
f8单步执行一下,让rsp发送厘革。
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvODA1YzU0YTU4MjYzNDZhZTk0YTVlMDJlMjcxZWZjMTMucG5nI3BpY19jZW50ZXI=
查察寄存器窗口,发现rsp产生厘革
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvYmE4ZWJiOWY4MGRlNDBiMjk2NDhmYTczYzczYzdkNzEucG5nI3BpY19jZW50ZXI=
右击rsp,选中在栈中转到。
右击栈顶,选制止点,选择硬件访问断点,选择4字节。
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvMzk5MjUzYWI1ZjJhNDYxMzhmZmFlNjY4Yjc3NmEyM2EucG5nI3BpY19jZW50ZXI=
设置硬件断点后f9运行。
之后发现下面有一个比力大幅度的jmp跳转,而且已经显示文件特性。
判断这个特性会跳转到OEP。
选中jmp指令,然后f4。
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvNjA0YzA5YWIzZTY3NDBhY2I4MTUzNWJiODQzZWM4NGMucG5nI3BpY19jZW50ZXI=
之后直接f8跳到oep
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvMWVmMDgxZGI2MjAwNGNmNzk2YjE3NjFhNjJkNzllY2IucG5nI3BpY19jZW50ZXI=
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvYzhlYWEzN2NmMDAyNDlmMmI4MGI4ZTQ4ZGYxZmYzMjgucG5nI3BpY19jZW50ZXI=
接下来dump文件
点击dump之后将文件生存。
但是这样dump后的文件是无法执行的,所以我们要修复文件。
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvODBhZmYwOGU5ZTViNDkyYjhlYTk4MDM5ZDBmYmU1M2YucG5n
修复文件
先点击 IAT Autosearch,再点击 Get Imports ,在 Imports 列表中右键delete删掉带有红叉的。
之后点击 Fix Dump 选中之前的Dump文件,修复成功。
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvNWYyZDcxMjg5OGE0NGM0YzgwNmFjM2E4N2Q4Y2UyNGUucG5n
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvYWZjZDEzZjVjNWQyNDhkNWFmMTI0MGIxZjhkN2EwZDEucG5n
选中之前dump的文件修复既可。
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvNDQ1YWE0NDhlYzg4NDRkODhkZmFmZDBkNTk4M2I0MjQucG5n
脱壳之后运行步伐测试。
成功执行步伐,dump文件成功。https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvYWI5ZWI4NTE1NjU3NGZjY2FiNWM0YTY1ZjdmZmY0NjQucG5n
exeinfo确认脱壳
发现仍然保留特性信息
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvZTY1NTUzMzY2NWYwNGM1NGI0YzI1ODk2MmI5NzUyOWEucG5nI3BpY19jZW50ZXI=
ida打开确认
确认已脱壳
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvMmNhYWY4Mjg2YmFiNGZlMmEzMTlhNWRhYmJjMDFmMDAucG5nI3BpY19jZW50ZXI=
elf
elf脱壳的过程
探求OEP
目标:找到原始步伐入口地址(OEP)
从启动函数start开始设置断点,一步一步单步步过。
发现ret指令直接F4然后F7,直到发现endbr64指令(即源步伐代码开头)。
endbr64是elf步伐开头的汇编指令,即是OEP
然后查察步伐代码,发现将函数地址送入rdi
判断函数地址为main函数地址
判断这是源步伐代码,进入
c将数据解释为代码,p创建函数
f5反编译,得到main函数伪代码
dump内存
根据OEP利用脚本dump内存到文件,并修复运行。
例题
自己写一段代码编译加壳。
#include<stdio.h>
int main() 1 {
char buf={0};
puts("input:");
read(0,buf,10);
printf("%s",buf);
return 0;
}
编译,这里需要静态编译,要不然文件太小加不了壳。
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvMzhhYWNmMTlhOGU3NDQ5MzhmMTJhNzJkZmNlZWM2ZmYucG5nI3BpY19jZW50ZXI=
加壳,可以看到加壳成功
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvNjU2NDA4ZWY5NTEzNDQ3ZGE0ODg5NzQxMTU3YjQ4ZWYucG5nI3BpY19jZW50ZXI=
exeinfo扫一下,可以看到显示upx壳
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvNGRiODhiMTdmY2Y4NDZhMWFiMjQ1YzQ0ZTY3NzMxN2EucG5nI3BpY19jZW50ZXI=
探求oep
ida打开文件
直接在启动函数位置下断点,然后动态调试。
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvZWM1ZGY0MWRlNjU0NDEwMWE3MThkY2ZhY2ZjZWQ3ODYucG5nI3BpY19jZW50ZXI=
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvNjY1YzVkN2FkZmJlNDYzZjkyZGU2MWVlYzhlNDMxZmIucG5nI3BpY19jZW50ZXI=
下翻,翻到ret指令直接f4运行到这里,然后f8。
重复以上过程,假如没找到ret指令就执行最近的jmp跳转。
当看到下面这个汇编制止代码时我们就快到OEP了。
之后f4运行到ret位置,之后f8单步。
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvNmUxOWJmMTk3MTJjNDQ0NjllNWI0ODU4MjQxM2M4NTgucG5nI3BpY19jZW50ZXI=
跳转到OEP
看起来都是数据,按快捷键c将数据解释为代码。
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvOGY4MjQxMjM1NWY1NDNhMDhhZTAxNzNmYzUwNzAxMTgucG5nI3BpY19jZW50ZXI=
之后看到汇编代码endbr64,elf64位步伐的入口。
是由它来调用初始化步伐,进而调用main函数。
这里被传地址给rdi的byte_401775就是原步伐main函数。
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvMDNkNmMzMTViYjgxNGQ2NzhkMDRiMGZhYjAxODQ5NjYucG5nI3BpY19jZW50ZXI=
进入main函数查察
按c解释为代码,然后在endbr64处按快捷键p创建函数。
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvMmE2ZDJjN2Y2NDk1NDUzYWI1ZWZmODUyYTQ5N2Q1MmEucG5nI3BpY19jZW50ZXI=
之后就可以f5反编译了。
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvN2ZmNTE4ZTU1YzNhNDdjMGFjMzEzZTU5YTU1MWUyNmUucG5nI3BpY19jZW50ZXI=
main函数反编译代码
CTF中一般就可以在这里分析步伐代码解题了。
不外接下来我们要学习怎样dump文件。
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvODBjYzY1OGRmZTNjNGM5YmI5OTI2OGQyOTFkNTJlOTkucG5nI3BpY19jZW50ZXI=
dump内存到文件
先回到OEP这里。
确保eip执向endbr64汇编代码。
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvMjdmM2E3N2E5NzFhNGNmMGJkNjY2NGQ0MTUzNDAyNmQucG5nI3BpY19jZW50ZXI=
然后,alt+f7快捷键打开并运行脚本。
dump64位步伐选用64位文件(idc脚本代码下面有)。
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvMTJhMWJlYjgxNzI1NDdjMmJkNjcwN2U5MmFiOWQ3MzQucG5nI3BpY19jZW50ZXI=
执行,期待执行完毕。
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvOTViNzA2NjNkNTYyNDMxZTk3ZjJhZDQyODQ3NjQyMjAucG5nI3BpY19jZW50ZXI=
执行完毕
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvOGNjOGZlY2ZlNWExNDI0YmJiYTU5ZDRkMTkwYWIyMmQucG5nI3BpY19jZW50ZXI=
dump文件的存放路径在脚本中设置。
执行文件
可执行,则dump文件成功。
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvYmYzYTIyNjI5MGZkNDQxMTkyODNlMDg4MDA1ODUxZGUucG5nI3BpY19jZW50ZXI=
exeinfo扫一下,确认是否脱壳。
显示无壳,则脱壳成功。
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvZDNiMzBiOTllMmFlNDQ1NjhmZWE1MGNiNGMzYTI5ZjgucG5nI3BpY19jZW50ZXI=
idc dump内存文件代码
64位步伐dump内存代码
#include <idc.idc>
#define PT_LOAD 1
#define PT_DYNAMIC 2
static main(void)
{
auto ImageBase,StartImg,EndImg;
auto e_phoff;
auto e_phnum,p_offset;
auto i,dumpfile;
ImageBase=0x400000;
StartImg=0x400000;
EndImg=0x0;
if (Dword(ImageBase)==0x7f454c46 || Dword(ImageBase)==0x464c457f )
{
if(dumpfile=fopen("G:\\dumpfile","wb")) //这里可以更改路径
{
e_phoff=ImageBase+Qword(ImageBase+0x20);
Message("e_phoff = 0x%x\n", e_phoff);
e_phnum=Word(ImageBase+0x38);
Message("e_phnum = 0x%x\n", e_phnum);
for(i=0;i<e_phnum;i++)
{
if (Dword(e_phoff)==PT_LOAD || Dword(e_phoff)==PT_DYNAMIC)
{
p_offset=Qword(e_phoff+0x8);
StartImg=Qword(e_phoff+0x10);
EndImg=StartImg+Qword(e_phoff+0x28);
Message("start = 0x%x, end = 0x%x, offset = 0x%x\n", StartImg, EndImg, p_offset);
dump(dumpfile,StartImg,EndImg,p_offset);
Message("dump segment %d ok.\n",i);
}
e_phoff=e_phoff+0x38;
}
fseek(dumpfile,0x3c,0);
fputc(0x00,dumpfile);
fputc(0x00,dumpfile);
fputc(0x00,dumpfile);
fputc(0x00,dumpfile);
fseek(dumpfile,0x28,0);
fputc(0x00,dumpfile);
fputc(0x00,dumpfile);
fputc(0x00,dumpfile);
fputc(0x00,dumpfile);
fputc(0x00,dumpfile);
fputc(0x00,dumpfile);
fputc(0x00,dumpfile);
fputc(0x00,dumpfile);
fclose(dumpfile);
}else Message("dump err.");
}
}
static dump(dumpfile,startimg,endimg,offset)
{
auto i;
auto size;
size=endimg-startimg;
fseek(dumpfile,offset,0);
for ( i=0; i < size; i=i+1 )
{
fputc(Byte(startimg+i),dumpfile);
}
}
32位步伐dump内存代码
#include <idc.idc>
#define PT_LOAD 1
#define PT_DYNAMIC 2
static main(void)
{
auto ImageBase,StartImg,EndImg; //基址 08048000
auto e_phoff;
auto e_phnum,p_offset; //paddr 0xc 地址,pmemsz ox14大小,p_offset 0x4
auto i,dumpfile;
ImageBase=0x08048000;
StartImg=0x08048000;
EndImg=0x0;
Message("%8x\n",Dword(ImageBase));
if (Dword(ImageBase)==0x7f454c46 || Dword(ImageBase)==0x464c457f )
{
if(dumpfile=fopen("G:\\dumpfile","wb"))//这里可以更改路径
{
e_phoff=ImageBase+Word(ImageBase+0x1c);
e_phnum=Word(ImageBase+0x2c);
for(i=0;i<e_phnum;i++)
{
if (Dword(e_phoff)==PT_LOAD || Dword(e_phoff)==PT_DYNAMIC)
{ p_offset=Dword(e_phoff+0x4);
StartImg=Dword(e_phoff+0xc);
EndImg=Dword(e_phoff+0xc)+Dword(e_phoff+0x14);
dump(dumpfile,StartImg,EndImg,p_offset);
Message("dump LOAD%d ok.\n",i);
}
e_phoff=e_phoff+0x20;
}
fseek(dumpfile,0x30,0);
fputc(0x00,dumpfile);
fputc(0x00,dumpfile);
fputc(0x00,dumpfile);
fputc(0x00,dumpfile);
fclose(dumpfile);
}else Message("dump err.");
}
}
static dump(dumpfile,startimg,endimg,offset)
{
auto i;
auto size;
size=endimg-startimg;
fseek(dumpfile,offset,0);
for ( i=0; i < size; i=i+1 )
{
fputc(Byte(startimg+i),dumpfile);
}
}
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]