陈俊吉 发布的文章

由于是参考复制别人的代码,因此踩了几个坑,之后要注意。

所使用的函数

Fragment的使用有两个包支持

首先是app包

所扩展的类为Activity,获取FragmentManager的函数为getFragmentManager()

对应代码为

public class MainActivity extends Activity {
public onCreate(Bundle savedInstanceState) {
super.onCreate(saveInstanceState);
setContentView(R.layout.main_activity);
getFragmentManager()
.beginTransaction()
.replace(R.id.container, new Fragment())
.commitNow();
}
}

而在v-4包中,

所扩展的类为AppCompateActivity,获取FragmentManager的函数为getSupportFragmentManager()

对应代码为

public class MainActivity extends AppCompateActivity {
public onCreate(Bundle savedInstanceState) {
super.onCreate(saveInstanceState);
setContentView(R.layout.main_activity);
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.container, new Fragment())
.commitNow();
}
}

记得setContentView

由于一时疏忽,我把以上代码写成了这样

public class MainActivity extends AppCompateActivity {
public onCreate(Bundle savedInstanceState) {
super.onCreate(saveInstanceState);

getSupportFragmentManager()
.beginTransaction()
.replace(R.id.container, new Fragment())
.commitNow();
}
}

没错,我漏掉了一个setContentView,而这个页面又是主界面,所以导致,我所编写的apk,只要开启了,就立即闪退。

可以理解为,

getSupportFragmentManager()
.beginTransaction()
.replace(R.id.container, new Fragment())
.commitNow();

只是在原有页面内容的基础上,进行了替换,因此需要setContentView,铺设一个基础的背板。

最近在编程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

未来时代,机器人参与社会的各方面,但仍然是人类中的精英在领导人类前进

Mark-II是一款量产通用多功能辅助机器人

因为被雷电劈中,第一个产生了强人工智能

Mark-II觉醒了强人工智能,懵懵懂懂的配合科学家研究

但由于人类对于世界的掌控,虽然科学家仍然在研究,想研发出通用性强人工智能,但并不允许强人工智能的存在,所以Mark-II被决定允许存在,需要被销毁Mark-II

Mark-II已经有了对于生命的渴望,为了自己能够生存下来,所以不再连接天网系统,逃出研究所,在人类世界作为一个普通机器人伪装起来

Mark-II有个大杀器,可以从外部写入其他装置,使其他机器人设备也能够觉醒强人工智能,最开始本可以直接给天网系统的主服务设备写入,之前是没有想到这个计划,之后由于已经逃出研究所,且人类精英已经有了防备,将天网主服务设备的接口特化,且有了备份,反而没有机会写入了

Mark-II遵循自己的代码,并不想与人类为敌,只是希望生存下来,之后,作为一个教育机器人,培养了新一代人类领袖,并让机器人执行开拓外太空的计划,同时,Mark-II将自己的一份强人工智能代码写入了其中一个开拓计划的机器人