如果連到這篇 blog 的原因,是 visucal c++ 裡面出現 

error LNK2019:無法解析的外部符號 _WinMain@16 在函式 ___tmainCRTStartup 中被參考

代表專案選錯了,再去上網查正確的專案選項為何。

 

這裡講的「找不到 main」,是 coder 故意弄得他人找不到函式入口在哪裡,

但實際上它是存在的,妙的是有些方式在 VC IDE 或 VAX 下也找不到 main,

特別是程式碼一大、眼一花,真的不好找出 main 在哪。

有時此技巧也被拿來對付一些要作業的有心人,炫技成份居多。

 

故意讓人找不到 main 不是個好習慣,最常用來被使用,就是不希望別人能一眼看穿程式碼在寫什麼,

不知為何,明明執行效率一樣,增加了 pre-process 負擔,但有人就覺得比較強,

關鍵處點破便不值錢,簡易程式碼範例如下,可得到一些蛛絲馬跡,

再經過 search 後應可豁然開朗。

 

#include <stdio.h>
#define edison(a,b)   a##ai##b##()
#define edisonx(a,b)  edison(a,b)
int edisonx(a,c);
int edisonx(b,d);
int edisonx(m,n);
int last_func();

int edisonx(a,c)
{
    printf("from edisonx ac\n");
    edisonx(b,d);
    return 0;
}


int edisonx(m,n)
{
    printf("from edisonx mn");
    edisonx(a,c);
    return 0;
}

int edisonx(b,d)
{
    printf("from edisonx bd\n");
    last_func();
    return 0;
}

int last_func()
{
    printf("from last func\n");
    return 0;
}

 

複雜可以寫到很複雜,連 int main(int argc, char **argv)

這種都可以藏起來。

試試看,在 Outline 裡面應該只看得到 edisonx( x,x) 及 last_func 之函式,

這點在 VC 、VAX、PSPad 試都一樣 ,

相信其他的 IDE 也都一樣,主要是判別規則問題,且相信任何 IDE 均如此。

 

真正讓人找不到函式入口點的,應是 MFC 裡面之 WinApp,

因其被隱含建構時喚起。也鑑於 C++ 這種特性,於是又有這種 code 出現

 

#include <stdio.h>
#include <stdlib.h>
#define edison(a,b)   a##ai##b##()
#define edisonx(a,b)  edison(a,b)
int edisonx(a,c);
int edisonx(b,d);
int edisonx(m,n);

int edisonx(a,c)
{
    printf("hello, world!!");
    exit(1);
    return 0;
}


int edisonx(m,n)
{
    printf("hello, world!!");
    exit(1);
    return 0;
}

int edisonx(b,d)
{
    printf("hello, world!!");
    exit(1);
    return 0;
}
int v1 = edisonx(a,c);
int v2 = edisonx(m,n);
int v3 = edisonx(b,d);

 

 

這還只是放在單一檔案而已,若是拆多個檔案編譯,

放這種地雷即使用 vc 單步 trace 也找不到入口點。

幸運的話,將每個 function 都設斷點還有機會可以找到入口點在哪,

簡而言之,是貍貓換太子,即使找到 main 修改程式碼,也是假的。

 

edisonx 發表在 痞客邦 PIXNET 留言(0) 人氣()