2023年9月

最近在编程C++是遇到一个warming,内容为:数组地址 == NULL,恒为假
我蛮疑惑的,因为我理解中,一个地址指向NULL是很平常的事情。

C++的中NULL

在C语言与C++中,对于NULL,其实是不同的,

#ifndef NULL
    #ifdef __cplusplus
        #define NULL 0
    #else
        #define NULL ((void *)0)
    #endif
#endif

可以看出来,C语言中,NULL是指向地址0,而在C++中,NULL指向数字0
所以,我们常常在释放指针变量之后,将其赋予NULL,

int *a = (int)malloc(sizeof(int));
*a = 5;
free(a);
a = NULL;

其本质就是该指针指向地址0。

C++的数组

C++的数据,本质就是在一个整体内存空间存储一定数据的数据结构;而与之对应的链表,是在随机分散的内存空间存储数据的数据结构。
而其数据名,就是指向该数组的头指针。

int a[5] = {0};
if (a == *a[0]) {
    cout << "True" << endl;
}

以上代码的最终结果,会输出True
那么作为一个固定内存空间内的数据存储结构,其地址应当是固定的,结果也确实如此。

int a[5] = {0};
a = NULL;

该代码会提示错误,显示左侧应该为一个变量。
而实际上,数组名所代表的地址,就是一个常量,在初始化之后就不能再变更。

解释原因

因此,当在初始化数组之前,肯定不能使为初始化的数据地址与NULL进行比较
而,当数组被初始化之后,其数组名,数组指针就已经是个不等于0的常量
故此,数组地址 == NULL,恒为假。

使用到git commit –amend

经过以下命令:

git pull
git add .
git commit --amend

在暂存区中,存在上一次提交的修改代码,于我所期望不同

所以查询了解git commit –amend的具体细节

git

git是一个免费开源的分布式版本控制系统,被设计用于快捷高效地处理从小到大的项目。[1]

能够应用于代码仓管理,例如github、gitlib、gitea等等。

git commit

git commit——记录对于存储库的更改

创建一个新的提交,其中包含对当前内容的索引和给予描述更改内容的日志消息。[2]

git commit –amend

通过创建一个新的提交来替换当前分支的tip(感觉可以翻译成提交对象,commit object)。

并且当未指定其他tip时,使用原始提交的备注信息作为起点。

可以粗暴的等效为:

git reset --soft HEAD</sup>
... do something else to come up with the right tree ...
git commit -c ORIG_HEAD

但是通常被使用去修正一个合入提交。[2]

由此,知道使用git commit –amend确实存在版本回退的现象,

且了解其正确使用方法应该是:

git commit -m xx
git add forgottenFiles
git commit --amend

其作用也并不是正常提交,而是去修正之前合入提交信息。

参考
[1] https://git-scm.com/
[2] https://git-scm.com/docs/git-commit

本文记录第一次使用x64dbg破解Sublime Text 4,具体流程是按照吾爱破解的文章[1]进行。

由于是参考文章的复现,因此,本文记录简单一些,如果希望了解具体过程,可以参考原文。

找到重要标志文本

安装Sublime Text 4,或者下载解压便携版程序,到已经路径下。

选中应用程序sublime_text.exe,右键,点击“用x64dbg调试”。

点击菜单栏的运行,使程序运行。

在关于中,可以看到字符串“Unregistered”,以此作为标志文本。

image.png

找到关键地址

在反汇编区域中,右键,搜索字符串“Unregistered”。

image.png
image.png

选中,右键,点击“在反汇编中转到”。

image.png

可以在上文,找到关键字符串“Unregistered”,以及在上面部分位置可以看到字符串“Registered to”,根据之前学习的汇编代码可知,需要改变此前的跳转,而本文可以看到,关键跳转为

cmp byte ptr ds:[rsi+5],0
je sublime_text.7FF6D7D558D1

以上汇编的代码意为,比较寄存器中rsi的第六位与0是否相等,若相等则跳转,反之则不跳转。

若只是想修改关于处的文本,可以选择修改跳转语句,使之反向即可。

参考的原文,在该处提前修改rsi寄存器中的值。

设置断点,确定寄存器中值的地址

cmp byte ptr ds:[rsi+5],0

,处设置断点。

image.png

再点击关于,可以使程序运行到该断点处停下,可以在右侧的FPU看到RSI寄存器的地址。

image.png

右键,点击“在内存窗口中传到”,此处,应该提前在call一行设置断点,然后修改寄存器中的值,但为了记录方便,进行下一步操作。

在内存窗口中,右键设置断点,在不同版本中所需的断点设置不同,在原文中,只需要设置1个字节,但本人所涉及4152,需要设置8个字节。

image.png

运行程序,使用不同页面切换,会检查该符号位的方式,通过修改内存,强行赋值的方法,破解该程序。将之前的反汇编区域中的断点删除,运行之后,在以下地址暂停。

image.png

首先是检查更新,由于4152是当前最新版本,因此跳过。

image.png

在该位置,修改反汇编代码,为以下内容:

mov byte ptr ds:[rax+5],0
text rcx,rcx

即可,得到注册之后的Sublime Text 4。右键,补丁,即可。

image.png

参考

[1] https://www.52pojie.cn/thread-1468154-1-1.html