
代码精进之路
文章平均质量分 86
Sudouble
动静结合,持之以恒!
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Native Hook 技术,天使还是魔鬼
总的来说 Native Hook 是一门非常底层的技术,它会涉及库文件编译、加载、链接等方方面面的知识,而且很多底层知识是与 Android 甚至移动平台无关的。在这一领域,做安全的同学可能会更有发言权,我来讲可能班门弄斧了。不过希望通过这篇文章,让你对看似黑科技的 Hook 有一个大体的了解,希望可以在自己的平时的工作中使用 Hook 来完成一些看似不可能的任务,比如修复系统 Bug、线上监控 Native 内存分配等。转载 2023-12-14 21:56:07 · 328 阅读 · 0 评论 -
PLTHook
【代码】PLTHook。转载 2023-12-14 21:22:46 · 221 阅读 · 0 评论 -
深入了解GOT,PLT和动态链接
上面说了很多.got, .plt啥的, 那么这些section到底是做什么用的呢. 其实这些都是链接器(或解释器, 下面统称为链接器)在执行重定向时会用到的部分, 先来看他们的定义.为了灵活利用虚拟内存空间, 所以编译器可以产生位置无关的代码.可执行文件可以是位置无关的, 也可以是位置相关的, 动态链接库绝大多数都是位置无关的. GOT表可写不可执行, PLT可执行不可写,他们相互作用来实现函数符号的延时绑定. ASLR并不随机化PLT部分,转载 2023-12-14 20:37:06 · 667 阅读 · 0 评论 -
Linux虚假唤醒
为什么会有虚假唤醒一说。Linux内核这么强大,怎么会出现这样的情况?一直以来也很困惑,看了下文链接中的介绍后,豁然开朗。原创 2023-12-06 10:00:39 · 628 阅读 · 0 评论 -
进程、线程、协程、例程、过程的区别是什么?
首先解释下程序、进程、上下文切换和线程。然后再解释协程、例程、过程。程序程序:源代码堆起来的东西。相当于一个一动不动没有生命的机器人。虽然是没有生命的机器人,但是它被设计后就表示有了硬件,它的硬件决定了之后它有生命后是如何干活的 机器人有优劣,所以有些优秀的机器人干活很快,而有些机器人干活很慢进程进程:程序在系统上跑起来(运行)之后的东西(动态的)。相当于有了生命的机器人。生命是内核给的,动起来的能力是CPU提供的驱动力。因为在操作系统看来,它已经有了生命,会赋予它一些属性,比如它叫转载 2021-09-14 09:29:15 · 1853 阅读 · 0 评论 -
BitMapIndex,倒排索引原理,B-Tree索引
Bitmap索引时序数据库从抽象语义上来说总体可以概括为两个方面的基本需求,一个方面是存储层面的基本需求:包括LSM写入模型保证写入性能、数据分级存储(最近2小时的数据存储在内存中,最近一天的数据存储在SSD中,一天以后的数据存储在HDD中)保证查询性能以及存储成本、数据按时间分区保证时间线查询性能。另一方面是查询层面的基本需求:包括基本的按时间线进行多个维度的原始数据查询、按时间线在多个维度进行聚合后的数据统计查询需求以及TopN需求等。可见,多维条件查询通常是时序数据库的一个硬需求,其性能好坏也转载 2021-07-02 09:07:08 · 867 阅读 · 0 评论 -
DEBUG下的异常指示——地址含义
在写C++程序的时候,老实0xcdcdcdcd ,0xdddddddd ,0xfeeefeee ,0xcccccccc ,0xabababab这种提示,不知何解,google之,错误是这样产生* 0xABABABAB : Used by Microsoft's HeapAlloc() to mark "no man's land" guard bytes after allocated heap memory* 0xABADCAFE : A startup to this value to i.原创 2021-06-19 08:44:59 · 500 阅读 · 0 评论 -
Google Test(GTest)使用方法和源码解析——概况
GTest是很多开源工程的测试框架。虽然介绍它的博文非常多,但是我觉得可以深入到源码层来解析它的实现原理以及使用方法。这样我们不仅可以在开源工程中学习到实用知识,还能学习到一些思想和技巧。我觉得有时候思想和技巧是更重要的。(转载请指明出于breaksoftware的csdn博客) 我们即将要分析的是GTest1.7版本。我们可以通过https://github.com/google/googletest.git得到代码。 官方文档见:https://github.co...转载 2020-12-25 21:21:17 · 785 阅读 · 0 评论 -
析构函数virtual与非virtual区别
作为通常的原则,如果一个类定义了虚函数,那么它的析构函数就应当是virtual的。因为定义了虚函数则隐含着:这个类会被继承,并且会通过基类的指针指向子类对象,从而得到多态性。 这个类可能会被继承,并且会通过基类的指针指向子类对象”,因此基类的析构函数是否为虚将决定子类的对象是否被析构示例代码:#include <iostream.h>struct A{ virtual ~A() {cout<<"~A()\n";}};struct B: public ..原创 2020-12-24 21:53:31 · 499 阅读 · 0 评论 -
理解Windows坐标系概念及其转换
1. Windows坐标系统坐标系主要分为两种:逻辑坐标系:主要是在“虚拟界面”中绘图,是绘制到设备坐标系的准备阶段。 设备坐标系:由客户区坐标、窗口坐标、屏幕坐标组成,主要和显示设备有关。在不同的空间中,各个坐标系及其坐标表示方法稍有不同。世界空间和页面空间的坐标系为平时熟悉的方式,x轴向右为正,y轴向上为正,设备空间中,y轴改为向下为正(要问为什么这么定,emm,自己问MS去)。...原创 2020-03-19 21:55:58 · 1725 阅读 · 0 评论 -
Traits编程技法
照顺序,这次应该是迭代器Iterator的内容了,然而Iterator涉及到一个重要的技巧就是Traits编程技法。一 获取Iterator的相应类型(associate type)在使用Iterator时,可能需要知道它的相应类型,也就是Iterator指向的变量的类型,在C/C++语言中,如果要获取一个变量的大小可以使用sizeof()操作符。然而如果想要获取一个指针指向的变量类型该如...原创 2019-12-03 14:21:07 · 325 阅读 · 0 评论 -
凸包问题的4种解法
转载自:https://blog.youkuaiyun.com/u011001084/article/details/72768075前言:首先,什么是凸包?假设平面上有p0~p12共13个点,过某些点作一个多边形,使这个多边形能把所有点都“包”起来。当这个多边形是凸多边形的时候,我们就叫它“凸包”。如下图:然后,什么是凸包问题?我们把这些点放在二维坐标系里面,那么每个点都能用 ...转载 2019-09-18 11:28:51 · 796 阅读 · 0 评论 -
”无法找到所需的资源“——GDI绘图相关——MFC运行异常
这两天用程序时碰到神奇的问题,软件短时间运行OK,但一定时间后(6个小时及以上),界面刷新失败,对软件长时间不处理后,软件自动退出。以前软件因堆内存耗尽退出的都会产生dmp文件,根据这个比较好定位问题。但是此次的软件退出,有时并不会产生dmp文件,有时虽然会有dmp文件,但调用堆栈都停止在系统级DLL调用,和软件本身好像并没有关系,使我也不知道问题到底出在什么地方。停止的调用堆...原创 2019-08-30 10:40:32 · 319 阅读 · 0 评论 -
C++ tips记录
十六进制转十进制(进制转化)#include <sstream>#include <string>using namespace std;int main(){ int nOut = 0; string name = "d0"; // 十六进制 stringstream ss; ss << hex <<...原创 2019-08-01 09:25:59 · 252 阅读 · 0 评论 -
Windows DLL注入的方法介绍
DLL作为公司日常用品,极大的方便了日常的开发(主要是看起来产品就很高大上了)。以下介绍几种跨进程调用DLL的方法。从《Windows核心编程》的书中可知,Windows下各个进程间的地址是相互独立的。建立新的进程时,会为此进程开辟一块独立的虚拟地址空间,这样有助于系统的稳定。——当一个进程崩溃时,只影响一个进程,回收垃圾时也只需要对本进程地址空间内的数据进行回收即可。虚拟地址空间由以下几...原创 2019-06-26 21:02:30 · 1159 阅读 · 0 评论 -
Windows DLL的生成与使用
DLL基础部分 通过对函数前加前缀:__declspec(dllexport) 或__declspec(dllimport),表明函数或类是导出到DLL,还是从DLL中导入。但在C++中,通过编译会改变函数名称,可以通过如下的宏进行更正,但过程比较繁琐,不适用于大批量改变函数名称的情况。#pragma comment(linker, "export:Myfun=MyFun@8"...原创 2019-06-17 22:15:31 · 2006 阅读 · 0 评论 -
依赖注入、控制反转
通过这个例子,作者吧依赖注入和控制反转讲的十分精练易懂。依赖注入:底层对象做为参数传入高层次对象。——解决的问题:底层对象的小变动,会极大影响高层次的代码结构。控制反转:一个容器相关,通过配置好的依赖关系,对依赖注入方式进行管理。作者:Mingqi链接:https://www.zhihu.com/question/23277575/answer/169698662来源:知乎著作权...转载 2019-03-12 22:20:58 · 223 阅读 · 0 评论 -
数组与链表——异同分析
近期开始看《图解算法》,虽然很早以前就接触过算法这块的,但还是不得不惊叹作者的功力,巧妙地借助漫画的形式和相关的例子把复杂的原理讲得如此有趣和透彻。这里将先跳过大O(时间复杂度、空间复杂度)相关部分的介绍,以及关于最佳、平均、最坏情况下复杂度的估计方法。内存首先是介绍内存的概念,一般来说,数据都是经硬盘加载到内存后才可以进行后续处理(把硬盘空间大小当成内存空间大小的请面壁思过...原创 2019-04-05 17:47:13 · 1364 阅读 · 0 评论 -
背包问题——动态规划
主要目的:在不改变算法结果的情况下,提高算法执行效率。主要手段:将算法执行中,重复执行的子问题进行缓存,通过查表直接获取到本次结果。有这样一个问题,我们只有一只不同磅数的背包,要装不同的物品,且物品有不同的价值,需要怎么进行装配能得到最大的价值呢?表格中的物品的重量和价格如下所示:物品 重量(磅) 价值(元) 吉他 1 1500 音响 4 3...原创 2019-07-06 16:12:33 · 328 阅读 · 0 评论 -
散列表——Hash Table
前文对数组和链表进行了分析,介绍了各自在插入、遍历、删除方面的优势和劣势,时间复杂度如下表示。 数组 链表 读取 O(1) O(n) 插入 O(n) O(1) 删除 O(n) O(1) 既然数组和链表都存在一定的不足,那么有没有什么方法能在快速读取的同时,可以快速的将数据插入呢?答案就是散列表!场景假设你开了一家超市,但...原创 2019-04-21 10:02:09 · 281 阅读 · 0 评论 -
三种排序算法详解:插入、冒泡、快速排序
好几年前就接触了排序算法,那时候写都是直接用的brute force方法。那时候心没有静下来好好去想,而且只得其形,未得其意,难以理解不同排序算法间的精髓所在。近期在看《图解算法》这本书,借助一幅幅图的表达和演化,恍然顿悟,这算法原来并没有想象中的那么难!插入排序排序算法的起名,都是和其特性有关,这也是我近来才体会到的,如插入排序(Insert Sort)。从名字上看,和选择有关,但具体又...原创 2019-04-14 11:22:50 · 446 阅读 · 0 评论 -
最短路径算法——Dijkstra介绍
个人心得体会:理解这种或这类算法,可以先从小规模的问题入手,并逐渐推广到问题变复杂的情况,这样理解起来也可以更方便和透彻。——和数学归纳法很相似。图简介以使用地图APP为例,假设你想前往某个目的地,此间有很多条线路可以选,如地铁、不同的公交换乘方案。而不同的方案所需换乘的次数不同。那么怎么才能选出换乘次数最少的方案呢?有向图:节点和节点之间的连接是有方向的。无向图:节点和节点之...原创 2019-04-27 08:56:07 · 11441 阅读 · 2 评论 -
背包问题——贪婪算法
贪婪算法在时间或空间有限的条件下,去较为快速的找到问题的近似解。如典型的旅行商问题,就是一个复杂度为O(n!)的问题,可能解的数量会随着路线的增多呈爆炸性增长。背包的例子假设你是一个小偷,有一个可装35Kg重东西的背包,要去商场获取收益。因此要尽量保持包里装的东西价值最大。那么你应该如何去偷呢?使用贪婪方法步骤:就直接去找价值最大,而且装得下的商品, 就这么一直放,直到包...原创 2019-05-04 11:35:44 · 3090 阅读 · 0 评论 -
LeetCode 940 解题思路
这道题是随机选的,看了看题目,刚好和前段时间看了MIT6.00课程中的Dynamic Programming很像,于是就想着去解决试试。没找到Dynamic Programming在这里的切入点,运算结果是对的(报:Time Limit Exceeded),就是计算复杂度太高了——,当然十分惨烈。940.Distinct Subsequences IIGiven a stringS,...原创 2019-04-20 11:16:47 · 387 阅读 · 0 评论 -
Quick Selection(快速选择算法)
常年见到快速排序算法,当在普林斯顿大学的网课上看到这个Quick Selection算法的时候,直接蒙住了——这个是什么,和快速排序有什么关系啊?于是迅速查阅了维基百科,大致了解了其思想,再结合课程中的ppt,终于搞明白了。不得不说这是个很巧妙的算法,把原先要O(nlogn)复杂度的问题,简化为O(n),且数据无需有序.想起来以前在竞赛和面试时候碰到过类似的情况,都是要找出第n大的数,当时...原创 2019-05-14 20:58:12 · 5168 阅读 · 0 评论 -
A*算法介绍
不得不叹服,强大算法背后,都是简单得不能再简单的逻辑。普林斯顿的算法课程作业里,要让用A*算法。什么都没接触到过,看到后有种想哭的感觉!于是网上查阅资料,渐渐的明白了怎么回事。通过对A*算法的学习的个人感悟:计算一个代价函数,评估每一步的代价,并找到代价最小的方向。最终得到的解可能不是最优,但每一步都是最佳的策略,总是会非常接近最优解。即常见寻优算法中,全局最优和局部最优之间的抉择问题。有...原创 2019-05-24 19:41:04 · 2047 阅读 · 0 评论 -
软件中“新需求”的处理方法
这是关于如何做好工作的一篇拙见,肯定还有更多没注意到,欢迎批评指正!逐渐意识到技术只是其中一个点,还有更多其他方面的,如软技能,也同样重要!前段时间火爆的996吐槽,我的直观感受是任务是干不完的,当做好了一件事,还会有更多的任务在等着你(干活还给高工资的公司例外)。何尝不用这个高质量的时间来提升自己的价值呢?以前拿到任务的第一件事就是开始构思如何进行做如何做(具体到非常细节的事情)。但在实...原创 2019-06-02 09:34:24 · 596 阅读 · 0 评论 -
Windows Dll的构建和导入
去年校招在美的面试时,emmm,被问倒了。 Dll基本的部分本事不太复杂,真需要静下心来,细细研究这方面的知识。——以不变应万变!update 2019/11/14: 从主要目的来看,这个构建和导入的过程,核心是通过编译产生二进制文件,并在软件启动时加载到内存中,其中内存里存放了dll相关函数的转跳地址。需要使用时,通过汇编的转跳指令转跳到相关函数上,本质上和普通的函数调用时没有任何区别的...原创 2019-06-10 16:58:15 · 411 阅读 · 0 评论 -
代码整洁之道——读后感
时隔三年,这是第二次阅读《代码整洁之道》,并以第三者的角度来看代码质量的问题,感慨良多。最主要的是我们要去写具有表达力、张力的代码;在修改时,每次签出都要比来时更整洁,千里之行始于足下。 写代码,本质上写法与中学作文无异,写的过程和好故事都需要兼顾。实现了业务功能的代码只是作为一个开始,软件的生命周期决定了它后期还需要人来持续的维护,而不同的人代码风格迥异。整洁代码就如同一门语言...原创 2019-03-13 22:43:46 · 2276 阅读 · 0 评论