标签: opcode

这些操作码是什么?

使用反射器我得到以下输出:

.method private hidebysig static class myModelTestarea.Foo Method() cil managed
{
  .maxstack 1
  .locals init ([0] class myModelTestarea.Foo CS$1$0000)
  L_0000: nop 
  L_0001: ldc.i4.0 
  L_0002: newarr object
  L_0007: call object myModelTestarea.Program::Resolve(object[])
  L_000c: castclass myModelTestarea.Foo
  L_0011: stloc.0 
  L_0012: br.s L_0014
  L_0014: ldloc.0 
  L_0015: ret 
}
Run Code Online (Sandbox Code Playgroud)

对于

private static Foo Method()
{
  return (Foo)Resolve();
}

private static object Resolve( params object[] args )
{
  return new Foo();
}
Run Code Online (Sandbox Code Playgroud)

第11-14行是做什么的?我调用一个函数并得到一个结果(第7行).我将结果转换为正确的返回类型(第c行) - 为什么不立即返回?

不知何故,铸造的结果存储为局部变量 - 然后有一个无法跳转到下一行,再次加载局部变量.为什么?

在我看来,第11-14行和局部变量可以省略......?

c# reflector opcode

6
推荐指数
1
解决办法
816
查看次数

JMP到绝对地址(操作码)

我正在尝试编写一个exe包装器/保护器作为一种学习更多关于汇编程序,c ++以及PE文件如何工作的方法.我现在已经开始工作,所以包含EP的部分与一个密钥进行异或,并创建一个包含我的解密代码的新部分.一切都很好,除非我在解密后尝试JMP到原始EP.

基本上我这样做:

DWORD originalEntryPoint = optionalHeader->AddressOfEntryPoint;
// -- snip -- //
    crypted.put(0xE9);
 crypted.write((char*)&orginalEntryPoint, sizeof(DWORD)); 
Run Code Online (Sandbox Code Playgroud)

但是,它不是跳到入口点,而是显示此代码反汇编为:

00404030   .-E9 00100000    JMP 00405035 ; should be 00401000 =[
Run Code Online (Sandbox Code Playgroud)

当我尝试手动更改它时,新的操作码显示为

00404030    -E9 CBCFFFFF    JMP crypted.00401000
Run Code Online (Sandbox Code Playgroud)

0xCBCFFFFF来自哪里?我如何从C++端生成它?

x86 assembly executable masm opcode

6
推荐指数
3
解决办法
3万
查看次数

寻找一种为反编译器定义规则的好方法,需要建议

我正在为MIPS架构开发一个非常简单的反编译器,随着我的进步,我必须为代码分析定义许多规则,例如"如果这个操作码是lui而下一个操作码是addiu然后返回var = value "或"如果这个操作码是bne,它指的是当前的地址 - 创建循环解析树中的定义".问题 - 有很多这样的规则,我找不到定义它们的好方法.我尝试为每个规则编写分离的函数,定义好的OOP基础逻辑类并扩展它们来创建规则,甚至尝试了令人沮丧的代码的正则表达式(令我惊讶的是这比预期更好)但无论我尝试过什么,我的代码很快变得很大,难以阅读,无论我试图记录和结构如何它.

这让我得出结论,我试图通过使用错误的工具来解决这个任务(更不用说对于这样复杂的任务来说太愚蠢:)),但我不知道应该尝试什么.目前我有两个未经考虑的想法,一个是使用某种DSL(我完全没有这方面的经验,所以我可能完全错了),另一个是编写某种类似二进制regexp的工具用于操作码匹配.

我希望有人可以指出我正确的方向,谢谢.

decompiling mips opcode disassembly control-flow

6
推荐指数
1
解决办法
420
查看次数

如何在gcc中获得完整的汇编程序输出?

我知道我可以使用以下命令获取编译器生成的汇编代码:

gcc -S ...
Run Code Online (Sandbox Code Playgroud)

即使这令人烦恼也没有给我一个目标文件作为过程的一部分.

但是,如何获得编译代码的所有内容?我的意思是地址,生成的字节等等.

输出的指令gcc -S不告诉我有关指令长度或编码的任何信息,这是我想要看到的.

assembly gcc opcode

6
推荐指数
1
解决办法
6550
查看次数

方向/符号扩展x86指令集中的位

在x86指令集中,索引1处的位可以是指定目标和源操作数的方向位,也可以是符号扩展位.我想知道最简单的逻辑方法是什么,以确定它是哪种情况.有没有办法检查除了检查指令操作码并比较它们以找出它是什么(对于指令的符号扩展或方向位变体)?还有一些指令忽略了这一位,但由于它被设置为0,因此它并不重要.

