谁能告诉我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)
特别,
我为了得到这个而拆解的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) 我最近刚刚触及汇编语言和调试的表面。我有以下代码:
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。
我假设这 …
有人可以解释反汇编代码中的这些步骤会做什么.我有一个大概,但我仍然感到困惑.我知道前两个指令设置了堆栈,而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) 我正在研究在我的Linux Mint 17.3操作系统上安装反汇编程序(或反编译程序),我想知道反汇编程序和反编译程序之间的区别.我粗略地了解它们是什么(名称相当不言自明),但它们仍然有点令人困惑.
我读过一个反汇编程序将程序变成汇编语言,我不知道,所以对我来说似乎没用.我还读到反编译器将"二进制文件"转换为其源代码.究竟什么是二进制文件?
显然,反编译器无法反编译为C,只能使用Python和其他类似语言.那么如何将程序转换为原始的C源代码呢?
如何在进程的可执行存储器中区分组装"调用"指令(E8 [地址])与其他E8字节(例如,在另一条指令中间的那个)的操作码?(从C语言的角度来看,最好)
是否足以验证E8字节之后的四个字节是否引用有效地址,然后验证该区域(即被调用函数的开始)是否以对应于操作码"push ebp"和"mov ebp"的字节开头,esp"(大多数功能都使用这个序幕)?或者是否有更好的选择,例如检查从入口点到出口点的每个操作码?
顺便说一句,我对这个主题几乎没有经验,所以任何信息都值得赞赏.
谢谢!
所以我试图了解汇编编程如何与堆栈框架等一起工作。
我做了一些练习并使用 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) 我在 Visual Studio IDE 的调试器上从 C++ 构建中获得了以下反汇编代码:
根据我在movss指令上看到的内容,应该是
因此,虽然前 3 个字节很容易理解,但我不太理解其余的字节,例如05 6b 02 10 00第一行、44 24 38第二行等等。
你能帮我理解它们吗?05或44好像是/r?这是什么意思?
我有一些非常类似于以下内容的代码:
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,以便从中获取逻辑吗?
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 编写了一个简单的程序,它调用一个名为 while_loop 的函数,参数为 4,3,2。该函数基本上只是一个 while 循环,我认为它与我的问题并不真正相关,因为它更像是一个通用问题。有人告诉我运行 objdump -d,所以我做了。
我有多个问题,所以这里是:
我正在研究以下 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,我没有看到这种行为。
我正在尝试将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 /r为mov,不仅是88。)