看chromium代码发现一点有趣的东西

本文探讨了Chromium浏览器中多进程管理和沙箱技术的实现细节,特别是通过获取主线程的EAX寄存器来定位主模块基地址的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

国庆比较闲,就看了一下chromium的代码,也就是chrome的代码。我比较感兴趣的是它多进程管理和沙箱的实现。整体架构就不说了,官网上写得挺清楚,具体流程我也不说了,说的再清楚也不如代码清楚。
文档
http://sites.google.com/a/chromium.org/dev/
打包下载地址
http://build.chromium.org/buildbot/archives/chromium.tgz
SVN地址
http://src.chromium.org/svn/
就是说说一点有趣的地方
在创建了render进程后,获取了主线程的eax。
  1. CONTEXTcontext;
  2. context.ContextFlags=CONTEXT_ALL;
  3. if(!::GetThreadContext(process_info.hThread,&context)){
  4. win_result=::GetLastError();
  5. TerminateTarget(&process_info);
  6. returnwin_result;
  7. }
  8. sandbox_process_=process_info.hProcess;
  9. sandbox_thread_=process_info.hThread;
  10. sandbox_process_id_=process_info.dwProcessId;
  11. #pragmawarning(push)
  12. #pragmawarning(disable:4312)
  13. //Thiscastgeneratesawarningbecauseitis32bitspecific.
  14. void*entry_point=reinterpret_cast<void*>(context.Eax);
  15. #pragmawarning(pop)
  16. base_address_=GetBaseAddress(exe_path,entry_point);
这个写法真是够hack的,目的是获取进程的主模块的起始地址。我查了一下createprocess和的实现,发觉在创建进程主线程的时候,在线程开始执行之前,确实会把用户定义的入口地址放到context的eax里。因为进程的主线程会从BaseProcessStart开始执行,估计BaseProcessStart 会从eax里面取函数地址并执行。 不过这个只是在32位系统上是这样。居然依赖如此隐秘,不确定的特性,也真是够大胆的了,哪天微软改了创建线程的代码,这个估计就挂了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值