首页
论坛
专栏
课程

[原创]浅谈编码与内存----自我总结与经验分享

ISSACASSI 2018-7-9 03:11 2401
开一篇讲下学C/C++以来的感触与一些心得。以帮助初学者提升以及帮助自己整理思路。文中若有不对的地方,望指正,提出讨论,谢谢。
总而言之,虽然在学习过程中都会含糊不清,到后面慢慢习惯以为就是这样的,不过仔细纠下还是有些东西。

文主要关于内存的,我认为学习C/C++最重要的是弄懂内存。基本上都是较直观的方式表达。这里仅仅从一些实例中来说明,可能有些观点以及操作有悖于常规板书,但是如果这些操作从内存角度来看的话,都是没问题的。往往从学习时候就奉书本,编程习惯为最上,反正忽视了很多东西,其实C++规则一直在变动,唯一不变的就是内存规则这个根基。

黑鸡生的都是白蛋。语言语法再变化,也是只有一个目的操作内存。
“不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。”


首先,内存是什么?

从有计算机开始就有内存了。编写程序,几乎无时无刻不在使用内存,我们使用变量,调用函数,申请空间存放我们的数据,都是在对内存进行操作。

我自己观念里给内存下了一些定义,意在便于理解新情况,自我总结。
在纵观整个内存的情况下,内存最重要的一个属性基本上就是权限,简单说就是是否有权限可读可写可执行。各种漏洞都是在突破这一点。
举个例子之所以需要注入就是为了获得那段内存的一个读写权限,由于用户内存进程内存保护的问题,假如均可以读写修改,那么也用不到注入、上驱动等等操作了。管理员权限用户权限就是需要改动的内存需要权限,这样的操作“允许程序以管理员运行”就是授权给进程这个权限去操作相关内存。

好了~太大的话题不说了,这个话题再说下去可能装13就要失败了~从编程需要的开始吧。仅仅看单个程序的内存。
研究程序代码与内存的关系还是要从实际来~深入浅出。一点点开始掰吧。

类型与空间占用

第一段
我们先百度

包括书上也有说,int和long,或者说DOWRD是区别的,实际上呢?
我们验证下,
上例子,

然后在32位下看内存,

可以看到都是四字节~所以这个百度的回答错误(这条回答后面有人评论了不过也不直观)。long也就是DWORD的空间不比int大,都是一样的,我的环境是WIN10-64位,但是这里无论WIN7还是WIN10,64位32位都是这样结果。上图还显示了地址,这个是32位程序。
然后再百度,又有人说64位下long是8字节,比int大,那么要不要信呢?我们还是实践出真知。

这里是编译成64位的程序,均为四字节,所以关于这个问题,百度一大堆模糊的答案。自己实践才是真的。
不过这东西大小是由编译器喜好决定的。编译出文件这里放在EXE中的,所以不会环境影响,但是当你做new的时候,才会受到系统环境的影响。

第二段
很多初学者在看代码的时候会遇到很多没见过的数据类型,不过其实他们本质一般都是一个int的4字节而已。类型名字不同仅仅是为了方便阅读,EXE运行时候不会受到类型名字不同的影响。

void*还是万能啊~

这里我在实践中,总结了一个自己的看法,一切都是指针,无论是函数,或者常量,变量,堆区栈区数据。从内存角度来说,刻意定义一个指针或者不是刻意的,都是在做指针操作的工作,而指针对我而言就是一个四字节的存储单位。


这里把int_num看作int*,对char*进行操作,然后又把 int_num看作字符串去打印。 int_num 你认为他是什么他就是什么。
通过这个例子要说明的是不要拘泥于规则,但是假如学二进制或者写马啊逆向破解等等,要学会从内存角度看,
char*是一个四字节,句柄类型是四字节,int也是四字节,从内存角度他们没有任何区别,只要是四字节用什么类型名字随意决定。然后(xxxx)强转给编译器看,倒是不是说实际写码都这么写,只是要明白原理。

再来个更直观实用的例子,

这是网上copy的获取当前进程实用内存的情况。

看下pmc的类型结构改成shellcode,

