汇编语言中的call是啥意思?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了汇编语言中的call是啥意思?相关的知识,希望对你有一定的参考价值。

刚刚看到一个朋友写的病毒分析报告中,有这样一行00409917 . E9 D2010000 jmp 00409AEE ;这个jmp跳到后面 一个地方 然后又call了回来 应该是为了获得call函数下条指令的地址吧 ;这句话大概是什么意思,我对汇编懂得不多,新手入门

汇编语言中CALL指令调用一个子程序,CPU执行call指令,进行两步操作:
(1)将当前的 IP 或 CS和IP 压入栈中;
(2)转移到紧跟的标号行地址执行程序。
比如:
CALL InputCheck
........
InputCheck:
........
其处理步骤如下:
(1) (sp) = (sp) – 2
((ss) ×16+(sp)) = (CS)
(sp) = (sp) – 2
((ss) ×16+(sp)) = (IP)
(2) (CS) = InputCheck所在的段地址
(IP) = InputCheck所在的偏移地址
参考技术A JMP是转移指令,转到JMP后面写的地址
CALL也是转移的效果,转到CALL之后写的标识符
参考技术B call 标号 ;转移到标号处,但在转移之前将ip/cs和ip入栈
;即push ip jmp near ptr 标号/push cs push ip jmp far ptr 标号本回答被提问者采纳

java中的tmp_xxx是啥意思?

【中文标题】java中的tmp_xxx是啥意思?【英文标题】:What does tmp_xxx means in java?java中的tmp_xxx是什么意思? 【发布时间】:2017-09-03 11:16:30 【问题描述】:

今天我在网上搜索,发现一个java汇编语言的代码,我把它转回java代码,发现一些奇怪的代码,比如“tmp”这个“tmp_xxx”是什么意思? 这是代码:

      private static String encrypted()
  
    byte[] arrayOfByte = new byte[32];
    byte[] tmp8_6 = arrayOfByte;
    tmp8_6[0] = 104;
    byte[] tmp13_8 = tmp8_6;
    tmp13_8[1] = 116;
    byte[] tmp18_13 = tmp13_8;
    tmp18_13[2] = 116;
    byte[] tmp23_18 = tmp18_13;
    tmp23_18[3] = 112;
    byte[] tmp28_23 = tmp23_18;
    tmp28_23[4] = 58;
    byte[] tmp33_28 = tmp28_23;
    tmp33_28[5] = 47;
    byte[] tmp38_33 = tmp33_28;
    tmp38_33[6] = 47;
    byte[] tmp44_38 = tmp38_33;
    tmp44_38[7] = 112;
    byte[] tmp50_44 = tmp44_38;
    tmp50_44[8] = 97;
    byte[] tmp56_50 = tmp50_44;
    tmp56_50[9] = 115;
    byte[] tmp62_56 = tmp56_50;
    tmp62_56[10] = 116;
    byte[] tmp68_62 = tmp62_56;
    tmp68_62[11] = 101;
    byte[] tmp74_68 = tmp68_62;
    tmp74_68[12] = 98;
    byte[] tmp80_74 = tmp74_68;
    tmp80_74[13] = 105;
    byte[] tmp86_80 = tmp80_74;
    tmp86_80[14] = 110;
    byte[] tmp92_86 = tmp86_80;
    tmp92_86[15] = 46;
    byte[] tmp98_92 = tmp92_86;
    tmp98_92[16] = 99;
    byte[] tmp104_98 = tmp98_92;
    tmp104_98[17] = 111;
    byte[] tmp110_104 = tmp104_98;
    tmp110_104[18] = 109;
    byte[] tmp116_110 = tmp110_104;
    tmp116_110[19] = 47;
    byte[] tmp122_116 = tmp116_110;
    tmp122_116[20] = 114;
    byte[] tmp128_122 = tmp122_116;
    tmp128_122[21] = 97;
    byte[] tmp134_128 = tmp128_122;
    tmp134_128[22] = 119;
    byte[] tmp140_134 = tmp134_128;
    tmp140_134[23] = 47;
    byte[] tmp146_140 = tmp140_134;
    tmp146_140[24] = 85;
    byte[] tmp152_146 = tmp146_140;
    tmp152_146[25] = 52;
    byte[] tmp158_152 = tmp152_146;
    tmp158_152[26] = 101;
    byte[] tmp164_158 = tmp158_152;
    tmp164_158[27] = 122;
    byte[] tmp170_164 = tmp164_158;
    tmp170_164[28] = 83;
    byte[] tmp176_170 = tmp170_164;
    tmp176_170[29] = 51;
    byte[] tmp182_176 = tmp176_170;
    tmp182_176[30] = 113;
    byte[] tmp188_182 = tmp182_176;
    tmp188_182[31] = 101;
    tmp188_182;
    String str = "";
    int j = arrayOfByte.length;
    int i = 0;
    if (i < j)
    
      int k = arrayOfByte[i];
      if (k == 48);
      while (true)
      
        i += 1;
        break;
        if (k == 127)
          str = str.concat("π");
        else
          str = str.concat(Character.toString((char)k));
      
    
    return str;
  

