本文内容完全续接上篇文章,单看本文会有一点逻辑断层,上文在此: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日