标签: disassembly

x86汇编代码

谁能告诉我x86 ASM中的以下代码是什么?它只是一个较大文件的一部分,但只是这一点让我失望.

find_max:
  6 .LFB0:
  7         .cfi_startproc
  8         pushq   %rbp
  9         .cfi_def_cfa_offset 16
 10         movq    %rsp, %rbp
 11         .cfi_offset 6, -16
 12         .cfi_def_cfa_register 6
 13         movl    %edi, -20(%rbp)
 14         movl    -20(%rbp), %eax
 15         cltq
 16         movl    a(,%rax,4), %eax
 17         movl    %eax, -4(%rbp)
 18         movl    -20(%rbp), %eax
 19         movl    %eax, -8(%rbp)
Run Code Online (Sandbox Code Playgroud)

特别,

  • 第13行的%edi最初是什么?
  • 为什么代码引用-20(%rbp)?
  • 第16行究竟做了什么?
  • 切换32位寄存器和64位寄存器背后的智慧是什么(例如在第15行的情况下)?

我为了得到这个而拆解的C代码如下所示:

extern int a[];

int find_max(int n)
{
    int max = a[n];
    int pos = n;
    int x;

    while (n > 0)
    {
        n--;
        x …
Run Code Online (Sandbox Code Playgroud)

x86 assembly disassembly

0
推荐指数
1
解决办法
629
查看次数

了解汇编中的 JMP 代码

我最近刚刚触及汇编语言和调试的表面。我有以下代码:

Address   Hex dump          Command                                  Comments
006E3689   .  E8 C5F9FFFF   CALL 006E3053
->006E368E      E9            DB E9
->006E368F      35            DB 35                                    ; CHAR '5'
->006E3690      80            DB 80
->006E3691   .  0000D490      DD 90D40000
006E3695  />  E8 72040000   CALL 006E3B0C
Run Code Online (Sandbox Code Playgroud)

再往下...

Address   Hex dump          Command                                  Comments
006EB6C8  /.  6A 58         PUSH 58
006EB6CA  |.  68 A0372A00   PUSH 2A37A0
006EB6CF    ^ E9 C17FFFFF   JMP 006E3695
Run Code Online (Sandbox Code Playgroud)

现在,在我编译 -> 指示的代码之前,实际上都包含在 a 中,JMP 006EB6C8当然只是跳到第二组代码,推送了一些内容并返回到顶部。

现在这段代码仍然有效,但我不确定为什么代码在编译时发生了变化(使用 Ollydbg),但更重要的是(我相信)代码如何知道跳转以及跳多远。到目前为止,我的研究告诉我E9是跳转的操作码,但我还没有找到有关 和35的信息80

我假设这 …

x86 assembly opcode disassembly instruction-encoding

0
推荐指数
1
解决办法
2859
查看次数

了解汇编代码中的减法和乘法

有人可以解释反汇编代码中的这些步骤会做什么.我有一个大概,但我仍然感到困惑.我知道前两个指令设置了堆栈,而eax将是一个返回值,但就是这样.

我正在寻找的是以下步骤的目的:

push %ebp - base stack frame pointer
mov %esp, %ebp - stack pointer
sub $0x10, %esp - subtracts 16 from ?
mov 0x8(%ebp), %eax - ?
imul 0xc(%ebp), %eax - multiply 12 and ?
mov %eax, -0x4(%ebp) - ?
mov -0x4(%ebp), %eax - puts -0x4(%ebp) not sure what that would be , into eax making it the return value?
leave
ret
Run Code Online (Sandbox Code Playgroud)

c x86 assembly disassembly

0
推荐指数
1
解决办法
670
查看次数

反汇编程序如何工作以及它与反编译器有何不同?

我正在研究在我的Linux Mint 17.3操作系统上安装反汇编程序(或反编译程序),我想知道反汇编程序和反编译程序之间的区别.我粗略地了解它们是什么(名称相当不言自明),但它们仍然有点令人困惑.

我读过一个反汇编程序将程序变成汇编语言,我不知道,所以对我来说似乎没用.我还读到反编译器将"二进制文件"转换为其源代码.究竟什么是二进制文件?

显然,反编译器无法反编译为C,只能使用Python和其他类似语言.那么如何将程序转换为原始的C源代码呢?

cpu-architecture disassembly decompiler

0
推荐指数
1
解决办法
406
查看次数

如何识别内存中的汇编"调用"指令?

如何在进程的可执行存储器中区分组装"调用"指令(E8 [地址])与其他E8字节(例如,在另一条指令中间的那个)的操作码?(从C语言的角度来看,最好)

是否足以验证E8字节之后的四个字节是否引用有效地址,然后验证该区域(即被调用函数的开始)是否以对应于操作码"push ebp"和"mov ebp"的字节开头,esp"(大多数功能都使用这个序幕)?或者是否有更好的选择,例如检查从入口点到出口点的每个操作码?

顺便说一句,我对这个主题几乎没有经验,所以任何信息都值得赞赏.

谢谢!

debugging x86 assembly low-level disassembly

0
推荐指数
1
解决办法
134
查看次数

汇编中函数之间的参数传递如何进行?

所以我试图了解汇编编程如何与堆栈框架等一起工作。
我做了一些练习并使用 GDB 反汇编了一些 C 代码。现在的任务是找出“main”和函数之间的参数传输是如何工作的。我刚刚开始学习,有点迷失了下一个例子实际上在做什么。关于从哪里开始有什么想法或建议吗?

这是一个与教师合作的递归程序。

汇编代码如下所示:

    1149:   f3 0f 1e fa             endbr64 
    114d:   55                      push   rbp
    114e:   48 89 e5                mov    rbp,rsp
    1151:   48 83 ec 10             sub    rsp,0x10
    1155:   89 7d fc                mov    DWORD PTR [rbp-0x4],edi
    1158:   83 7d fc 01             cmp    DWORD PTR [rbp-0x4],0x1
    115c:   76 13                   jbe    1171 <f+0x28>
    115e:   8b 45 fc                mov    eax,DWORD PTR [rbp-0x4]
    1161:   83 e8 01                sub    eax,0x1
    1164:   89 c7                   mov    edi,eax
    1166:   e8 de ff ff ff          call …
Run Code Online (Sandbox Code Playgroud)

c recursion assembly x86-64 disassembly

0
推荐指数
1
解决办法
220
查看次数

movss操作码需要如何解释?

我在 Visual Studio IDE 的调试器上从 C++ 构建中获得了以下反汇编代码:

在此输入图像描述

根据我在movss指令上看到的内容,应该是

  1. F3 0F 10 /r MOVSS xmm1, xmm2 -- 将标量单精度浮点值从 xmm2 合并到 xmm1 寄存器。
  2. F3 0F 10 /r MOVSS xmm1, m32 - 将标量单精度浮点值从 m32 加载到 xmm1 寄存器。
  3. F3 0F 11 /r MOVSS xmm2/m32, xmm1 -- 将标量单精度浮点值从 xmm1 寄存器移至 xmm2/m32。

因此,虽然前 3 个字节很容易理解,但我不太理解其余的字节,例如05 6b 02 10 00第一行、44 24 38第二行等等。

你能帮我理解它们吗?05或44好像是/r?这是什么意思?

assembly x86-64 disassembly

0
推荐指数
1
解决办法
73
查看次数

这个电话是从哪里来的?

我有一些非常类似于以下内容的代码:

class C {
    string s;
    static C a = new C();

    static void Main() {
        C b = a;
        b.s = "hello";
}
Run Code Online (Sandbox Code Playgroud)

Main在发布模式下,该方法的反汇编如下:

        C b = a;
00000000  push        ebp 
00000001  mov         ebp,esp 
00000003  push        eax 
00000004  cmp         dword ptr ds:[04581D9Ch],0 
0000000b  je          00000012 
0000000d  call        763B3BC3 
00000012  xor         edx,edx 
00000014  mov         dword ptr [ebp-4],edx 
00000017  mov         eax,dword ptr ds:[01B24E20h] ; Everything up to this point
0000001c  mov         dword ptr [ebp-4],eax        ; is fairly clear.
        b.s = …
Run Code Online (Sandbox Code Playgroud)

c# il disassembly

-1
推荐指数
1
解决办法
214
查看次数

卡在拆卸中

我需要一个函数的帮助,我认为这并不难,有人可以将其转换为C,以便从中获取逻辑吗?

0x004011cf mov al, byte [esi]

| : 0x004011d1 and eax, 0xff

| : 0x004011d6 mul ebx

| : 0x004011d8 inc esi

| : 0x004011d9 add edi, eax

| : 0x004011db inc ebx

| : 0x004011dc dec ecx

| `=< 0x004011dd jne 0x4011cf
Run Code Online (Sandbox Code Playgroud)

c reverse-engineering disassembly

-1
推荐指数
1
解决办法
54
查看次数

如何解释 objdump 反汇编输出列?

我用 c 编写了一个简单的程序,它调用一个名为 while_loop 的函数,参数为 4,3,2。该函数基本上只是一个 while 循环,我认为它与我的问题并不真正相关,因为它更像是一个通用问题。有人告诉我运行 objdump -d,所以我做了。

在此处输入图片说明

我有多个问题,所以这里是:

  1. 我知道在最左边的列中有地址,它们根据前面的字节数递增。我不太明白的是第二列。它是正在执行的指令,但是是十六进制的吗?这是否意味着 push %ebp 相当于 55 ?我不太明白。
  2. 由于这是 IA-32 并且它是小端,我知道最低有效字节存储在最低地址。但是,我不明白这些字节的显示顺序是否根据它们在内存中的位置。看看第 3 行,“8b 55 10”这是否意味着最低地址中有 8b,我会反过来读取它,或者这是否意味着 10 在最低地址,我会反过来读取它?
  3. 左边的这些地址是绝对内存地址还是相对地址?

x86 assembly endianness disassembly att

-1
推荐指数
1
解决办法
508
查看次数

在 C 中的 CHAR 之后存储 INT 需要 7 个字节而不是 4 个字节

我正在研究以下 C 代码片段:

char x = 'a';
int y = 5;
Run Code Online (Sandbox Code Playgroud)

运行 gdb 后,我遇到以下程序集:

mov BYTE PTR [ebp-1], 0x61
mov DWORD PTR [ebp-8], 0x5
Run Code Online (Sandbox Code Playgroud)

为什么ebp减少了 7 而不是 4?如果我更换char x = 'a'int x = 2,我没有看到这种行为。

c assembly gcc gdb disassembly

-2
推荐指数
1
解决办法
78
查看次数

C#的字节码格式是什么?

我正在尝试将IL反汇编程序集成到我的反汇编应用程序(Android-Disassembler)中,但是找不到一些可以进行CIL反汇编的库。因此,我正在尝试为CIL开发一个简单的反汇编程序。所以我在互联网上搜索(堆栈溢出,谷歌,维基百科等)。但是我找不到CIL汇编代码如何变成字节码。

我在二进制编辑器中打开了一个C#应用程序(以为可以找到人类可读的IL源代码),但是我只能在其中找到一些二进制文件。

C#字节码看起来如何?

例如,X86指令字节的长度是可变的:

NOP = 0x90,
JMP = 0xEB 0xxx 0xxx 0xxx 0xxx, ...
Run Code Online (Sandbox Code Playgroud)

到目前为止,我只能找到每个指令的操作码(https://en.wikipedia.org/wiki/List_of_CIL_instructions)。但是我也想知道操作数也适用于操作码。

(如88 /rmov,不仅是88。)

c# cil disassembly

-3
推荐指数
1
解决办法
83
查看次数