让Chrome左键点击书签栏时打开新标签之二



本文内容完全续接上篇文章,单看本文会有一点逻辑断层,上文在此:http://blog.csdn.net/ucantseeme/article/details/7425015


前些天因新配机的缘故,我把我的整个系统环境更新了下

其中就包括Chrome的新版本

结果这一次简单的更新可把我麻烦到了。以前那个左键书签栏时打开新标签页的方法不再适用

(注意区分书签和标签)

让我大概描述一下症状吧

我曾经在上一篇文章中提到这样一句话:为什么要有两个呢,因为对于书签栏中“普通书签按钮”和“菜单书签按钮”,它是分开处理的,所以要修改的地方也就是两处

对于修改来说,要修改二处。这次我遇见的问题就是,它其中的一处失效了,不再适用了,另一处的方法依旧

失效的那个是“菜单书签按钮”,也就是说我们要改的地方是MenuRunnerImpl::RunMenuAt()这条成员函数

我又花了两三个小时上网找Chromium的代码,并将其修改

代码见这:https://code.google.com/p/chromium/codesearch#chromium/src/ui/views/controls/menu/menu_runner.cc

考虑到谷歌会经常更新Chromium,代码自然是会变动的,我这里发下截至到20130610的MenuRunnerImpl::RunMenuAt()代码


MenuRunner::RunResult MenuRunnerImpl::RunMenuAt(
    Widget* parent,
    MenuButton* button,
    const gfx::Rect& bounds,
    MenuItemView::AnchorPosition anchor,
    int32 types)
{
  closing_event_time_ = base::TimeDelta();
  
  if (running_)
  {
    return MenuRunner::NORMAL_EXIT;
  }

  //我删除了中间长长一段代码,保持文章简洁


  base::TimeTicks start_time = base::TimeTicks::Now();
  
  //注意mouse_event_flags,关键  
  int mouse_event_flags = 0;
  
   //参六为返回
  MenuItemView* result = controller->Run(parent, button, menu_, bounds, anchor,
                                        (types & MenuRunner::CONTEXT_MENU) != 0,
                                         &mouse_event_flags);

  closing_event_time_ = controller->closing_event_time();
  
  if (for_drop_)
  {
    return MenuRunner::NORMAL_EXIT;
  }
  
  RecordMenuStats(result, base::TimeTicks::Now() - start_time);
  
  //推荐修改此处的mouse_event_flags
  return MenuDone(result, mouse_event_flags);
}


我都用注释把关键标识出来的,很熟悉嘛,处理方式。他这条成员函数改动比较大,最大的就是我推荐修改的地方

以前是三部曲:
参六为返回
if判断
推荐修改处MenuDone的参

现在变成了:
参六为返回
一条成员函数返回
if判断
又有两条函数(注意是两条,他有两组括号)
最后才是推荐修改处MenuDone的参

有了这些我最后再讲一下怎么改,还是用汇编

文件名:Chrome.dll
版本号:26.0.1410.43
ImageBase:0x01C30000

其实还是蛮好定位的,我推荐用特征码定位到MenuRunnerImpl::RunMenuAt()


特征码:

8B 5D 18 8B F8 85 FF
汇编长这样:
02D4B59C  |.  8B5D 18       mov     ebx, dword ptr [ebp+0x18]
02D4B59F  |.  8BF8          mov     edi, eax
02D4B5A1  |.  85FF          test    edi, edi

这样就能定位到MenuRunnerImpl::RunMenuAt,修改的地方在函数末尾,他长成这样的


02D4B6A1  |.  807E 1E 00    cmp     byte ptr [esi+0x1E], 0x0
02D4B6A5  |.  8945 0C       mov     dword ptr [ebp+0xC], eax
02D4B6A8  |.  74 05         je      short 02D4B6AF
02D4B6AA  |>  33C0          xor     eax, eax
02D4B6AC  |.  40            inc     eax
02D4B6AD  |.  EB 32         jmp     short 02D4B6E1
02D4B6AF  |>  8B7D F4       mov     edi, dword ptr [ebp-0xC]
02D4B6B2  |.  8B5D F8       mov     ebx, dword ptr [ebp-0x8]
02D4B6B5  |.  8D45 EC       lea     eax, dword ptr [ebp-0x14]
02D4B6B8  |.  50            push    eax
02D4B6B9  |.  E8 A8FDF0FE   call    01C5B466
02D4B6BE  |.  8B08          mov     ecx, dword ptr [eax]
02D4B6C0  |.  8B40 04       mov     eax, dword ptr [eax+0x4]
02D4B6C3  |.  2BCF          sub     ecx, edi
02D4B6C5  |.  1BC3          sbb     eax, ebx
02D4B6C7  |.  50            push    eax
02D4B6C8  |.  51            push    ecx
02D4B6C9  |.  FF75 0C       push    dword ptr [ebp+0xC]
02D4B6CC  |.  E8 BFFDFFFF   call    02D4B490
02D4B6D1  |.  83C4 10       add     esp, 0x10
02D4B6D4  |.  FF75 FC       push    dword ptr [ebp-0x4]              ; 这是推荐修改处,请改成push 0x20
02D4B6D7  |.  8BCE          mov     ecx, esi
02D4B6D9  |.  FF75 0C       push    dword ptr [ebp+0xC]
02D4B6DC  |.  E8 54FAFFFF   call    02D4B135
02D4B6E1  |>  5F            pop     edi
02D4B6E2  |.  5B            pop     ebx
02D4B6E3  |>  5E            pop     esi
02D4B6E4  |.  C9            leave
02D4B6E5    C2 1400         retn    0x14


---------------------------------


附注:

对于本例我修改了一个Chrome.dll,配合对应版本的Chrome安装包一起放上来仅供测试(6分):
http://download.csdn.net/detail/ucantseeme/5557475

展望:
下一篇文章系关于VMProtect用法教程。本应今年5月份发,但由于太多事,连稿都没起,恐怕要推迟到年底或明年初。




                                                                     2013年6月10日
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值