IPFS官网

www.ipfs8.vip)是FiLecoin致力服务于使用FiLecoin存储和检索数据的官方权威平台。IPFS官网实时更新FiLecoin(FIL)行情、当前FiLecoin(FIL)矿池、FiLecoin(FIL)收益数据、各类FiLecoin(FIL)矿机出售信息。并开放FiLecoin(FIL)交易所、IPFS云矿机、IPFS矿机出售、租用、招商等业务。

,

在这篇文章中,我们继续为读者详细先容若何打造用于剖析V8字节码的Ghidra处置器模块。

若何打造用于剖析V8字节码的Ghidra处置器模块(上)

若何打造用于剖析V8字节码的Ghidra处置器模块(中)

测试模块

在这个阶段,我们已经可以通过实践来检查处置器模块的事情情形。下面,我们通过来自JS示例中的bytenode来演示若何编译JSC文件:

我们将实验启动凭证本文编写的项目,并将获得的JSC文件导入Ghidra。若是某些地方写错了,Ghidra将显示一个错误,而导致错误的字符串的编号将纪录到eclipse日志中。当修改代码后,无需重新构建项目:SLEIGH将在下次打开文件时举行重新编译。

这里提供了正常情形下所获得的文件。此外,您也可以在我们的repository中下载为该项目编写的相关工具的完整代码。

由于我们只形貌了指令,以是,无法对该文件举行响应的剖析并剖析成函数。需要注重的是,相关代码位于偏移量0x1c0处,按D键可以将该偏移量处的字节转换成指令,按F键可以确立一个函数,详细如下图所示:

当我们使用其他工具(除了SLEIGH)时,输出会变得加倍清晰,这些工具可以供模块开发者使用。例如,当使用pool常量添加work时(cpool要害字已被保留以在SLEIGH中引用),就有时机在LdaGlobal下令中剖析数字标识符。这是该函数在我们项目的最新版本中的样子(供对比之用):


固然,若是效果与用JavaScript编写的源代码具有更好的匹配度的话,那就更好了,但这仅靠在.slaspec(和.sinc)文件中形貌指令是难以实现的。不外,下一篇文章为人人带来了更大的想象空间;它形貌了一种注入p代码操作的机制,允许在完全接见所有应用程序资源的情形下,对确立p代码树的指令举行操作。然后,行使确立的p代码树,将反编译效果绘制并显示到响应的界面上。

关于寄存器的局限

在V8字节码中,有许多指令都涉及到寄存器的局限、一对寄存器对和三个寄存器。从编码局限的角度来看,有些代码需要知道某个寄存器局限内的第一个寄存器的地址,以及该局限内包罗的寄存器的数目。对于使用一对寄存器和三个寄存器的指令,只需要指定初始寄存器即可,由于注释器事先就知道一个给定的指令到底需要使用若干个寄存器。

由此不难看出,一个简朴的解决方案是:在剖析指令时显示第一个寄存器及其数目,好比ForInPrepare r9, r10!3。然则,为了提高可读性,我们可以做一些妥协:输出某局限内的第一个和最后一个寄存器,然则,若是要想实现这一点的话,需要借助于包罗多个组织器的表。

包罗多个组织器的表

作为项目的一部门,为了便于明晰,我们决议显示完整的寄存器清单。在显示部门,还没有可用于输出寄存器局限的现成模板。不外,我们可以借鉴ARM处置器模块的相关原则:通过组织器链来输出变量(这里,只能效仿原则自己;由于架构的差异,详细的实现并不适用)。

 

在这里,人人可以清晰地看到一个具有某种标识符的表包罗多个组织器的情形。实质上,这些组织器在表头部门具有相同的标识符,在比特模式部门具有差其余条件。看了这个形貌,您可能意识到已经实现了一个类似的表,只不外它时用来形貌指令的——它们位于根指令表中,而且可以凭证操作码的条件举行选择。

在其他组织器中使用标识符时,将选择最合适的选项。例如,若是一个表的组织器被形貌为知足某个条件,而下一个组织器没有这个条件要求,那么若是第一个条件为真,就会选择第一个选项,而不思量第二个,纵然第二个在形式上与该条件不矛盾,由于它基本没有施加任何条件。

正如我们可能假设的那样,查看上面的CallProperty指令的逐字节形貌,要显示整个局限,我们需要从第一个条目最先输出寄存器,重点关注已知的第一个局限寄存器和其中的元素数目。就显示部门而言,局限由两个组织器确立:rangeSrc和rangeDst。rangeSrc用于初始化,我们在这里保留输入数据,而rangeDst用于凭证收到的信息输出寄存器。对于rangeDst来说,我们需要确立由多个组织器组成的表:至少要划分显示aX和rX寄存器的局限。

