首页 文章 精选 留言 我的

精选列表

搜索[表单设计器],共10000篇文章
优秀的个人博客,低调大师

Kaseya从“受信任第三方”获得勒索软件解密器

Kaseya公司本月早些时候遭受大规模勒索软件攻击,目前该公司已获得解密密钥,但该公司拒绝透露细节,只是声称来自“受信任的第三方”。 这家IT管理软件供应商在7月2日披露了一次供应链攻击,该攻击损害了其大约60名托管服务提供商(MSP)客户和多达1,500个MSP客户端。勒索软件团伙REvil利用了Kaseya端点管理和网络监控产品VSA中的零日漏洞,并利用这些漏洞发送恶意更新,从而促成了大规模勒索软件攻击。 NBC新闻记者Kevin Collier在推特上表示,Kaseya在最初攻击发生19天后已经“从受信任的第三方”获得了解密密钥,并且正在与客户合作解决问题。 Kaseya发言人在给SearchSecurity的一封电子邮件中证实,Kaseya已从未具名的第三方那里获得了密钥,并且“在经过验证后,我们立即开始与客户展开合作。”该发言人拒绝回答有关解密密钥是否涉及Kaseya支付赎金或第三方代表他们支付赎金的问题,也拒绝回答他们是否可以分享有关第三方的任何其他信息;该发言人提及出于“保密原因”。 在攻击发生后,Kaseya努力让VSA重新上线。部分是由于恢复过程,部分是为了在重新启动之前加强产品的安全性,该供应商错过了计划于7月7日进行重新部署的时间窗口,最终于7月11日重新发布了VSA以及本地和SaaS补丁。Kaseya公司首席执行官Fred Voccola称这次延迟“可能是我职业生涯中最艰难的决定。” Kaseya的攻击信息页面上提供了完整的更新历史记录。

优秀的个人博客,低调大师

code-server 3.11.0 发布,在远程服务器上运行 Visual Studio Code

code-server 3.11.0现已发布,具体更新内容如下: VS Code v1.57.1 code-server 将所有用户数据保存在~/.local/share/code-server中,以便在两次安装之间保留这些数据。 New Features feat(vscode):升级到版本 1.57.1#3544 Bug 修复 修复反向代理后面的注销 修复使用 base path 时的注销问题 (#3608)#3611 Documentation 进行了大量重组以使其更易于参考,以及一些新信息。 docs:添加 Pomerium#3424 docs:修复拉取请求部分中令人困惑的句子#3460 docs:从更新日志中删除 toc docs(MAINTAINING):添加有关 CHANGELOG 的信息#3467 docs:将发布过程移至 MAINTAINING.md#3441 docs:从 guide.md格式化“Caddy” Development 移至 Node v14,使用 Argon2 进行 pw 散列和 CI 工作 chore:使用 buildx 交叉编译 docker 镜像#3166 chore:将node更新到 v14#3458 chore:更新 .gitignore#3557 修复:对 password hash 使用足够的计算量#3422 docs(CONTRIBUTING):添加关于测试的部分#3629 Development fix(publish):更新 brew-bump.sh 中的 cdrci fork#3468 chore(dev):从 parcel中迁移#3578 更新说明:https://github.com/cdr/code-server/releases/tag/v3.11.0

优秀的个人博客,低调大师

【工欲善其事,必先利其器】之gdb五大高级用法

