Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 拆装_C++_Assembly - Fatal编程技术网

C++ 拆装

C++ 拆装,c++,assembly,C++,Assembly,有人能解释一下为什么我会这样做吗 dumpbin/disasm“C:\simple\u Win32.exe”>>“C:\users\piter\myDump5.txt” 我看不到例程的名称,只有eax、ebx、mov和其他“非我的”函数(预处理器宏等)。即,在以下示例中,我们有汇编代码和函数名称: .text:00403D89 lea eax, [ebp+SystemTimeAsFileTime] .text:00403D8C push eax .text:00403D8D

有人能解释一下为什么我会这样做吗

dumpbin/disasm“C:\simple\u Win32.exe”>>“C:\users\piter\myDump5.txt”

我看不到例程的名称,只有eax、ebx、mov和其他“非我的”函数(预处理器宏等)。即,在以下示例中,我们有汇编代码和函数名称:

.text:00403D89     lea eax, [ebp+SystemTimeAsFileTime]
.text:00403D8C     push eax
.text:00403D8D     call ds:__imp__GetSystemTimeAsFileTime@4
.text:00403D93     mov esi, [ebp+SystemTimeAsFileTime.dwHighDateTime]
.text:00403D96     xor esi, [ebp+SystemTimeAsFileTime.dwLowDateTime]
.text:00403D99     call ds:__imp__GetCurrentProcessId@0
.text:00403D9F     xor esi, eax
.text:00403DA1     call ds:__imp__GetCurrentThreadId@0
.text:00403DA7     xor esi, eax
.text:00403DA9     call ds:__imp__GetTickCount@0
.text:00403DAF     xor esi, eax
.text:00403DB1     lea eax, [ebp+PerformanceCount]
.text:00403DB4     push eax
.text:00403DB5     call ds:__imp__QueryPerformanceCounter@4
.text:00403DBB     mov eax, dword ptr [ebp+PerformanceCount+4]
.text:00403DBE     xor eax, dword ptr [ebp+PerformanceCount]
.text:00403DC1     xor esi, eax
.text:00403DC3     cmp esi, edi
.text:00403DC5     jnz short loc_403DCE
如果我的代码是:

#include <iostream>

int Foo(int,int){return 4;}

int main(){
    //std::cout<<"\n\nHello.\n\n"<<std::endl;

    int i=Foo(2,4);
    int a=i;
    //system("pause");
return 0;
}
#包括
intfoo(int,int){return 4;}
int main(){

//std::cout像
Foo
这样的名称不需要,也不包含在结果EXE中,因此在反汇编时不会显示-如果使用调试信息进行编译,则PDB和/或映射文件将包含此类信息。此外,像
Foo
这样的内部函数和从(系统)DLL-反汇编程序通常能够通过名称解析这些函数,同时需要“内部函数”的调试信息(系统)DLL-反汇编程序通常能够按名称解析这些函数,同时需要“内部函数”的调试信息。“汇编”意味着将一组人类可读的机器指令助记符转换为可加载和执行的实际二进制数据。类似地,“反汇编”意味着将二进制代码转换成一组人类可读的机器指令助记符,熟练的程序员可以读取并理解正在发生的事情

也许您正在考虑将一种高级编程语言“编译”成机器代码;与之相反的是一个假想的神奇的“反编译器”.一些反编译确实是可能的,工具也是存在的,但从一组编译的机器代码中可以恢复多少给定的高级语言总是有限制的,如果不深入理解编程的几个层次,无论如何都很难理解结果

<>一些语言(如C++或java)只编译成相当高级的中间语言,它更容易被反编译和读取,但是C++通常不这样使用,C++编译器通常会产生最低级别的硬件机器代码。意味着将一组人类可读的机器指令助记符转换为可加载和执行的实际二进制数据。类似地,“反汇编”意味着将二进制代码转换为一组人类可读的机器指令助记符,熟练的程序员可以读取和理解正在发生的事情

也许您正在考虑将一种高级编程语言“编译”成机器代码;与之相反的是一个假想的神奇的“反编译器”.一些反编译确实是可能的,工具也是存在的,但从一组编译的机器代码中可以恢复多少给定的高级语言总是有限制的,如果不深入理解编程的几个层次,无论如何都很难理解结果



<>一些语言(如C++或java)只编译成相当高级的中间语言,它更容易被反编译和读取,但是C++通常不这样使用,C++编译器通常会产生最低级别的硬件机器代码。
编译器正在内联吗?可能是foo被内联了吗?在main中,尝试“return foo(2,4);”以查看main是否返回4。这将证明是内联的。“你不能把汉堡变回牛。”不记得是谁说的,但在那个上下文中。可能是因为
foo()
编译器正在内联吗?可能是foo被内联了吗?在main中,尝试“return foo(2,4);”以查看main是否返回4。这将证明是内联的。“你不能将汉堡变回牛。”我不记得是谁说的,但是在那个上下文中。我正在使用dumpbin分解exe,请参阅我的说明。啊哈,好的,我理解,所以这里有这个信息,但它需要在阅读汇编时流利一些,谢谢。没问题,我很快就会读到它,这里有帮助:@cf16:不,很多高级信息在机器代码,因为它根本不存在。重建一个可能导致给定机器代码的高级结构需要大量的技能和专业知识。是的,我理解,就像阅读一些文本,但你不知道这是谁写的,因为他根本没有签名:D@cf16:的确如此。还有,imagiNE,你可以有几种完全不同的编程语言,它们都产生了相同的输出二进制。你怎么知道什么是?你能做的就是问自己“哪种C++结构可以产生这个机器代码?”我正在使用dumpbin解压exe,请参阅我的说明。啊哈,好的,我明白了,所以这里有此信息,但它需要在阅读汇编时有一定的流畅性,谢谢。没问题,我很快就会阅读它,这是帮助:@cf16:嗯,不,很多高级信息在机器代码中不可用,因为它根本不存在。它需要大量的技能和专业知识来重建可能导致给定机器代码的高级构造。是的,我理解,类似于阅读一些文本,但你不知道这是谁写的,因为他根本没有签名:D@cf16:的确如此。另外,想象一下,你可以有几个完全不同的程序所有的语言都产生相同的输出二进制。你怎么知道什么是?你能做的就是问自己“哪种C++结构可以产生这个机器代码?”“那么我怎么才能注意到,在没有这个PDB的情况下,代码究竟是在哪里开始处理的?”