adobe flash player升级coredump分析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xuzhina/article/details/41307953

flash player版本:14.0.0.125

产品名称:Adobe® Flash® Player Installer/Uninstaller

系统:windows xp sp3

调试器:windbg

反汇编器:IDA

应用程序:FlashUtil32_14_0_0_125_Plugin.exe

coredump信息:

eax=00000000 ebx=01ed75f0 ecx=00000000 edx=00000000 esi=01ed75f0 edi=00000000
eip=00409db5 esp=0012fc1c ebp=0012fc30 iopl=0         nv up ei pl zr na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00200246
FlashUtil32_14_0_0_125_Plugin+0x9db5:
00409db5 f7f1            div     eax,ecx

堆栈:

0:000> kb
ChildEBP RetAddr  Args to Child              
WARNING: Stack unwind information not available. Following frames may be wrong.
0012fc30 0040c1e6 00000001 00000064 00000000 FlashUtil32_14_0_0_125_Plugin+0x9db5
0012fcd0 77d18734 00010652 00000464 00000001 FlashUtil32_14_0_0_125_Plugin+0xc1e6
0012fcfc 77d18816 0040c190 00010652 00000464 USER32!GetDC+0x6d
0012fd64 77d189cd 00000000 0040c190 00010652 USER32!GetDC+0x14f
0012fdc4 77d18a10 0012fdec 00000000 0012fe0c USER32!GetWindowLongW+0x127
0012fdd4 0040c5c9 0012fdec 0042c0b8 01be42b8 USER32!DispatchMessageW+0xf
0012fe0c 00406975 01be2ad8 01be42b8 01be2d80 FlashUtil32_14_0_0_125_Plugin+0xc5c9
0012fe80 00404b5b 0040150e 01be2a08 00404ba7 FlashUtil32_14_0_0_125_Plugin+0x6975
0012fe84 0040150e 01be2a08 00404ba7 01be2ad8 FlashUtil32_14_0_0_125_Plugin+0x4b5b
0012fe8c 00404ba7 01be2ad8 01be42b8 01be2d80 FlashUtil32_14_0_0_125_Plugin+0x150e
0012feb8 0040120a 01ed7298 01eeefc8 00000000 FlashUtil32_14_0_0_125_Plugin+0x4ba7
00000000 00000000 00000000 00000000 00000000 FlashUtil32_14_0_0_125_Plugin+0x120a

从“coredump信息”里可以, 由于ecx=00000000所以导致div     eax,ecx出现除0异常。

那么,ecx的值是从哪里来呢?

用IDA打开FlashUtil32_14_0_0_125_Plugin.exe,跳转到地址00409db5,可以看到:

.text:00409DA4 loc_409DA4:                             ; CODE XREF: sub_4099CA+2BEj
.text:00409DA4                 mov     edi, [ebp+arg_8]
.text:00409DA7                 movzx   ecx, word ptr [ebp+arg_8]
.text:00409DAB                 shr     edi, 10h
.text:00409DAE                 mov     eax, edi
.text:00409DB0                 imul    eax, 64h
.text:00409DB3                 xor     edx, edx
.text:00409DB5                 div     ecx

由上面代码片段,可以看出,ecx的值是由00409db5所在函数的第三个参数赋值的。看一下第三个参数是多少?

0:000> dd ebp L 8
0012fc30  0012fcd0 0040c1e6 00000001 00000064
0012fc40  00000000 0012fd38 0040c190 00000000

从这里看到,第三个参数也是0(地址0012fc40的值)。那么,第三个参数的值又是从哪里来的?

看一下上一层函数(地址0040c1e6所在的函数):

