`
sunshineormer
  • 浏览: 12391 次
  • 来自: ...
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

[领域]javascript hacking guide part 4

阅读更多

孙向晖 sunshineormer at hotmail.com

在正式开始之前,先说点关于RHG的话题,我的JHG系列,基本是在仿照着RHG的风格在写作。RHG的述事风格很有条理性,并且会指导你跳过跳过再跳过一些无关痛痒的程序片段。这是对的,在一大堆程序中,能够快速准确的定位,不是件很容易的事情。

从今天开始,我将讲述我对蜘蛛猴源代码的查找过程:

在js.c 找到main里面的调用过程,注意,下面的函数都是精简过的,而且是平级的关系:

rt = JS_NewRuntime(...

cx = JS_NewContext(rt,...

glob = JS_NewObject(cx, &global_class, NULL, NULL);

JS_InitStandardClasses(cx, glob)

JS_DefineFunctions(cx, glob, shell_functions)

<o:p> </o:p>

ok,现在来看一下,运行时和上下文环境是解释引擎的初始化,可以先跳过,哈,我们真正关心的肯定是从glob开始的那3句了:globECMA262中要求的内置全局对象,这里有我们比较感兴趣的NewObject方法;紧接其后的,将是对其他内置对象的创建过程(JS_InitStandardClasses;最后,我们可以看看全局对象global都有哪些方法。

<o:p> </o:p>

JS_NewObject的函数声明,被定义在jsobj.h中,函数定义在jsobj.c中:

extern JSObject *

js_NewObject(JSContext *cx, JSClass *clasp, JSObject *proto, JSObject *parent);

记住,因为是要初始化glob对象,我们在传递参数是,protoparent都传递了NULL。这样,有效传递到函数体中的,就只有刚刚创建的上下文环境(cx)和clasp了。clasp的值被赋予了global_class,这是个全局变量,定义在js.c

<o:p> </o:p>

JSClass global_class = {

    "global", JSCLASS_NEW_RESOLVE | JSCLASS_GLOBAL_FLAGS,

    JS_PropertyStub,  JS_PropertyStub,

    JS_PropertyStub,  JS_PropertyStub,

    global_enumerate, (JSResolveOp) global_resolve,

    JS_ConvertStub,   JS_FinalizeStub,

    JSCLASS_NO_OPTIONAL_MEMBERS

};

<o:p> </o:p>

在这个变量中,我们发现了“global”这个单词,结合JSClass这名字,再根据MFC等框架的经验,很容易的我们就可以联想到,这是用来做动态生成和RTTI的类名。

要想看懂这个结构体,一点也不难,只需到jsapi.h中找JSClass的定义即可。里面也没有什么太多的玩意,只是有一堆的函数指针,我们只需简单留意其中的强制非空部分即可。

<o:p> </o:p>

struct JSClass {

    const char          *name;

    uint32              flags;

<o:p> </o:p>

    /* Mandatory non-null function pointer members. */

    JSPropertyOp        addProperty;

    JSPropertyOp        delProperty;

    JSPropertyOp        getProperty;

    JSPropertyOp        setProperty;

    JSEnumerateOp       enumerate;

    JSResolveOp         resolve;

    JSConvertOp         convert;

    JSFinalizeOp        finalize;

<o:p> </o:p>

    /* Optionally non-null members start here. */

    JSGetObjectOps      getObjectOps;

    JSCheckAccessOp     checkAccess;

    JSNative            call;

    JSNative            construct;

    JSXDRObjectOp       xdrObject;

    JSHasInstanceOp     hasInstance;

    JSMarkOp            mark;

    JSReserveSlotsOp    reserveSlots;

};

放眼望去,偶的老天,原来类的属性操作(增加属性,删除属性,查询和设置属性都是在这定义的啊)。要知道,在javascript中,所有的attributes和方法都是属性啊。按下不表。

还是跳回到newObject

<o:p> </o:p>

/* Bootstrap the ur-object, and make it the default prototype object. */

    if (!proto) {

        if (!js_GetClassId(cx, clasp, &id))

            return NULL;

        if (!js_GetClassPrototype(cx, parent, id, &proto))

            return NULL;

        if (!proto &&

            !js_GetClassPrototype(cx, parent, INT_TO_JSID(JSProto_Object),

                                  &proto)) {

            return NULL;

        }

    }

先看这段代码,简而言之,想做的事情是,找到要创建对象的原型,如果实在找不到,就使用缺省的原型对象。跳过。

接下来的代码,

/* Always call the class's getObjectOps hook if it has one. */

    ops = clasp->getObjectOps

          ? clasp->getObjectOps(cx, clasp)

          : &js_ObjectOps;

只是想找一个对象的操作方法集,因为我们在定义global_class全局对象时,使用了JSCLASS_NO_OPTIONAL_MEMBERS宏,可以很轻松的判定这个表达式如同:

ops = &js_ObjectOps;

<o:p> </o:p>

继续向后:

/*

     * Allocate a zeroed object from the GC heap.  Do this *after* any other

     * GC-thing allocations under js_GetClassPrototype or clasp->getObjectOps,

     * to avoid displacing the newborn root for obj.

     */

    obj = (JSObject *) js_NewGCThing(cx, GCX_OBJECT, sizeof(JSObject));

    if (!obj)

        return NULL;

从注释中,我们可以轻松的看出,按照ECMAScript的说法,对象被分配到heap中,已经得到了实现了。

被定义在了jsgc.c中,我们不想太多的去看堆的alloc分配,只要知道这里生成了一个空的JSObject对象即可。

void *

js_NewGCThing(JSContext *cx, uintN flags, size_t nbytes)

再接着,是一大段的判断条件,想法很简单,既而是已经在heap中创建了对象,就要给对象的mapslot进行赋值了:一种做法是判断了若干条件后,用原型的map;另一种可能,是创建新的map

<o:p> </o:p>

你会问map里面都存放了什么?呵呵。好问题。且听下回分解吧。

 

分享到:
评论

相关推荐

    Hacking_ A 101 Hacking Guide

    Hacking_ A 101 Hacking Guide,hack参考书,值的一看。

    Ruby黑客指南(Minero Aoki)Ruby Hacking Guide (Minero Aoki)

    4. 扫描器和解析器:扫描器的作用是将源代码文本分解成一系列的标记(tokens),而解析器则根据语言的语法规则将这些标记组织成语法树(syntax tree)。这是理解编程语言工作原理的关键步骤。 5. 评估过程:评估...

    ruby hacking guide 中文版教程

    《Ruby Hacking Guide》是一本深受Ruby爱好者喜爱的中文教程,它主要面向已经对Ruby有基本了解的读者,旨在深入挖掘Ruby语言的内部机制,帮助读者成为Ruby编程的高手。这本书详细介绍了Ruby语言的核心概念、语法特性...

    Ruby Hacking Guide

    4. **安全实践**:Ruby Hacking Guide不仅讨论攻击技巧,也会涵盖防御策略,比如如何编写安全的Ruby代码,防止SQL注入、跨站脚本攻击(XSS)和其他常见的Web漏洞。 5. **漏洞分析**:书中可能会详细解析Ruby Web应用...

    Ruby Hack Guide中文版.chm

    Ruby Hacking Guide是一本探讨C Ruby实现的书,这次发布的部分包括对全书的介绍和本书的第一部分。第一部分的内容包括对Ruby语言一个概要介绍和对Ruby对象模型的讲解。从我个人阅读的感觉来看,第一章对于Ruby语言的...

    Unreliable Guide To Hacking The Linux

    本文档旨在根据提供的《Unreliable Guide To Hacking The Linux Kernel》的部分内容,深入分析与Linux内核相关的技术知识点,包括但不限于基本规则、系统调用替代方案、常见的死锁情况、通用函数及其用法等。...

    iOS Hacking Guide.pdf

    4. iOS应用包基础:理解iOS应用包的结构,支持的应用架构,以及如何将应用二进制文件从FAT二进制格式转换为特定架构的二进制文件,包括将32位应用转换为64位应用。 5. 在最新iOS上使用Xcode编译源代码:指导如何...

    Unreliable Guide To Hacking The Linux Kernel

    ### Unreliable Guide to Hacking the Linux Kernel:关键知识点概览 #### 1. 引言 本文档《Unreliable Guide To Hacking The Linux Kernel》由Rusty Russell撰写,旨在为有经验的C程序员提供一份Linux内核开发的...

    Guide to Hacking

    Guide to Hacking

    Beginning Ethical Hacking with Python(Apress,2016)

    and the third part deals with more advanced features of ethical hacking. What You Will Learn Discover the legal constraints of ethical hacking Work with virtual machines and virtualization Develop ...

    GOOGLE_HACKING技术手册.part1.rar

    GOOGLE_HACKING技术手册 GOOGLE_HACKING技术手册 GOOGLE_HACKING技术手册 GOOGLE_HACKING技术手册

    Hacking for Beginners 黑客初学

    Hacking For Beginners The Ultimate Guide To Becoming A Hacker

    Remote Car Hacking

    《远程车辆黑客攻击》是2015年黑帽大会上的一个主题演讲,由Charlie Miller和Chris Valasek两位安全...这篇演讲是当时汽车网络安全领域的热点话题,并且直接推动了汽车行业在车辆网络安全方面投入更多的关注和资源。

    IOS Hacking Guide

    iOS applications store data in the application sandbox which is not accessible to the public (but is available to root and the application itself). Without root access, it is not possible to access ...

Global site tag (gtag.js) - Google Analytics