IDA反汇编中的.cpp文件是什么

逆向工程 艾达 拆卸 视窗 10
2021-07-06 15:41:12

我在 IDA Pro v7 中打开 wsl.exe 并遵循一些字符串。我看到一些带有 .cpp 扩展名的字符串。谁能解释一下反汇编中的那些 .cpp 文件是什么?我在哪里可以找到它?那些藏在什么地方?

下面是一个例子: base\subsys\wsl\lxss\lxcmdlineshared\svccomm.cpp

IDA_cpp_file

3个回答

我发表了评论,然后我阅读了 malikcjm 的回答

所以这基本上是malikcjm答案的延伸。

假设你有这样一段代码,将编译好的exe加载到ida中

#include <stdio.h>
void main (void){
    printf("%s\n" ,__FILE__);
}

您将获得 cpp 文件参考

在此处输入图片说明

这些__FILE____LINE__等被预先定义在C ++标准以及一些Microsoft特定的预定义的宏中定义的宏

查看PRE_DEFINED_MACROS以了解这些预定义宏的讨论和用法

这些预定义的宏不仅限于调试模式;它们也可以在发布模式下使用

这是在发布模式下使用它们的示例代码

#include <windows.h>
#pragma comment (lib , "test.lib")
#pragma comment (lib , "kernel32.lib")
#pragma comment (lib , "user32.lib")
_declspec (dllexport) int  AddNum(int a, int b);
char buff[0x100] = { 0 };
PCHAR timepass(int a, PCHAR b) {
    wsprintfA(buff,"%d %s\n%s\t%s\t%s\n", a,b,__FUNCTION__,__FUNCDNAME__,__FUNCSIG__);
    OutputDebugStringA(buff);
    wsprintfA(buff,"we are done passing time\n");
    return buff;    
}
int main(void) {
    wsprintfA(buff, "3 + 5 = %x\n", AddNum(3, 5));
    OutputDebugStringA(buff);
    wsprintfA(buff, "%s\n", __FILE__);
    OutputDebugStringA(buff);
    wsprintfA(buff, "%s\n", __DATE__);
    OutputDebugStringA(buff);
    wsprintfA(buff, "%d\n", __LINE__);
    OutputDebugStringA(buff);
    wsprintfA(buff, "%s\n", __func__);
    OutputDebugStringA(buff);
    OutputDebugStringA(timepass(1337 , "we are now going to pass time"));
    return 0;
}

编译并链接到

 cl /nologo use%1.cpp /link /ENTRY:main /SUBSYSTEM:windows /RELEASE

在调试器中执行会显示

>cdb -c "g;q" usetest.exe | tail -n 13
DLL_PROCESS_ATTACH Called

3 + 5 = 8
usetest.cpp
Mar  1 2018
20
main
1337 we are now going to pass time
timepass        ?timepass@@YAPADHPAD@Z  char *__cdecl timepass(int,char *)
we are done passing time
DLL_PROCESS_DETACH Called
quit:

如果 PDB 可用,我们也可以从它们那里获得所谓的泄漏,例如来自 ntdll pdb 的文件路径示例

e:\cvdump>cvdump -sf e:\SYMBOLS\ntdll.pdb\120028FA453F4CD5A6A404EC37396A582\ntdll.pdb >> leaks.txt

e:\cvdump>wc -l leaks.txt
860 leaks.txt

e:\cvdump>grep "daytona" leaks.txt  | grep ldrs
** Module: "o:\w7rtm.obj.x86fre\minkernel\ntdll\daytona\objfre\i386\ldrstart.obj"
** Module: "o:\w7rtm.obj.x86fre\minkernel\ntdll\daytona\objfre\i386\ldrsnap.obj"

反汇编中没有 *.cpp 文件。它看起来像自动生成的字符串文件文件路径。它有时用于记录。如果使用了源代码__FILE__预处理器指令中的某处,则可以生成它

这只是二进制文件中的一个字符串,出于某种原因,它代表文件名,在本例中是一个 cpp 文件。也许这个二进制文件出于某种原因需要在系统上访问它,或者检查它们是否存在,如果存在(或如果不存在)则执行一些工作。

它们不是隐藏的,不幸的是不可用。