改写为shellcode来演示。
typedef BOOL(WINAPI *g_GetProcessMemoryInfo)(DWORD, DWORD*, DWORD);
//依照刚才看法,定义就这么就好了~不必全按照他的,后面写着还麻烦,这样也就不需要去重载他的特殊的类型
//PROCESS_MEMORY_COUNTERS结构体就当做一个指针好了,DWORD*就OK
g_GetProcessMemoryInfo fGetProcessMemoryInfo;
	……(这里去k32寻址什么的不放代码了)
DWORD pmc[10];//之前看了就是10个int,所以这么定了
fGetProcessMemoryInfo(-1, pmc,sizeof(pmc));
//最后结果是正确的

规矩固然重要,不过明白原理才知道规矩的意义~盲目死背规矩不明白规矩的意义那就是死读书了。

篇幅有点长了~暂告一段落以后再写~
多说个小插曲,最后一个例子有一个小用处…不过这个方法还是挺多的。这里仅仅是类似360沙盒这种。
if ((int)((float)pmc[3] / (float) pmc [8] - 3))//测试下来市面上几款软件,Sandboxie等等的都OK
	{
		MessageBoxA(0, 0, "正常环境", 0);
	}
	else
	{
		MessageBoxA(0, 0, "沙____箱中", 0);
		exit(0);
	}

感兴趣小伙伴可以群里183746493交流交流~~


[防守篇]2018看雪.TSRC CTF 挑战赛(团队赛)11月1日征题开启!

最后于 2018-7-9 10:38 被ISSACASSI编辑 ,原因:
本主题帖已收到 1 次赞赏,累计¥2.00
最新回复 (16)
junkboy 2018-7-9 07:30
2

0

谢谢分享
图片挂了不少
乌鸡蛋是绿色的,哈哈哈
寧靜致遠 2018-7-9 09:01
3

0

赵四老师名言。
kanxue 8 2018-7-9 10:27
4

0

图片没帖上来,麻烦重新帖一下。
最后于 2018-7-9 10:27 被kanxue编辑 ,原因:
ISSACASSI 2018-7-9 10:40
5

0

kanxue 图片没帖上来,麻烦重新帖一下。
OK了~
ISSACASSI 2018-7-9 10:40
6

0

寧靜致遠 赵四老师名言。
虽然他…emmmm~~但是有些话说的还是有道理~~
FadeTrack 1 2018-7-9 11:18
7

0

已删
最后于 2018-7-9 11:50 被FadeTrack编辑 ,原因: 毫无意义
ISSACASSI 2018-7-9 11:22
8

0

FadeTrack 你以为自己逃得出五指山。只能说对于语言理解还是不够深刻,加油吧。[em_13]
好的~
最后于 2018-7-9 12:20 被ISSACASSI编辑 ,原因:
万剑归宗 1 2018-7-9 11:23
9

0

这不是基础知识吗?
有什么亮点?
ISSACASSI 2018-7-9 11:31
10

0

万剑归宗 这不是基础知识吗? 有什么亮点?[em_10]
emmmm~
最后于 2018-7-9 13:18 被ISSACASSI编辑 ,原因:
endlif 2018-7-9 16:58
11

0

上面说的看内存是用啥看的?
shayi 8 2018-7-9 17:21
12

0

任何人对于内存的需求都不会超过 640 KBytes 


来看下真实世界中的内存(DDR-DRAM),图片来自网络。


DDR3 与 DDR4 内存条背面布局比较:


 

DDR3 与 DDR4 内存各种性能参数比较:




最后于 2018-7-9 17:35 被shayi编辑 ,原因:
严启真 2018-7-9 17:44
13

0

内存,内存,最神秘,最重要的东西
shayi 8 2018-7-9 18:02
14

0

endlif 上面说的看内存是用啥看的?
任何 16 进制编辑器,动态调试器,反汇编器,都可以看;ReadProcessMemory() API 也可以 “看”
ISSACASSI 2018-7-9 19:03
15

0

endlif 上面说的看内存是用啥看的?
我直接拿CE看的……接地气,WinHex也常用…工具挺多的
Diabloking 2018-7-10 12:48
16

0

你这叫学结构体内存布局, 不叫学C++
OD跟一下比你VS上看要清楚很多
最后于 2018-7-10 12:49 被Diabloking编辑 ,原因:
wx_职业玩家 2018-8-24 03:53
17

0

汇编操作内存 哪种比较猥琐 不容易被找到操作内存的代码位置
返回