DLL补丁劫持制作
来源:互联网 发布:高洛峰php百度网盘 编辑:程序博客网 时间:2024/04/29 22:19
DLL:
由于输入表中只包含 DLL 名而没有它的路径名,因此加载程序必须在磁盘上搜索 DLL 文件。首先会尝试从当前程序所在的目录加载 DLL,如果没找到,则在Windows 系统目录中查找,最后是在环境变量中列出的各个目录下查找。利用这个特点,先伪造一个系统同名的 DLL,提供同样的输出表,每个输出函数转向真正的系统 DLL。程序调用系统 DLL 时会先调用当前目录下伪造的 DLL,完成相关功能后,再跳到系统DLL同名函数里执行。这个过程用个形象的词来描述就是系统 DLL 被劫持(hijack)了。
利用这种方法取得控制权后,可以对主程序进行补丁。此种方法只对除kernel32.dll、ntdll.dll等核心系统库以外的DLL有效,如网络应用程序的ws2_32.dll、游戏程序中的d3d8.dll,还有大部分应用程序都调用的lpk.dll、sxs.dll,这些DLL都可被劫持。
伪造的 dll 制作好后,放到程序当前目录下,这样当原程序调用原函数时就调用了伪造的dll的同名函数,进入劫持DLL的代码,处理完毕后,再调用原DLL此函数。
案例软件也是从某个破解论坛上找的,算是拿着做课后练习,边学边记录.
0x01
OD
0x02
这个软件是比较低的版本,跟现在升级之后的网络验证有很多不同,本篇是讲的DLL补丁劫持
0x03
PEID查壳
无壳,C++编写的,不用在意字符串找不到的问题
0x04
载入OD,CTRL+G,到401000
因为之前没有加壳,80%的可能是可以查找到字符串的
来到最上边,找到到期时间双击到代码处,我们就干掉试用时间,达到长久试用的效果
00401291 |. /0F85 2B010000jnz 2.004013C200401297 |. |68 40726A00 push 2.006A72400040129C |. |8B0424 mov eax, dword ptr ss:[esp]0040129F |. |8B00 mov eax, dword ptr ds:[eax]004012A1 |. |8B00 mov eax, dword ptr ds:[eax]004012A3 |. |FF90 88000000call dword ptr ds:[eax+0x88]004012A9 |. |8945 F8 mov [local.2], eax004012AC |. |837D F8 01 cmp [local.2], 0x1004012B0 |. |0F85 D7000000jnz 2.0040138D004012B6 |. |68 40726A00 push 2.006A7240004012BB |. |8B0424 mov eax, dword ptr ss:[esp]004012BE |. |8B00 mov eax, dword ptr ds:[eax]004012C0 |. |8B00 mov eax, dword ptr ds:[eax]004012C2 |. |FF50 28 call dword ptr ds:[eax+0x28]004012C5 |. |8945 FC mov [local.1], eax004012C8 |. |FF75 FC push [local.1]004012CB |. |68 7E844700 push 2.0047847E ; 到期时间:004012D0 |. |B9 02000000 mov ecx, 0x2004012D5 |. |E8 AAFEFFFF call 2.00401184004012DA |. |83C4 08 add esp, 0x8004012DD |. |8945 F8 mov [local.2], eax004012E0 |. |8B5D FC mov ebx, [local.1]004012E3 |. |85DB test ebx, ebx004012E5 |. |74 09 je short 2.004012F0004012E7 |. |53 push ebx004012E8 |. |E8 156F0000 call 2.00408202004012ED |. |83C4 04 add esp, 0x4004012F0 |> |6A 00 push 0x0004012F2 |. |6A 00 push 0x0004012F4 |. |6A 00 push 0x0004012F6 |. |68 01030080 push 0x80000301004012FB |. |6A 00 push 0x0004012FD |. |68 00000000 push 0x000401302 |. |68 04000080 push 0x8000000400401307 |. |6A 00 push 0x000401309 |. |8B45 F8 mov eax, [local.2]0040130C |. |85C0 test eax, eax0040130E |. |75 05 jnz short 2.0040131500401310 |. |B8 79844700 mov eax, 2.0047847900401315 |> |50 push eax00401316 |. |68 03000000 push 0x30040131B |. |BB 608D4000 mov ebx, 2.00408D6000401320 |. |E8 E36E0000 call 2.0040820800401325 |. |83C4 28 add esp, 0x2800401328 |. |8B5D F8 mov ebx, [local.2]0040132B |. |85DB test ebx, ebx0040132D |. |74 09 je short 2.004013380040132F |. |53 push ebx00401330 |. |E8 CD6E0000 call 2.0040820200401335 |. |83C4 04 add esp, 0x400401338 |> |6A 00 push 0x00040133A |. |68 00000000 push 0x00040133F |. |6A FF push -0x100401341 |. |6A 05 push 0x500401343 |. |68 00000106 push 0x601000000401348 |. |68 01000152 push 0x520100010040134D |. |E8 DA6E0000 call 2.0040822C00401352 |. |83C4 18 add esp, 0x1800401355 |. |68 02000080 push 0x800000020040135A |. |6A 00 push 0x00040135C |. |68 01000000 push 0x100401361 |. |6A 00 push 0x000401363 |. |6A 00 push 0x000401365 |. |6A 00 push 0x000401367 |. |68 01000100 push0x100010040136C |. |68 A3000106 push 0x60100A300401371 |. |68 A4000152 push 0x520100A400401376 |. |68 03000000 push 0x30040137B |. |BB C0854000 mov ebx, 2.004085C000401380 |. |E8 836E0000 call 2.0040820800401385 |. |83C4 28 add esp, 0x2800401388 |. |E9 30000000 jmp 2.004013BD0040138D |> \6A 00 push 0x00040138F |. 6A 00 push 0x000401391 |. 6A 00 push 0x000401393 |. 68 01030080 push 0x8000030100401398 |. 6A 00 push 0x00040139A |. 68 00000000 push 0x00040139F |. 68 04000080 push 0x80000004004013A4 |. 6A 00 push 0x0004013A6 |. 68 89844700 push 2.00478489 ; 登录失败004013AB |. 68 03000000 push 0x3004013B0 |. BB 608D4000 mov ebx, 2.00408D60004013B5 |. E8 4E6E0000 call 2.00408208004013BA |. 83C4 28 add esp, 0x28004013BD |> E9 5D000000 jmp 2.0040141F004013C2 |> 68 40726A00 push 2.006A7240
0x05
注意看代码,
“到期时间”往上找到一处跳转,然后再往上,还有一处跳转,跳过下面这一个
但是第一个跳转是跳过登陆失败,第二个是跳过试用时间
00401291 |. /0F85 2B010000jnz 2.004013C2004012B0 |. /0F85 D7000000jnz 2.0040138D
我们可以修改jnz为jmp或者用00 填充,nop填充
00401291 90 nop00401292 90 nop00401293 90 nop00401294 90 nop00401295 90 nop00401296 90 nop004012B0 90 nop004012B1 90 nop004012B2 90 nop004012B3 90 nop004012B4 90 nop004012B5 90 nop
0x06
之后搜索二进制字符串FF25
查找易语言体
为什么来到这,因为我们要找程序的开头也就是入口点
每个jmp回车找一下push ebp
这个地方我也不懂,摆渡的解释是这样的
子程序如何存取参数,因为缺省对堆栈操作的寄存器有 ESP 和 EBP,而 ESP是堆栈指针,无法暂借使用,所以一般使用 EBP 来存取堆栈,假定在一个调用中有两个参数,而且在 push 第一个参数前的堆栈指针 ESP 为 X,那么压入两个参数后的 ESP 为 X-8,程序开始执行 call 指令,call 指令把返回地址压入堆栈,这时候 ESP 为 X-C,这时已经在子程序中了,我们可以开始使用 EBP 来存取参数了,但为了在返回时恢复 EBP 的值,我们还是再需要一句 push ebp 来先保存 EBP 的值,这时 ESP 为 X-10,再执行一句 mov ebp,esp,根据右图可以看出,实际上这时候 [ebp + 8] 就是参数1,[ebp + c]就是参数2。
0x07
看的我一连mengbi,找到倒数第五个jmp进去
00424F70 /. 55 push ebp00424F71 |. 8BEC mov ebp, esp00424F73 |. 8B45 08 mov eax, [arg.1]00424F76 |. 50 push eax00424F77 |. 8B4D 08 mov ecx, [arg.1]00424F7A |. 8B148D B89269>mov edx, dword ptr ds:[ecx*4+0x6992B8]00424F81 |. 52 push edx00424F82 |. B9 90336B00 mov ecx, 2.006B339000424F87 |. E8 847EFFFF call 2.0041CE1000424F8C |. 5D pop ebp00424F8D \. C3 retn[align=left]
这地方应该是一个特征,我们把它retn就好了00424F70 /. 55 push ebp改为00424F70 C3 retn
把所有关键地方找到之后,开始打补丁制作工具对照之前修改的地方
0x08
然后生成DLL补丁
放在同文件目录下运行软件
点登陆,进去,完事说明:我也是个菜鸡,也是最近在学的破解,文中的软件是借用其他大牛的,我只是做个课后记录,把学习中遇到的问题记录下来,没有其他意思.
- DLL补丁劫持制作
- 实现DLL内存补丁,DLL劫持技术
- DLL劫持技术(内存补丁技术)
- 利用DLL劫持内存补丁技术注入
- 【转】DLL劫持技术(内存补丁技术)
- dll劫持
- 补丁制作
- 制作补丁
- DLL劫持技术
- 如何防止DLL劫持
- DLL劫持防御策略
- DLL劫持防御策略
- dll劫持技术
- DLL劫持技术
- DLL劫持备忘录
- DLL劫持漏洞原理
- [DLL劫持] 1 DLL劫持之DLL基础(1)
- [DLL劫持] 2 DLL劫持之DLL基础(2)
- 13 Android Tools for Web Developers
- soa面向服务--案例(下)
- 当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? ?
- Java面试前准备---数据库索引
- 查看各类系统端口占用情况
- DLL补丁劫持制作
- 深入理解ECMAScript中的声明提升、this关键字及作用域(链)
- iOS开发之遍历Model类的属性并完善使用Runtime给Model类赋值
- 新建基于固件库的工程模板-M3
- MYSQL+BAT+定期自动备份
- Java偏向锁实现原理(Biased Locking)
- 题目1186:打印日期
- servlert跳转
- Maven配置