本篇文章讲解gdb的一些高级用法,在我们的开发生涯中,调试是很重要的技能,而在linux下开发,最常用的调试工具就是gdb了,所以这里介绍几种gdb比较高级的用法,助力我们的调试技能。 还是先看下思维导图: ![gdb中5种高级用法.png](https://s2.51cto.com/images/20210706/1625538739655317.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=) #### 1. gdb怎么调试多线程 gdb调试多线程时,默认情况下是所有线程同时都在执行,但是假设我们想只有一个线程继续执行,其他线程都暂停呢?下面就来看一看该怎么实现这个功能。 有这么一段多线程代码,如下: ```cpp //test.cpp #include #include #include void *print1_msg(void *arg) { while(1) { printf("print1_msg\n"); usleep(100); } } void *print2_msg(void *arg) { while(1) { printf("print2_msg\n"); usleep(100); } } int main() { pthread_t id1, id2; pthread_create(&id1, NULL, print1_msg, NULL); pthread_create(&id2, NULL, print2_msg, NULL); pthread_join(id1, NULL); //使主线程等待该线程结束后才结束,否则主线程很快结束,该线程没有机会执行 pthread_join(id2, NULL); return 0; } ``` 假设我们因为线上的问题,然后想要程序只执行线程函数`print1_msg`,但不能修改代码,那要怎么办呢? 首先我们使用`g++ -g test.cpp -l pthread -o test`生成可执行文件,然后使用`gdb ./test`进入gdb模式,如下: ```shell (gdb) b test.cpp:28 #b就是break,打断点 Breakpoint 1 at 0x40074e: file test.cpp, line 28. (gdb) r #r即run,运行程序 Starting program: /root/test [Thread debugging using libthread_db enabled] Using host libthread_db library "/lib64/libthread_db.so.1". [New Thread 0x40a00940 (LWP 26623)] print1_msg [New Thread 0x41401940 (LWP 26624)] Thread 1 hit Breakpoint 1, main () at test.cpp:28 28 pthread_join(id1, NULL); //使主线程等待该线程结束后才结束,否则主线程很快结束,该线程没有机会执行 (gdb) info thread #显示当前进程的所有线程,第1号线程就是进程自身 Id Target Id Frame * 1 Thread 0x2aaaaae794d0 (LWP 26619) main () at test.cpp:28 2 Thread 0x40a00940 (LWP 26623) 0x00000036f289a901 in nanosleep () from /lib64/libc.so.6 3 Thread 0x41401940 (LWP 26624) 0x00000036f28d4971 in clone () from /lib64/libc.so.6 (gdb) thread 2 #进入序号为2的线程 [Switching to thread 2 (Thread 0x40a00940 (LWP 26623))] #0 0x00000036f289a901 in nanosleep () from /lib64/libc.so.6 (gdb) set scheduler-locking on #只有当前被调试线程会执行 (gdb) c Continuing. print1_msg print1_msg print1_msg print1_msg print1_msg ``` 大家可以看看注释,这样一番操作以后,实际上就只有第一个线程在执行了,此时如果执行gdb命令`set scheduler-locking off`就会继续执行所有线程了。 下面介绍一下多线程调试中会比较多用到的gdb命令: | gdb命令 | 命令的作用 | | -------------------------- | ------------------------------------------------------------ | | info thread | 显示当前进程的所有线程,第一列代表线程序号,第1号线程就是进程自身,序号前面带*的就是当前正在执行的线程 | | thread id | id代表线程序号,比如thread 2就是表示进入2号线程 | | set scheduler-locking on | 设置该命令后,表示只有当前线程会被执行,其他线程相当于被锁住,会暂停 | | set scheduler-locking off | 不锁定任何线程,设置该命令后,表示所有线程都会被执行,也是gdb的默认值 | | set scheduler-locking step | 单步执行当前线程时,其他线程不会被执行,但此模式下不能执行continue、finish、until命令,一旦执行,那么其他线程都会被唤醒 | | show scheduler-locking | 显示当前scheduler-locking的状态 | | thread apply 1 2 command | 让线程序号为1和2的线程执行某个gdb命令,其中的command是gdb命令,比如thread apply 1 2 info local,让序号为1和2的线程打印出所有局部变量 | | thread apply all command | command是gdb命令,让所有线程执行某个gdb命令 | #### 2. gdb怎么调试多进程 gdb调试多进程时最常用的是两个属性:follow-fork-mode和detach-on-fork,分别使用`set follow-fork-mode parent|child`和`set detach-on-fork on|off`这样的形式来进行设置,一般来讲,这两个命令是联合起来起作用的,下面就介绍一下他们的作用,如下: | follow-fork-mode | detach-on-fork | 说明 | | ---------------- | -------------- | ------------------------------------------------------------ | | parent | on | 此种场景是gdb默认场景,表明gdb此时只调试父进程,包括打断点等都只对父进程起作用,子进程就继续运行,此时gdb不控制子进程 | | parent | off | 此种场景下gdb同时控制父子进程,父进程可以正常调试,但子进程被gdb设置为暂停状态,不会继续执行 | | child | on | 此种场景下gdb只控制子进程,gdb的所有命令都只对子进程起作用,父进程会继续运行 | | child | off | 此种场景下gdb同时控制父子进程,子进程可以正常调试,但父进程被gdb设置为暂停状态,不会继续执行 | 此外还有一些其他调试多进程会用到的命令,如下: | gdb命令 | 作用说明 | | ----------------------- | ------------------------------------------------------------ | | show follow-fork-mode | 显示follow-fork-mode状态 | | show detach-on-fork | 显示detach-on-fork状态 | | info inferiors | 查询gdb当前可调试的进程 | | inferior | 切换调试的进程,其中infer number是info inferiors命令打印出来的进程序号 | 接下来我们使用一个案例来说明上述命令的使用,有如下一段代码: ```cpp //test.cpp #include #include #include int main() { if ( fork() > 0) { while(1) { printf("this is parent\n"); sleep(1); } } else { while(1) { printf("this is son\n"); sleep(1); } } return 0; } ``` > 实际情况下代码肯定不能我这么写哈,要考虑到僵尸进程的产生,我这里只是为了排除其他干扰来说明gdb调试多进程的过程,所以写的很简洁。 假设这段代码编译后产生的执行文件为`test`,我们接着使用gdb对它进行调试,首先使用一下基本的命令,如下: ```shell (gdb) show follow-fork-mode Debugger response to a program call of fork or vfork is "parent". (gdb) show detach-on-fork Whether gdb will detach the child of a fork is on. ``` 打印处理这两种设置模式的默认值,这个跟我们前面说的这个是gdb默认场景是一致的哈,此时我们分别在父进程和子进程代码处设置断点,然后运行看一下: ```shell (gdb) b test.cpp:11 Breakpoint 1 at 0x40064e: file test.cpp, line 11. (gdb) b test.cpp:19 Breakpoint 2 at 0x400664: file test.cpp, line 19. (gdb) r Starting program: /root/test this is son Breakpoint 1, main () at test.cpp:11 11 printf("this is parent\n"); (gdb) this is son this is son this is son this is son ``` 可以看到只命中了父进程的断点,而子进程依然我行我素的运行。 接着假设我此时只想调试子进程,并且不想父进程继续运行,gdb命令如下: ```shell (gdb) set follow-fork-mode child (gdb) set detach-on-fork off (gdb) b test.cpp:11 Breakpoint 1 at 0x40064e: file test.cpp, line 11. (gdb) b test.cpp:19 Breakpoint 2 at 0x400664: file test.cpp, line 19. (gdb) r Starting program: /root/test [New process 29409] Reading symbols from /root/test...done. Reading symbols from /usr/lib64/libstdc++.so.6...done. [Switching to process 29409] Thread 2.1 hit Breakpoint 2, main () at test.cpp:19 19 printf("this is son\n"); (gdb) c Continuing. this is son Thread 2.1 hit Breakpoint 2, main () at test.cpp:19 19 printf("this is son\n"); (gdb) c Continuing. this is son Thread 2.1 hit Breakpoint 2, main () at test.cpp:19 19 printf("this is son\n"); ``` 此时父子进程都被gdb控制,并且只有子进程会命中断点,父进程被暂停了,所以既没有命中断点也没有继续执行。 #### 3. gdb怎么调试正在运行中的进程 在实际情况中有很多场景,我们需要去调试正在运行中的进程,此时该怎么调试呢,有两种办法: - gdb PID或者gdb -p PID,program是进程名,PID是进程在操作系统中的进程号,用ps命令查看即可,两种命令作用是一样的; - gdb 以后,在gdb模式下attach PID也可以起到同样的作用,即挂载某个进程到gdb中; 上述两种方法进入调试模式后,如果不想继续调试直接在gdb模式下使用detach命令取消gdb挂载的进程即可。 下面用一个案例来说明一下,假设有下面这段代码: ```cpp #include #include #include int main() { int i = 0; while(1) { i++; sleep(1); } return 0; } ``` 程序已经运行一段时间了,此时我想知道i的值是多少了,该怎么办呢,首先用ps命令查出进程的ID为29549,然后`gdb -p 29549`进入gdb模式,使用如下gdb命令查看即可: ```shell (gdb) b test.cpp:10 Breakpoint 1 at 0x4005bb: file test.cpp, line 10. (gdb) c Continuing. Breakpoint 1, main () at test.cpp:10 10 i++; (gdb) p i $1 = 165 ``` #### 4. gdb怎么调试生成的core文件 core文件一般是产生段错误产生的哈,也就是使用空指针或者有内存越界之类的动作会产生,但要产生core文件也是需要设置的,一般linux下使用ulimit命令即可,比如使用`ulimit -c`看下打印的值,如果不是unlimited,那么使用`ulimit -c unlimited`设置一下即可,关于ulimit命令的更多使用这里就不多做介绍了。 我的机器现在已经开启了core文件生成的开关,那么现在有这么一段代码,如下: ```cpp #include int main() { char *str = NULL; printf("%s\n", str); return 0; } ``` 然后执行,果不其然,输出了`段错误 (core dumped)`这样的语句,可见是产生了core文件,我这里产生的core文件名为`core.29626`,此时我们可以使用`gdb core.29626`这样的命令来进入gdb进行调试,如下: ```shell (gdb) bt #0 0x00000036f2879ba0 in strlen () from /lib64/libc.so.6 #1 0x00000036f28631cb in puts () from /lib64/libc.so.6 #2 0x00000000004005c8 in main () at test.cpp:6 ``` 使用bt命令即可查看出错的到底是哪个函数,哪行代码啦。 #### 5. gdb怎么查看c++中类对象的详细信息 假设有这么一段c++代码,如下: ```cpp class CPeople { public: int age; public: virtual void print(){} }; class CBigPeople : public CPeople { public: int height; }; int main() { CPeople *people = new CBigPeople; delete people; return 0; } ``` 我们使用gdb查看people所指向的类型,如下: ```shell (gdb) p *people $2 = {_vptr.CPeople = 0x4008b0 , age = 0} ``` 很显然默认情况下gdb没能显示出来真实类型,我们打开一个开关,如下: ```shell (gdb) set print object on (gdb) p *people $3 = (CBigPeople) { = {_vptr.CPeople = 0x4008b0 , age = 0}, height = 0} ``` 这是类型都显示在一行里面,如果是简单类型还好,如果类型很复杂的时候,这个就很难看了,所以我们可以让gdb显示树形结构,如下: ```shell (gdb) set print pretty on (gdb) p *people $5 = (CBigPeople) { = { _vptr.CPeople = 0x4008c0 , age = 0 }, members of CBigPeople: height = 0 } ``` #### 6. 小结 其实linux下调试gdb真的是个很强大的命令,仔细研究一下,我们会发现,只要我们能想到的功能,gdb真的都能实现,同时我们要善用gdb的help命令,它可以打印出所有的gdb命令和它的作用,如果你不想打印那么多,你可以只打印某个单一命令或者某一类命令,比如: ```shell (gdb) help shell #打印出gdb中shell命令的作用,它可以让我们直接在gdb下执行shell命令 Execute the rest of the line as a shell command. With no arguments, run an inferior shell. (gdb) help info #打印出gdb中info开头的所有命令 Generic command for showing things about the program being debugged. List of info subcommands: info address -- Describe where symbol SYM is stored info all-registers -- List of all registers and their contents info args -- Argument variables of current stack frame info auto-load -- Print current status of auto-loaded files info auxv -- Display the inferior's auxiliary vector info bookmarks -- Status of user-settable bookmarks info breakpoints -- Status of specified breakpoints (all user-settable breakpoints if no argument) info checkpoints -- IDs of currently known checkpoints info classes -- All Objective-C classes info common -- Print out the values contained in a Fortran COMMON block info copying -- Conditions for redistributing copies of GDB info dcache -- Print information on the dcache performance info display -- Expressions to display when program stops ...... #篇幅有限,后续省略了 ``` ***好了,本篇文章就为大家介绍到这里,觉得内容对你有用的话,记得顺手点个赞哦~***

优秀的个人博客,低调大师

code-server 3.10.2 发布,在远程服务器上运行 Visual Studio Code

code-server v3.10.2现已发布,具体更新内容如下: VS Code v1.56.1 code-server在 ~/.local/share/code-server 中保留了所有的用户数据,以便在两次安装之间保留这些数据。 New Features feat:支持舵手图值中的helm chart values#3393 feat:更改 extraContainers 以 helm chart 的templating#3393 Bug Fixes fix:使用正确的命令在欢迎页上打开文件夹#3437 Development fix(ci):更新brew-bump.sh,以便先更新远程#3438 更新说明:https://github.com/cdr/code-server/releases/tag/v3.10.2

优秀的个人博客,低调大师

code-server 3.10.1 发布,在远程服务器上运行 Visual Studio Code

code-server v3.10.1现已发布,具体更新内容如下: VS Code v1.56.1 升级就像在旧版本上安装新版本一样容易。 code-server在 ~/.local/share/code-server 中保留了所有的用户数据,以便在两次安装之间保留这些数据。 Bug Fixes 修复:检查登录用户而不是$USER#3330 修复:修复 npm 软件包中损坏的 node_modules.asar 符号链接#3355 修复:更新云代理以修复版本问题#3342 Documentation docs(install):添加raspberry pi#3376 docs(maintaining):添加提取请求部分#3378 docs(maintaining):添加合并策略部分#3379 refactor:移动默认的 PRtemplate#3375 docs(contributing):添加commits 部分#3377 docs(maintaining):为发布管理添加流程#3360 Development chore:忽略对 microsoft/playwright-github-action 的更新 fix(socket):使用 xdgBasedir.runtime 而不是 tmp#3304 fix(ci):重新启用 trivy-scan-repo#3368 更新说明:https://github.com/cdr/code-server/releases/tag/v3.10.1

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册