> "C:\users\piter\myDump5.txt" 我看不到例程的名称,只能看到 e-6ren">
gpt4 book ai didi

c++ - 组装拆卸

转载 作者:行者123 更新时间:2023-11-27 23:24:20 24 4
gpt4 key购买 nike

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

dumpbin/disasm "C:\simple_Win32.exe">> "C:\users\piter\myDump5.txt"

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

.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;
}

为什么我无法在由此代码 exe 生成的转储程序集中找到 Foo?
我应该能在那里找到名字 Foo 吗?

最佳答案

“汇编”是指将一组人类可读的机器指令助记符转换为可以加载和执行的实际二进制数据。同样,“反汇编”意味着将二进制代码转换为一组人类可读的机器指令助记符,熟练的程序员可以阅读并理解正在发生的事情。

也许您正在考虑将一种高级编程语言“编译”成机器代码;与之相反的是一个假设的神奇“反编译器”。一些反编译确实是可能的并且工具存在,但是从一组编译的机器代码中恢复任何给定的高级语言的数量总是有限制的,如果没有对多层编程的深入理解,这将很难在任何情况下都能理解结果。

有些语言(如 C# 或 Java)只能编译成相当高级的中间语言,这更容易反编译和阅读,但 C++ 通常不会以这种方式使用,C++ 编译器通常产生最低-级硬件机器码。

关于c++ - 组装拆卸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10472686/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com