Windows小知识

1.vs创建项目类型错误

当创建新的应用程序时,不小心选择了错误的应用程序类型。例如,编程员可能创建一个新的 Wi n 3 2应用程序项目,但是创建了一个
进入点函数m a i n。当创建应用程序时,编程员会看到一个链接程序错误消息,因为 w i n 3 2应用
程序项目设置了/ S U B S Y S T E M : W I N D O W S链接程序开关,但是不存在WinMain或wWinMain函
数。这时,编程员可以有4个选择:
• 将main函数改为WinMain。通常这不是最佳的选择,因为编程员可能想要创建一个控制
台应用程序。
• 用Visual C++创建一个新的Win32 控制台应用程序,并将现有的源代码添加给新应用程
下载序项目。这个选项冗长而乏味,因为它好像是从头开始创建应用程序,而且必须删除原
始的应用程序文件。
• 单击 Project Settings 对话框的Link选项卡,将 / S U B S Y S T E M : W I N D O W S开关改为
/ S U B S Y S T E M : C O N S O L E。这是解决问题的一种比较容易的方法,很少有人知道他们只
需要进行这项操作就行了。
• 单击Project Settings对话框的L i n k选项卡,然后全部删除/SUBSYSTEM:WINDOWS开关。程序将根据代码中实现的函数进行操作。

2.程序基地址

PE是微软Win32环境可移植可执行文件(如exe、dll、vxd、sys和vdm等)的标准文件格式。

PE 文件格式把可执行文件分成若干个数据节(section),不同的资源被存放在不同的节中。
一个典型的 PE 文件中包含的节如下。
.text 由编译器产生,存放着二进制的机器代码,也是我们反汇编和调试的对象。
.data 初始化的数据块,如宏定义、全局变量、静态变量等。
.idata 可执行文件所使用的动态链接库等外来函数与文件的信息。
.rsrc 存放程序的资源,如图标、菜单等。
除此以外,还可能出现的节包括“.reloc”、“.edata”、“.tls”、“.rdata”等
Visual C++链接程序使用的默认基地址是 0 x 0 0 4 0 0 0 0 0,因为这是在运行Wi n d o w s
9 8时可执行文件的映象可以加载到的最低地址。可以改变应用程序加载到的基地址,方法是使
用M i c r o s o f t的链接程序中的/ B A S E : a d d r e s s链接程序开关。

根据基地址进行偏移找到.data,然后进行能找到调用.data的位置,进行软件破解。

3.Win程序进入点

4.Win中变量初始化

Win中如果变量类型是int和int数组、long和long数组、char和char数组等,如果未初始化默认0xcccccc...以cc向后填充

5.Windows系统函数常见宏

在Windows系统API中经常见到WINAPI、CALLBACK、WINAPIV等宏,其中大部分是__stdcall和__cdecl

 

(1)_cdecl c调用约定, 按从右至左的顺序压参数入栈,由调用者把参数弹出栈。对于传送参数的内存栈是由调用者来维护的(正因为如此,实现可变参数的函数只能使用该调用约定)。另外,在函数名修饰约定方面也有所不同。 _cdecl是C和C++程序的缺省调用方式。每一个调用它的函数都包含清空堆栈的代码,所以产生的可执行文件大小会比调用_stdcall函数的大。函数采用从右到左的压栈方式。VC将函数编译后会在函数名前面加上下划线前缀。是MFC缺省调用约定。
 
(2)__cdeclC/C++和MFC程序默认使用的调用约定。采用__cdecl约定时,函数参数按照从右到左的顺序入栈,并且由调用函数者把参数弹出栈以清理堆栈。因此,实现可变参数的函数只能使用该调用约定。由于每一个使用__cdecl约定的函数都要包含清理堆栈的代码,所以产生的可执行文件大小会比较大。__cdecl可以写成_cdecl。 
 
告诉你个小秘密:前面下划线越多,就越不标准!嘿嘿~
By https://zhidao.baidu.com/question/513493889.html
__cdeclC/C++和MFC程序默认使用的调用约定。采用__cdecl约定时,函数参数按照从右到左的顺序入栈,并且由调用函数者把参数弹出栈以清理堆栈。因此,实现可变参数的函数只能使用该调用约定。由于每一个使用__cdecl约定的函数都要包含清理堆栈的代码,所以产生的可执行文件大小会比较大。__cdecl可以写成_cdecl。 
 
告诉你个小秘密:前面下划线越多,就越不标准!嘿嘿~
By https://zhidao.baidu.com/question/513493889.html

__stdcall代表:参数从右向左压入堆栈,函数被调用者修改堆栈,函数名(在编译器这个层次)自动加前导的下划线,后面紧跟一个@符号,其后紧跟着参数的尺寸;

6.所有的Unicode函数均以wcs开头, wcs是宽字符串的英文缩写。若要调用Unicode函数,只需用前缀wcs来取代ANSI字符串函数的前缀str即可。

如strcat与wcscat

持续更新中......

 

 

参考资料:

《windows核心编程(第五版)》

《0day安全软件漏洞分析技术(第二版)》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值