编辑:事实证明,对于写入错误(这是我的代码所针对的),reg-> r/m始终是这种情况,因为ar/m-> reg指令永远不会触发写入错误.但是,如果其他人遇到类似的问题,任何信息仍然会很好.

x86 assembly x86-64 machine-code opcode

6
推荐指数
1
解决办法
1404
查看次数

为什么C#编译器在IL中发出额外的OpCode?

如果我的方法Multiply定义为:

public static class Experiment
{
    public static int Multiply(int a, int b)
    {
        return a * b;
    }
}
Run Code Online (Sandbox Code Playgroud)

那么为什么编译器会发出这个IL:

.method public hidebysig static int32 Multiply(int32 a, int32 b) cil managed
{
    .maxstack 2              //why is it not 16?
    .locals init (
        [0] int32 CS$1$0000) //what is this?
    L_0000: nop              //why this?
    L_0001: ldarg.0 
    L_0002: ldarg.1 
    L_0003: mul 
    L_0004: stloc.0          //why this?
    L_0005: br.s L_0007      //why this?
    L_0007: ldloc.0          //why this?
    L_0008: ret 
}
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,它还包含一些对我没有意义的额外操作码,实际上我期望以下IL:

.method public …
Run Code Online (Sandbox Code Playgroud)

c# il cil opcode

6
推荐指数
1
解决办法
439
查看次数

方法的最后一条指令可能有哪些OpCode?

在.net中可以作为方法的最后一条指令存在的可能的OpCode是什么.

目前我知道它可以

但它有可能成为任何其他操作码吗?如果是这样,什么代码(更喜欢c#)会产生它们?

"最后"我指的是"方法体中定义的最终OpCode"

.net c# il cil opcode

6
推荐指数
1
解决办法
336
查看次数

使用Java访问内存

我有一个程序加载在内存中.现在我想直接访问内存并更改该程序内存中的OPCODE和DATA.为此,我需要编写一个Java程序.

你能告诉我这是否可行?如果是,请告诉我如何编写这样的程序.

提前致谢!

java memory opcode

6
推荐指数
1
解决办法
6113
查看次数

汇编中操作码的二进制

我有以下代码(在生成列表文件后,为intel 80x86编写):

 1                                    global _start
 2                                  
 3                                  section .data
 4 00000000 03000000                x:  dd  3
 5                                  
 6                                  ;section .text
 7                                  
 8                                  _start:
 9 00000004 8B0D[00000000]              mov ecx, [x]
10 0000000A 000D[16000000]          r:  add byte [l+6], cl
11 00000010 C605[00000000]30        l:  mov byte [x], 48
12 00000017 51                          push    ecx
13 00000018 B804000000                  mov eax, 4      ; For "Write" system call
14 0000001D BB01000000                  mov ebx, 1      ; to standard output
15 00000022 B9[00000000]                mov ecx, x      ; "buffer"
16 00000027 …
Run Code Online (Sandbox Code Playgroud)

x86 assembly opcode

6
推荐指数
1
解决办法
1590
查看次数

C#IL代码修改 - 保持堆栈完整

这个问题是关于自定义C#IL代码的静态堆栈分析以及如何设计操作码来满足编译器.

我有代码通过附加我自己的代码来修改现有的C#方法.为了避免原始方法在执行代码之前返回,它将所有RET操作码替换为BR endlabel,并将该标签添加到原始代码的末尾.然后我在那里添加更多代码,最后是RET.

这一切都很好,但某些方法失败了.这是一个简单的例子:

public static string SomeMethod(int val)
{
    switch (val)
    {
        case 0:
            return "string1".convert();
        case 1:
            return "string2".convert();
        case 2:
            return "string3".convert();
        // ...
    }
    return "";
}
Run Code Online (Sandbox Code Playgroud)

这个IL代码表示:

.method public hidebysig static string SomeMethod(int32 val) cil managed
{
    .maxstack 1
    .locals val ([0] int32 num)
    L_0000: ldarg.0 
    L_0001: stloc.0 
    L_0002: ldloc.0 
    L_0003: switch (L_002e, L_004f, L_0044, ...)
    L_002c: br.s L_0091
    L_002e: ldstr "string1"
    L_0033: call string Foo::convert(string)
    L_0038: ret 
    L_0039: ldstr "string2" …
Run Code Online (Sandbox Code Playgroud)

c# cil static-analysis metaprogramming opcode

6
推荐指数
1
解决办法
196
查看次数