如何在不实际运行可执行文件的情况下对其进行测试?
How do I test an executable without actually running it?
我想知道如何在不运行可执行文件的情况下测试可执行文件。
我正在尝试编写一个 returns 布尔值的函数,指示程序是否运行。
我遇到的问题是运行无法运行的程序会导致 windows 错误消息“16 位应用程序与此 64 位版本的 windows 不兼容”,这一点都不可取。
我需要有关如何修改我的代码以编程方式而不是手动方式跳过消息的建议(按“确定”关闭弹出窗口 window 太慢)。
我目前的代码:
try
{
Process.Start(exePath);
return true;
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
return false;
}
我预计此错误在 99.9% 的情况下都会出现,因为我的代码的目的是重复测试随机生成的可执行文件,直到其中一个有效。
假设 16 位程序永远不会 运行 您可以读取 exe header 并确定它是否是 PE 映像。如果不是,甚至不要尝试 运行 它。下面是一个 exe 文件的 hexdump。 0x3c 处的字节是 PE header 的偏移量。如果你再看那里,你应该看到 e0。现在在偏移量 e0 处,您会找到字母 'PE'.
00000000 4d 5a 90 00 03 00 00 00 04 00 00 00 ff ff 00 00 |MZ..............|
00000010 b8 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00 |........@.......|
00000020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000030 00 00 00 00 00 00 00 00 00 00 00 00 e0 00 00 00 |................|
00000040 0e 1f ba 0e 00 b4 09 cd 21 b8 01 4c cd 21 54 68 |........!..L.!Th|
00000050 69 73 20 70 72 6f 67 72 61 6d 20 63 61 6e 6e 6f |is program canno|
00000060 74 20 62 65 20 72 75 6e 20 69 6e 20 44 4f 53 20 |t be run in DOS |
00000070 6d 6f 64 65 2e 0d 0d 0a 24 00 00 00 00 00 00 00 |mode....$.......|
00000080 2e 1c ae 49 6a 7d c0 1a 6a 7d c0 1a 6a 7d c0 1a |...Ij}..j}..j}..|
00000090 6a 7d c1 1a e2 7d c0 1a 1c e0 bb 1a 65 7d c0 1a |j}...}......e}..|
000000a0 1c e0 bd 1a 6b 7d c0 1a 1c e0 ad 1a 77 7d c0 1a |....k}......w}..|
000000b0 a9 72 9e 1a 6b 7d c0 1a 1c e0 b8 1a 6b 7d c0 1a |.r..k}......k}..|
000000c0 52 69 63 68 6a 7d c0 1a 00 00 00 00 00 00 00 00 |Richj}..........|
000000d0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000000e0 50 45 00 00 64 86 04 00 30 04 ba 49 00 00 00 00 |PE..d...0..I....|
我想知道如何在不运行可执行文件的情况下测试可执行文件。
我正在尝试编写一个 returns 布尔值的函数,指示程序是否运行。
我遇到的问题是运行无法运行的程序会导致 windows 错误消息“16 位应用程序与此 64 位版本的 windows 不兼容”,这一点都不可取。
我需要有关如何修改我的代码以编程方式而不是手动方式跳过消息的建议(按“确定”关闭弹出窗口 window 太慢)。
我目前的代码:
try
{
Process.Start(exePath);
return true;
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
return false;
}
我预计此错误在 99.9% 的情况下都会出现,因为我的代码的目的是重复测试随机生成的可执行文件,直到其中一个有效。
假设 16 位程序永远不会 运行 您可以读取 exe header 并确定它是否是 PE 映像。如果不是,甚至不要尝试 运行 它。下面是一个 exe 文件的 hexdump。 0x3c 处的字节是 PE header 的偏移量。如果你再看那里,你应该看到 e0。现在在偏移量 e0 处,您会找到字母 'PE'.
00000000 4d 5a 90 00 03 00 00 00 04 00 00 00 ff ff 00 00 |MZ..............|
00000010 b8 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00 |........@.......|
00000020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000030 00 00 00 00 00 00 00 00 00 00 00 00 e0 00 00 00 |................|
00000040 0e 1f ba 0e 00 b4 09 cd 21 b8 01 4c cd 21 54 68 |........!..L.!Th|
00000050 69 73 20 70 72 6f 67 72 61 6d 20 63 61 6e 6e 6f |is program canno|
00000060 74 20 62 65 20 72 75 6e 20 69 6e 20 44 4f 53 20 |t be run in DOS |
00000070 6d 6f 64 65 2e 0d 0d 0a 24 00 00 00 00 00 00 00 |mode....$.......|
00000080 2e 1c ae 49 6a 7d c0 1a 6a 7d c0 1a 6a 7d c0 1a |...Ij}..j}..j}..|
00000090 6a 7d c1 1a e2 7d c0 1a 1c e0 bb 1a 65 7d c0 1a |j}...}......e}..|
000000a0 1c e0 bd 1a 6b 7d c0 1a 1c e0 ad 1a 77 7d c0 1a |....k}......w}..|
000000b0 a9 72 9e 1a 6b 7d c0 1a 1c e0 b8 1a 6b 7d c0 1a |.r..k}......k}..|
000000c0 52 69 63 68 6a 7d c0 1a 00 00 00 00 00 00 00 00 |Richj}..........|
000000d0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000000e0 50 45 00 00 64 86 04 00 30 04 ba 49 00 00 00 00 |PE..d...0..I....|