【问题讨论】:

它是一个变量名吗? 根据您提供的少量信息,我认为这是您在反编译的字节码中使用命名变量的反编译器的方式。你用的是哪个反编译器? 那些看起来像字节名。 我用过 D2J 和 JD-gui 没有意义。这是反编译器发明的一个虚拟名称,用于通过 something. 调用变量 【参考方案1】:

所以带有“tmp”的名称只是字节名称,编译器无法备份它的旧名称,所以它用 tmp 替换了名称。

我已经清理了代码,这里是没有 tmp 代码的代码

希望这会有所帮助:)

代码:

    private static String encrypted() 
    byte[] arrayOfByte = new byte[32];
    arrayOfByte[0] = 104;
    arrayOfByte[1] = 116;
    arrayOfByte[2] = 116;
    arrayOfByte[3] = 112;
    arrayOfByte[4] = 58;
    arrayOfByte[5] = 47;
    arrayOfByte[6] = 47;
    arrayOfByte[7] = 112;
    arrayOfByte[8] = 97;
    arrayOfByte[9] = 115;
    arrayOfByte[10] = 116;
    arrayOfByte[11] = 101;
    arrayOfByte[12] = 98;
    arrayOfByte[13] = 105;
    arrayOfByte[14] = 110;
    arrayOfByte[15] = 46;
    arrayOfByte[16] = 99;
    arrayOfByte[17] = 111;
    arrayOfByte[18] = 109;
    arrayOfByte[19] = 47;
    arrayOfByte[20] = 114;
    arrayOfByte[21] = 97;
    arrayOfByte[22] = 119;
    arrayOfByte[23] = 47;
    arrayOfByte[24] = 85;
    arrayOfByte[25] = 52;
    arrayOfByte[26] = 101;
    arrayOfByte[27] = 122;
    arrayOfByte[28] = 83;
    arrayOfByte[29] = 51;
    arrayOfByte[30] = 113;
    arrayOfByte[31] = 101;

编码愉快! :)

【讨论】:

@zaph 我已经解码了 asii 值。这是一个包含某种用户名的原始 pastebin 链接。我不想泄露制作代码的人的私人数据,所以我没有在这里包含它:)【参考方案2】:

只是变量名: tmp = temp(临时)

【讨论】:

【参考方案3】:

当您像以前那样反编译 Java 字节码文件时,反编译器通常无法找出局部变量等的原始名称。 (局部变量的名称经常被省略。这取决于使用的原始编译器和编译器切换)。

但是Java语言要求局部变量有名字。所以反编译器需要生成一些名称来放入它输出的源代码中。这些名称通常基于一些简单的模式。这些生成的名称没有与它们相关的内在含义/语义。你(试图理解字节码的人)必须通过弄清楚代码实际在做什么来赋予它们意义。


另一个观察结果是反编译的代码并没有多大意义。我怀疑字节码被混淆了;即处理以使现成的反编译器难以对它们进行反编译。这导致了以下问题:

你为什么要这样做? 合法吗?

'因为如果它是非法的或道德上可疑的(例如破解许可证密钥或 DRM 方案),我们不应该帮助您。

【讨论】:

以上是关于汇编语言中的call是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

汇编语言 call怎么用

汇编语言中的DEC是啥意思?

汇编语言中CALL可以用啥代替

c语言中的strcpy是啥意思?

[汇编]《汇编语言》第10章 CALL和RET指令

汇编指令JMP是啥意思?