1.子系统
LNK2019错误,C28251警告,说明这个程序没有识别到main函数。原因是项目->属性->链接器->子系统应该选择窗口而不是控制台。
下面对子系统的说明写了:子系统的选择会影响链接器将选择的入口点符号或入口函数。
2.匈牙利命名法
可参考:https://blog.csdn.net/qq_44721831/article/details/98350315
3.__cdecl, __stdcall, __fastcall
函数的调用方式。在高级语言层次不容易看出区别,在汇编语言环境下可以很容易的看出区别。
(1)__stdcall(WINAPI就是__stdcall的宏定义),参数从右到左传,所以在汇编中看压栈的时候参数是从右到左压的,用时堆栈平衡由被调用者维持,即在返回前能看到retn xxx的操作,返回后没有操作。
(2)__cdecl,参数同样是从右到左,由调用者负责维持堆栈平衡,所以返回前看到的是retn,返回后有add esp, xxx的操作
(3)__fastcall,左边开始的两个不大于4字节(int)的参数分别放在ECX和EDX寄存器,其余的参数仍旧自右向左压栈传送。其他和stdcall一样。即就是说两个4字节参数以内就不用清栈了,因为没有压栈操作,多的按照__stdcall处理。因为寄存器比内存快很多,所以叫做fastcall
(4)__pascal ,和__stdcall的区别是从左往右传参,其余一样。
(写到这里想起了SPRC架构下的函数传参都是用的寄存器,同时是从左往右传的参数,不知道会不会比X86要快很多呢?)
自己写程序截图太麻烦,贴一个有图并且讲的很清楚的文章:https://www.cnblogs.com/yenyuloong/p/9626658.html
学逆向理解这些调用方式很重要,因为内嵌代码的时候需要保持堆栈平衡。