为了实现这些条件,则必须思量到一些限制。在这里,我们建议只用等号(=)来检查比特模式部门的值,不能直接使用寄存器的值,也不能在反汇编操作部门给它赋值。这意味着:我们无法使用暂且寄存器。另外,起始寄存器和局限的长度可能是差其余值,而局限,如前所述,既可以实现为aX寄存器,也可以实现为rX寄存器;它也可以有一个零长度。在这个阶段已经很清晰了,若是我们不想为每种情形确立大量的界说,那么最好使用一些计数器,以确定我们应该输出若干个寄存器,以及从哪个位置输出。

上下文变量

上下文变量适适用于剖析义务。它们的界说类似于符号字段的界说。然而,在这种情形下,字段使用指定寄存器的位,而不是真正的程序位(contextreg,下同)。

当通过寄存器中界说的字段在相同的位局限内执行写入操作时,响应的值将被笼罩(在某些情形下,编译将无法正常事情),由于这些是统一寄存器的位。我们的上下文变量,counter和offStart,在寄存器中使用差其余位局限,由于就其寄义而言,它们是差其余值。

值得注重的是,上下文变量必须在组织器之前声明。

凭证文档的注释,上下文变量通常在比特模式部门用来检查某种上下文的存在,并在反汇编操作部门举行响应的修改。因此,在具有表标识符rangeSrc的组织器中,我们将用它来显示局限,在反汇编操作部门,我们把第一个局限寄存器的代码保留到上下文变量offStart中,而数目则存入上下文变量counter中。在显示部门,我们用一个开放的花括号({)来符号局限的最先。

值得注重的是,V8并没有使用range_size寄存器:它是人为引入的,用于保留局限巨细,因此,若是需要,可以将该值作为指令组织器语义操作部门的一部门使用,这样会加倍利便。而rangeSrc则用于为指令的语义操作部门提供起始寄存器和局限巨细。

作为具有rangeDst标识符的表的一部门,以下实例形貌了五个组织器:

·    起始局限的代码对应于a0,计数器即是0(空局限)。

    rangeDst: } is epsilon; counter = 0; offStart = 0x02 {}

·    起始局限的代码对应于r0,计数器即是0(空局限)。

    rangeDst: } is epsilon; counter = 0; offStart = 0xfb {}

·    offStart中的局限寄存器的代码与a0相同;在反汇编操作部门,counter递增,offStart中的寄存器代码递增;跳转到rangedst1组织器。

    rangeDst: ^ a0 rangeDst1 is a0; rangeDst1; offStart = 0x02 [counter = counter -1;offStart = offStart +1;] {}

·    offStart中的局限寄存器的代码与r0相同;在反汇编操作部门,offStart中的counter和寄存器代码递减;跳转到rangedst1组织器。

    rangeDst: ^ r0 rangeDst1 is r0; rangeDst1; offStart = 0xfb [counter = counter -1;offStart = offStart -1;] {}

·    尚未找到起始局限寄存器的代码,跳转到rangedst1组织器(对于本例,组织器中没有任何条件,因此,只有其余组织器都不适合,才会选择它)。

    rangeDst: rangeDst1 is rangeDst1 {}

在第三和第四种情形下,寄存器将被输出到表中。后面的组织器是rangeDstN,其中N是一个自然数;它们由同样的选项组成,只是针对的是aN/rN寄存器。

注重比特模式部门。当形貌rangeSrc组织器作为比特模式部门的一部门时,标识局限的两个字节都被部署了,这意味着,作为rangeDst界说的一部门,不需要占用程序的任何位,由于它们不会与形貌的指令有牵涉。对于这种情形,我们可以使用预界说的符号epsilon,它与一个空的比特模式相匹配。

下面的例子只形貌了rangeDst、rangeDst1和rangeDst2,之以是这样做,只是为了让文章保持精练。通过它们,就足以让我们领会这类表的类型;完整版本可在github上的项目源文件中找到。实质上,在处置rangeDst时,组织器链将根据rangeDstX中X索引的升序举行处置,直到找到起始寄存器为止。然后,最先处置长度与局限巨细相对应的组织器链。

现实上,带右花括号的组织器看起来异常相似;您可以实验组合使用。记着,一定要使用逻辑运算符“&”和“|”。

在已完成的项目中,CallProperty的组织器显示如下:

这就是我们在listing窗口中看到的内容:

 

现在也许令人疑心的是,用户界说的操作CallVariadicCallOther被用在语义行动部门。在github上的项目中,它被用p-code指令在Java代码中重新界说。使用p-code注入手艺而不是通过挪用操作实现,是希望在反编译器中看到通报的参数列表(凭证Node.js源代码,第一个局限寄存器是吸收器,而其余的是通报的参数)。说句真话,只用SLASPEC是很难实现的。

 

