自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(53)
  • 收藏
  • 关注

翻译 路由器对数据的转发操作

路由器转发IP报文的依据是路由表,通过匹配路由表里的路由项来实现对IP报文的转发。如图1所示,当路由器收到一个IP报文的时候,将报文中的目的IP地址提取出来,然后与路由表中路由表项包含的目的地址进行比较。如果与某路由项中的目的地址相同,则认为与此路由项匹配;如果没有路由项能够匹配,则丢弃该IP报文。 图1 路由器多跳转发流程图IP报文中的

2013-08-28 10:30:08 3943

原创 Hook API(挂钩API)技术

Hook API,简单说,就是给API函数挂钩,将本应该调用的API函数拦截,使其转而调用我们自己的函数。这里,我主要介绍如何利用IAT挂钩来实现API拦截。在我们启动目标程序时,操作系统负责为目标程序创建虚拟地址空间,并将这个可执行模块(就是目标程序)加载到地址空间中去,接下来,系统会将目标程序所需要的DLL文件映射到地址空间。我们将需要映射到地址空间的目标程序及所需DLL统称为模块(Mod

2013-08-25 00:13:00 2632

原创 DLL注入

每个进程都有独立的地址空间,违规访问可能会导致内存访问违规,但是有时候我们需要打破进程的界限,访问另一个进程的地址空间,这里就可以用到我们的DLL注入技术了,将我们的DLL插入到另一个进程的地址空间,一旦你的DLL进入另一个进程的地址空间,你就可以对该进程为所欲为了。。。下面介绍几种DLL注入技术:利用注册表注入DLL在注册表中有一个关键字AppInit_DLLs,它的路径是:

2013-08-21 01:30:41 1120

原创 谨慎使用DLL_THREAD_ATTACH,以及利用DLL_THREAD_ATTACH来阻止远程线程的创建执行

DLL_THREAD_ATTACH的调用时机当进程创建一个线程的的时候,系统会检查当前映射到该进程的地址空间中的所有DLL文件映像,并用DLL_THREAD_ATTACH来调用每个DLL的DllMain函数,新创建的线程负责执行所有DLL的DllMain函数中的代码。系统不会让进程的主线程调用DLL_THREAD_ATTACH的值来调用DllMain函数。此时新线程已经被创建但尚未

2013-08-19 20:32:03 7814 2

转载 动态链接库与静态链接库的区别

原文地址:动态链接库与静态链接库的区别(转载)作者:牛妞静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib 中的指令都全部被直接包含在最终生成的 EXE文件中了。但是若使用 DLL,该 DLL 不必被包含在最终 EXE 文件中,EXE 文件执行时可以“动态”地引用和卸载这个与 EXE独立的 DLL文件。静态链接库和动态链接库的另外一个区别在于静态

2013-08-19 18:27:11 476

原创 内存修改器原理

BOOLWINAPIReadProcessMemory(              HANDLEhProcess,   //待读进程的句柄              LPCVOIDlpBaseAddress,   //目标进程中待读内存的起始地址              LPVOIDlpBuffer,   //用来读取数据的缓冲区       

2013-08-19 18:27:09 1455

原创 Windows全局钩子dll(键盘)

// dllHookkb.cpp : Defines the entrypoint for the DLL application.//#include "stdafx.h"#include "dllHookkb.h"#ifdef _MANAGED#pragma managed(push, off)#endif#pragmadata_seg("YCIShared2010")H

2013-08-19 18:27:07 1504

转载 Windows内存管理与结构体MEMORY_BASIC_INFORMATION

原文地址:Windows内存管理与结构体MEMORY_BASIC_INFORMATION作者:Jess23基于32位Windows,摘自http://blog.csdn.net/yeming81/archive/2008/01/16/2046193.aspx 1. 进程地址空间 软件的进程运行于32位系统上,其寻址位也是32位,能表示的空间是232=4G,范围从0x0000 0000~0x

2013-08-19 18:27:05 3994

转载 (转)vector中使用erase删除…

原文地址:(转)vector中使用erase删除元素作者:独自等待很容易受数组的影响,写出如下代码:std::vecotr::iterator it =vc.begin();for( ; it != vc.end(); it++ ){    if( *****)   vc.erase(it);}原因是vector中在删除一个元素后,迭代器会自动指向下一个元素。所以,上面的代码很可

2013-08-19 18:27:03 731

转载 环境淬炼远见

原文地址:环境淬炼远见作者:李开复环境淬炼远见李开复 非常感谢高希均教授和郭台铭董事长颁发给我的《华人企业领袖远见奖》。我说不上企业领袖,更不敢自称有远见,我其实真的很平凡,只是有幸在最佳的时间在最佳的环境里出生、学习、成长、发展。我和朋友开玩笑说我是:“大陆原料,台湾制造,美国加工,卖回中国市场。”今天我就谈谈这四点吧! 先谈谈大陆原料。我出生在台湾,算是台湾“外省人”。父亲194

2013-08-19 18:27:01 600

原创 避免僵死进程

在fork()/execve()过程中,假设子进程结束时父进程仍存在,而父进程fork()之前既没安装SIGCHLD信号处理函数调用waitpid()等待子进程结束,又没有显式忽略该信号,则子进程成为僵尸进程,无法正常结束,此时即使是root身份kill-9也不能杀死僵尸进程。补救办法是杀死僵尸进程的父进程(僵尸进程的父进程必然存在),僵尸进程成为"孤儿进程",过继给1号进程init,init始

2013-08-19 18:26:59 511

原创 给套接字设置超时检测

在涉及套接字I/O操作上设置超时的方法有以下3种。调用alarm,它在指定超时期满时产生SIGALRM信号。这个方法涉及信号处理,而信号处理在不同的实现上存在差异,而且可能干扰进程中现有的alarm调用。在select中阻塞等待I/O(select有内置的时间限制),以此代替直接阻塞在read或write调用上。使用较新的SO_RCVTIMEO和SO_SNDTIMEO套接字选项。这个方法

2013-08-19 18:26:56 1084

原创 connect的UDB套接字

首先,罗列几个即将用到的自定义函数。以下是Read函数原型:ssize_tRead(int fd, void *ptr, size_t nbytes){     ssize_t  n;     if( (n = read(fd, ptr, nbytes)) == -1)         err_sys("readerror");     return(n);}以

2013-08-19 18:26:54 683

原创 recvmsg和sendmsg函数

这两个函数是最通用的I/O函数。实际上我们可以把所有read、readv、recv和recvfrom调用替换成recvmsg调用。类似地,各种输出函数调用也可以替换成sendmsg调用。 #include  ssize_t recvmsg(int sockfd,struct msghdr *msg,int flags); ssize_t sendmsg(int sockfd,s

2013-08-19 18:26:52 1660

原创 套接字和标准I/O

我们经常使用也称为UNIXI/O——包括read、write这两个函数及它们的变体(recv、send等等)——的函数执行I/O。这些函数围绕描述符工作、通常作为UNIX内核中的系统调用实现。执行I/O的另一个方法是使用标准I/O函数库。标准I/O函数库可用于套接字,不过需要考虑以下几点。通过调用fdopen,可以从任何一个描述符创建出一个标准I/O流。类似地,通过调用fileno,

2013-08-19 18:26:50 1070

原创 高级轮询技术——/dev/poll接口与kqu…

这里介绍两种机制,它们跟select和poll这两个函数具备类似的特性。/dev/poll接口Solaris上名为/dev/poll的特殊文件提供了一个可扩展的轮询大量描述符的方法。select和poll存在的一个问题是,每次调用它们都得传递待查询的文件描述符。轮询设备能在调用之间维持状态,因此轮询进程可以预先设置好待查询描述符的列表,然后进入一个循环等待事件发生,每次循环回来时不必再次设

2013-08-19 18:26:48 3645 2

原创 select与pselect的信号屏蔽

pselect() 函数的原型是:int pselect(int nfds, fd_set *readfds, fd_set *writefds,                   fd_set *exceptfds, const struct timespec *timeout, const sigset_t *sigmask);它和 select() 函数基本相同,区别在于两个不同的

2013-08-19 18:26:46 1243 1

原创 C/C++文件读写

一、ASCII 输出为了使用下面的方法, 你必须包含头文件(译者注:在标准C++中,已经使用取代fstream.h>,所有的C++标准头文件都是无后缀的。)。这是的一个扩展集, 提供有缓冲的文件输入输出操作. 事实上,  已经被包含了, 所以你不必包含所有这两个文件, 如果你想显式包含他们,那随便你。我们从文件操作类的设计开始, 我会讲解如何进行ASCII I/O操作。如果你猜是"fstrea

2013-08-19 18:26:41 640

原创 结构与联合

结构:   struct SELF_REF1{     int a;     struct SELF_REF1 b;     int c;};这是一种错误的自引用,结构内包含结构体,它也包含自己的b,这样就是一个无止尽的递归程序,相反,换成下面这样,就是正确的。   struct SELF_REF1{     int a;     struct SELF_REF

2013-08-19 18:26:39 577

原创 析构函数为什么要写成虚函数

#includeclass Base { public:     Base(){ mPtr = new int; }     ~Base(){ delete mPtr;coutprivate:     int*mPtr; } ;class Derived : public Base { public:     Derived(){ mDerived = new

2013-08-19 18:26:35 1481

原创 mutable关键字

mutalbe的中文意思是“可变的,易变的”,跟constant(既C++中的const)是反义词。  在C++中,mutable也是为了突破const的限制而设置的。被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中。  我们知道,如果类的成员函数不会改变对象的状态,那么这个成员函数一般会声明成const的。但是,有些时候,我们需要在const的函数里面修改

2013-08-19 18:26:33 403

原创 论C++类对象赋值

class Demo{public: Demo() {} Demo(intj) {  cout<<"Demo int:"    this->i =j; } Demo(constDemo& d) {  cout } Demo& operator= (const Demo& d) {  cout<<"operator=

2013-08-19 18:26:31 507

原创 内部碎片与外部碎片

“碎片的内存”描述一个系统中所有不可用的空闲内存。这些资源之所以仍然未被使用,是因为负责分配内存的分配器使这些内存无法使用。这一问题通常都会发生,原因在于空闲内存以小而不连续方式出现在不同的位置。由于分配方法决定内存碎片是否是一个问题,因此内存分配器在保证空闲资源可用性方面扮演着重要的角色。internal fragmentation:whenmemory allocated to

2013-08-19 18:26:29 2123

原创 内存分段和分页的区别

分段和分页其实都是一种对地址的划分或者映射的方式。两者的区别主要有以下几点:a)页是信息的物理单位,分页是为实现离散分配方式,以消减内存的外零头,提高内存的利用率;或者说,分页仅仅是由于系统管理的需要,而不是用户的需要(也是对用户透明的)。段是信息的逻辑单位,它含有一组其意义相对完整的信息(比如数据段、代码段和堆栈段等)。分段的目的是为了能更好的满足用户的需要(用户也是可以使用的)。

2013-08-19 18:26:27 5359

原创 昂贵的聘礼(单源最短路问题)

题意:年轻的探险家来到了一个印第安部落里。在那里他和酋长的女儿相爱了,于是便向酋长去求亲。酋长要他用10000个金币作为聘礼才答应把女儿嫁给他。探险家拿不出这么多金币,便请求酋长降低要求。酋长说:"嗯,如果你能够替我弄到大祭司的皮袄,我可以只要8000金币。如果你能够弄来他的水晶球,那么只要5000金币就行了。"探险家就跑到大祭司那里,向他要求皮袄或水晶球,大祭司要他用金币来换,或者替他弄来其

2013-08-19 18:26:24 501

原创 Kruskal算法+并查集实现

对于稀疏图来说,用Kruskal写最小生成树效率更好,加上并查集,可对其进行优化。Kruskal算法的步骤:1.对所有边进行从小到大的排序。2.每次选一条边(最小的边),如果形成环,就不加入(u,v)中,否则加入。那么加入的(u,v)一定是最佳的。并查集:我们可以把每个连通分量看成一个集合,该集合包含了连通分量的所有点。而具体的连通方式无关紧要,好比集合中的元素没有先后顺序之分

2013-08-19 18:26:22 1059

原创 Bellman-Ford算法

Bellman - Ford算法是一种求单源点最短路径的算法,但是由于其时间复杂度较高,为O(V * E)(其中V为图的结点数,E为图的边数,如果图以邻接矩阵存储则时间复杂度为O(V ^ 3)),所以通常并不用这种算法来求单源点最短路径。但是由于Bellman - Ford算法适用于负权边,并且还能够判断图中是否存在负权环,所以在一些特殊的情况下会用到这种算法。 Bellman - For

2013-08-19 18:26:20 436

原创 Dijkstra算法

Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法能得出最短路径的最优解,但由于它遍历计算的节点很多,所以效率低。Dijkstra算法是很有代表性的最短路算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等。其基本思想是,设置顶点集合S

2013-08-19 18:26:18 420

原创 Prim算法

void Prim(MGraph g,int v,int &sum)  {       int LowCost[Max],VexSet[Max],v;       int i,j,k,min;       //初始化LowCost,VexSet数组  ​    for(i=0;i ​    { ​    ​    LowCost[i]=g.edges[v][i];

2013-08-19 18:26:16 452

原创 Edmonds_Karp算法(图论)

有n个点,有m条有向边,有一个点很特殊,只出不进,叫做源点,通常规定为1号点。另一个点也很特殊,只进不出,叫做汇点,通常规定为n号点。每条有向边上有两个量,容量和流量,从i到j的容量通常用c[I,j]表示,流量则通常是f[I,j]。通常可以把这些边想象成道路,流量就是这条道路的车流量,容量就是道路可承受的最大的车流量。很显然的,流量把源点比作工厂的话,问题就是求从工厂最大可以发出多少货物,是不

2013-08-19 18:26:14 623

原创 poj 1980 Unit Fraction Partition

DescriptionAfraction whose numerator is 1 and whose denominator is a positiveinteger is called a unit fraction. A representation of a positiverational number p/q as the sum of finitely many unit f

2013-08-19 18:26:12 811

原创 poj1007 DNA Sorting(求逆序数)

DescriptionOne measure of``unsortedness'' in a sequence is the number of pairs of entriesthat are out of order with respect to each other. For instance, inthe letter sequence ``DAABEC'', this meas

2013-08-19 18:26:09 945

原创 寻找前k个最小元素——用最小堆实现…

//copyright@ 泡泡鱼//July、.06.02。 //@lingyun310:先对元素数组原地建最小堆,O(n)。然后提取K次,但是每次提取时,//换到顶部的元素只需要下移顶多k次就足够了,下移次数逐次减少。此种方法的复杂度为O(n+k^2)。#include  #include  #define MAXLEN 123456 #define

2013-08-19 18:26:07 1029

原创 最长回文串

题目:给定一个字符串序列,求出串中最长的回文序列。比如:abcdeffegddgeh,最长回文串就是egddge,长度为6; 代码:#include"stdio.h"#include"string.h"void main(){    char ch[100];    int max=1,ok=1;    scanf("%s",ch);    int n=s

2013-08-19 18:26:05 518

原创 反转链表

问题:给定一个单向链表,设计一个时间优化并且空间优化的算法,找出该链表的倒数第m个元素。实现您的算法,注意处理相关的出错情况。m定义为当m=0时,返回链表最后一个元素。 解答:这是一个难题,因为单向链表只能正向遍历,这个问题需要根据元素与链表尾的相对位置来找出该元素,但是当发现链表尾时,没有简单的办法回溯到倒数第m个元素。 我们需要的是倒数第m个元素,所以,如果我们从某个

2013-08-19 18:26:03 447

原创 高精度乘法

#include #include #include #include  #define MAX 10001 int bigchenfa(int *sum,int *a,int *b,int lsum,int la,int lb){    int i,j;    memset(sum,0,sizeof(sum));    lsum = 0 ;

2013-08-19 18:26:01 494

原创 poj3714 Raid(分治法…

DescriptionAfter successive failures in the battlesagainst the Union, the Empire retreated to its last stronghold.Depending on its powerful defense system, the Empire repelled thesix waves of Uni

2013-08-19 18:25:58 701

原创 0/1背包问题

题目:有n件物品和一个体积为C的背包。第i件物品的体积是V[i],价值是W[i]。求解将哪些物品装入背包可使价值总和最大。代码:#include #include int C,V[100],W[100];int main(){    int d[100][100];     int n,C,i;    scanf("%d%d",&n,&C);

2013-08-19 18:25:55 432

原创 石子合并

问题描述:      在一个圆形操场的四周摆放着n堆石子。现要将石子有次序地合并成一堆。规定每次只能选相邻的2 堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分。试设计一个算法,计算出将n堆石子合并成一堆的最小得分。 动态规划思路:阶段i:石子的每一次合并过程,先两两合并,再三三合并,...最后N堆合并状态s:每一阶段中各个不同合并方法的石子合并总得分。决策:把当前

2013-08-19 18:25:53 1073

原创 最长公共子序列

最长公共子序列,顾名思义,要求算出两个字符序列中最长的公共子序列,DP问题。这里直接给出代码:#include#include#define maxn 1001#define max(a,b) (a>b?a:b)char a[maxn],b[maxn];long lena,lenb,d[maxn][maxn];int main(){    memset(d,0

2013-08-19 18:25:51 447

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除