如何在不实际运行的情况下测试可执行文件?

时间:2015-01-08 00:40:57

标签: c# .net

我想知道如何在不运行可执行文件的情况下测试可执行文件。

我正在尝试编写一个返回布尔值的函数,指示程序是否会运行。

我遇到的问题是运行一个无法运行的程序会导致Windows错误消息" 16位应用程序与这个64位版本的Windows"不兼容,这根本不存在合乎需要的。

我需要建议如何修改我的代码以编程方式而不是手动跳过消息(按“确定”关闭弹出窗口太慢)。

我的代码:

        try
        {
            Process.Start(exePath);
            return true;
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.ToString());
            return false;
        }

我希望这个错误出现99.9%的时间,因为我的代码的目的是反复测试随机生成的可执行文件,直到其中一个可用。

1 个答案:

答案 0 :(得分:1)

假设16位程序永远不会运行,您可以读取exe标头并确定它是否是PE映像。如果不是,甚至不试图运行它。下面是exe文件的hexdump。 0x3c处的字节是PE头的偏移量。如果你那么看那里你应该看到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....|