.text:0040C190 ; LRESULT __stdcall PrevWndFunc(HWND, UINT, WPARAM, LPARAM)
.text:0040C190 PrevWndFunc     proc near               ; DATA XREF: sub_40C605+4Ao
.text:0040C190                                         ; sub_40C796+30o
.text:0040C190
.text:0040C190 x               = dword ptr -80h
.text:0040C190 y               = dword ptr -7Ch
.text:0040C190 var_78          = dword ptr -78h
.text:0040C190 var_74          = dword ptr -74h
.text:0040C190 var_70          = dword ptr -70h
.text:0040C190 var_6C          = dword ptr -6Ch
.text:0040C190 var_68          = dword ptr -68h
.text:0040C190 ho              = dword ptr -64h
.text:0040C190 rc              = RECT ptr -60h
.text:0040C190 var_50          = dword ptr -50h
.text:0040C190 var_4C          = dword ptr -4Ch
.text:0040C190 var_46          = byte ptr -46h
.text:0040C190 var_45          = byte ptr -45h
.text:0040C190 Paint           = tagPAINTSTRUCT ptr -44h
.text:0040C190 var_4           = dword ptr -4
.text:0040C190 hWnd            = dword ptr  8
.text:0040C190 Msg             = dword ptr  0Ch
.text:0040C190 wParam          = dword ptr  10h
.text:0040C190 lParam          = dword ptr  14h
.text:0040C190
.text:0040C190                 push    ebp
.text:0040C191                 mov     ebp, esp
.text:0040C193                 sub     esp, 80h
.text:0040C199                 mov     eax, dword_431EAC
.text:0040C19E                 xor     eax, ebp
.text:0040C1A0                 mov     [ebp+var_4], eax
.text:0040C1A3                 mov     eax, [ebp+hWnd]
.text:0040C1A6                 push    ebx
.text:0040C1A7                 push    esi
.text:0040C1A8                 mov     esi, [ebp+lParam]
.text:0040C1AB                 push    edi
.text:0040C1AC                 push    0FFFFFFEBh      ; nIndex
.text:0040C1AE                 push    eax             ; hWnd
.text:0040C1AF                 mov     [ebp+var_4C], eax
.text:0040C1B2                 call    ds:GetWindowLongW
.text:0040C1B8                 mov     edi, [ebp+Msg]
.text:0040C1BB                 mov     ebx, eax
.text:0040C1BD                 mov     [ebp+var_46], 0
.text:0040C1C1                 cmp     edi, 0C000h
.text:0040C1C7                 jnb     short loc_40C1E6
.text:0040C1C9                 cmp     edi, 400h
.text:0040C1CF                 jb      short loc_40C205
.text:0040C1D1                 test    ebx, ebx
.text:0040C1D3                 jz      short loc_40C1E6
.text:0040C1D5                 mov     eax, [ebx]
.text:0040C1D7                 push    esi
.text:0040C1D8                 lea     ecx, [edi-400h]
.text:0040C1DE                 push    ecx
.text:0040C1DF                 push    [ebp+wParam]
.text:0040C1E2                 mov     ecx, ebx
.text:0040C1E4                 call    dword ptr [eax]
.text:0040C1E6
.text:0040C1E6 loc_40C1E6:                             ; CODE XREF: PrevWndFunc+37j
.text:0040C1E6                                         ; PrevWndFunc+43j ...
.text:0040C1E6                 push    esi             ; lParam

.text:0040C1D7                 push    esi
.text:0040C1D8                 lea     ecx, [edi-400h]
.text:0040C1DE                 push    ecx
.text:0040C1DF                 push    [ebp+wParam]
.text:0040C1E2                 mov     ecx, ebx
.text:0040C1E4                 call    dword ptr [eax]

.text:0040C1A7                 push    esi
.text:0040C1A8                 mov     esi, [ebp+lParam]

可知,00409db5所在函数的第三个参数是由PrevWndFunc的第四个参数提供。查看一下第四个参数

0:000> dd 0012fcd0 L 8
0012fcd0  0012fcfc 77d18734 00010652 00000464
0012fce0  00000001 00000000 0040c190 dcbaabcd

而PrevWndFunc是由User32来调用,第四个参数0值的传入是无法避免,也就是说,00409db5所在的函数,要对第三个参数0值判断。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏技术之路

Caliburn.Micro学习笔记(一)----引导类和命名匹配规则

用了几天时间看了一下开源框架Caliburn.Micro 这是他源码的地址http://caliburnmicro.codeplex.com/ 文档也写的很详细...

2968
来自专栏张善友的专栏

Ibatisnet Quick Start

准备工作 1. 下载ibatis软件包(http://ibatis.apache.org/dotnetdownloads.html)。 2. 创建测试数据库,并...

1978
来自专栏JackieZheng

Nutch源码阅读进程4---parseSegment

前面依次看了nutch的准备工作inject和generate部分,抓取的fetch部分的代码,趁热打铁,我们下面来一睹parse即页面解析部分的代码,这块代码...

2007
来自专栏张善友的专栏

使用 Roslyn 编译器服务

.NET Core和 .NET 4.6中 的C# 6/7 中的编译器Roslyn 一个重要的特性就是"Compiler as a Service",简单的讲,就...

2028
来自专栏流媒体人生

ATL Thunk机制学习

  ATL模板类库使用Thunk技术来实现与窗口消息相关联的HWND和负责处理消息的对象的this指针之间的映射。      ATL中窗口类注册时,窗口过程函数...

631
来自专栏技术博客

Json.Net6.0入门学习试水篇

  JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。简单地说,JSON 可以将 JavaScript 对象中表示的...

1062
来自专栏debugeeker的专栏

某代码查看器的保护突破

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xuzhina/article/detai...

681
来自专栏智能大石头

C#嵌入x86汇编——一个GPIO接口的实现

开始进入工业自动化,买的工控机带有GPIO接口,可用于直接控制继电器。 从厂家拿到接口手册一看,居然是汇编直接操作端口,基本上是IN/OUT指令了。接口很简单,...

2526
来自专栏蘑菇先生的技术笔记

AutoMapper使用手册(一)

2444
来自专栏林德熙的博客

C# 如何在项目引用x86 x64的非托管代码

因为现在的项目使用的是 AnyCpu 在 x86 的设备使用的是x86,在x64使用的是x64,但是对于非托管代码,必须要在x64使用x64的dll,在x86使...

3941

扫码关注云+社区

领取腾讯云代金券