若是您想实验自己来实现局限的处置,可以将语义形貌为:

然后,照葫芦画瓢,我们可以扩展rangeDstХ组织器(我们最多需要包罗r7),然后实验看看console.log(1,2,3,4,5,6)的编译代码是什么样子。您可以通过bytenode自己编译,或者在这里获取已编译好的代码。该函数将位于偏移量0x167处,而指令自己位于0x18b处。

最后,隐含挪用的指令(纵然具有恒定数目的参数)也以类似的方式实现,以解决反编译历程中泛起的问题,由于由于与AX寄存器的初始化存在细微差异,在盘算参数数目时经常泛起混淆(在启动自动剖析功效时,有时会遇到这个问题,不外可以通过修改反编译器中的函数原型来解决,就像在其他系统结构的模块中一样)。

值得注重的是,在我们的项目中,我们把所有的rangeDst组织器都移到了一个单独的文件中,这样就不会由于指令(以及使用2和4字节的操作数的Wide和ExtraWide指令)的形貌而使文件变得杂乱:

小结

这里开发的处置器模块知足了我们为其设定的要求:该工具使得查看文件指定函数的字节码指令成为可能,这些函数必须在项目中剖析。此外,我们还获得了一个反编译器,只管不是一个完善的反编译器,但仍然可以用来更快地浏览应用逻辑。然而,与许多处置器模块一样,在这种情形下,最好直接查看指令,而不是盲目信托反编译器。还需要指出的是,若是有时间和愿望来改善这个工具,那么可以:实现类型存储、设计导入观点,以及消除函数参数的反向顺序问题,这些起劲都是值得的。我们希望本教程能让您更轻松地通过SLEIGH语言编写处置器模块。

相关链接

    ghidra.re/courses/languages/html/sleigh.html: SLEIGH的相关文档。

    github.com/NationalSecurityAgency/ghidra/tree/master/Ghidra/Framework/SoftwareModeling/data/languages: 含有.cspec、.spec、.opinion和*.ldefs形貌信息的有用文件

    spinsel.dev/2020/06/17/ghidra-brainfuck-processor-1.html: 一篇先容通过Ghidra实现brainfuck模块的优异文章。

    github.com/PositiveTechnologies/ghidra_nodejs: 一个带有加载器和剖析器的完整版Ghidra处置器模块的存储库。

附注

我们经常被问及从那里获取指令的形貌,以便形貌Node.js的其他版本,等等。以下是我们的谜底和一些入门小贴士:

指令列表存储在Node.js的bytecodes.h文件中。它们是按指令代码升序排列的。在这里你也可以找到操作数的形貌。然而,使用下面的函数从编译好的二进制文件node.exe中复制这个列表会更快更轻松: 

const char *__cdecl v8::internal::interpreter::Bytecodes::ToString(v8::internal::interpreter::Bytecode bytecode)

在interpreter-generator.cc中,您可以看到指令的语义,以便领会这些指令的作用。

在编写指令语义时,不要遗忘那些在指令中没有显式用到的寄存器。例如,注重考察累加器,看看其值在那里发生了转变。由于Ghidra优化了反编译器的输出,以是您可能会丢失一部门的逻辑。

指令和操作数的代码占用一个字节(对于通例指令而言)。对于宽指令和超宽指令,指令代码则占用2个字节,大多数操作数类型划分占用2或4个字节(带有kFlag8的操作数不增进)。先为通例指令编写代码,然后,为更宽的指令举行修改,这种做法能够让事情更容易一些。

现实上,凭证用户界说的操作来编写反汇编程序或反编译程序是很容易的。您可以从列表输出和原始的反编译器最先下手,然后再添加语义和其他细节。

文件bytecode-register.cc和bytecode-register.h对于明晰寄存器的索引盘算将是异常有用的。

本文翻译自:https://swarm.ptsecurity.com/creating-a-ghidra-processor-module-in-sleigh-using-v8-bytecode-as-an-example/

AllbetGmaing客户端下载

欢迎进入AllbetGmaing客户端下载(www.aLLbetgame.us),欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。

USDT官网接口声明:该文看法仅代表作者自己,与本平台无关。转载请注明:ipfs算力购买网(www.ipfs8.vip):若何打造用于剖析V8字节码的Ghidra处置器模块(下)_IPFS官网
发布评论

分享到:

皇冠app(www.9cx.net):莫文蔚公然穿辱华品牌引热议,登热搜第一后秒换头像_Allbet Gmaing官网
你是第一个吃螃蟹的人
发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。