限制用户进程CPU和内存占用率的SHELL脚本

限制进程CPU占用率的问题,给出了一个shell脚本代码如下:

renice +10 `ps aux | awk ‘{ if ($3 > 0.8 && id -u $1 > 500) print $2}’`

其中用到ps获取进程信息,其实

ps中%CPU一列的意义是进程实际占有CPU时间和它存活时间的比值,这个值能反应进程对CPU的消耗,但不能准确反应进程所占CPU时间占整个系统CPU的百分比。

而top输出中的%CPU这一列正是进程所占CPU时间占整个系统CPU的百分比,用于限制进程CPU占用率更加合理,同时%MEM一列还反应了进程占用内存的百分比,可以用于限制进程内存占用率。

shell脚本代码如下:

#!/bin/sh

PIDS=`top -bn 1 | grep “^ *[1-9]” | awk ‘{ if($9 > 50 || $10 > 25 && id -u $2 > 500) print $1}’`

for PID in $PIDS

do

renice +10 $PID

echo “renice +10 $PID”

done

可以将这个脚本放到cron中运行,比如每分钟检查一次,只需以root身份添加crontab项:

#crontab -e

* * * * * limit.sh

以后每个一分钟就会检查一次,调整占用50%以上CPU或25%内存的进程的nice值,从而使这样的进程优先级变低,被调度的机会减少,同时会向root发邮件提示该进程被调整过。

不过,限制内存使用最好还是用PAM,RedHat可以在/etc/security/limits.conf中设置。

VS2010+Opencv-2.4.0的配置攻略

摘要:在VS2010环境中应用Opencv,网上找到了很多配置方法,但大多都是老版本的,很多新手面对最新版本的Opencv无从下手,就给新手童鞋写了这么一篇超级详细的配置攻略,贴上来共享。要强调一点的就是,这种配置方法里使用的Opencv库是直接安装Opencv时候自带的dll库,在你的VS里面是无法调试Opencv的。如果需要调试Opencv,必须应用自己编译出来的Opencv库,具体怎么编译自己的Opencv库,网上有很多例子,再此不再赘述。

1、下载软件

下载OpenCV-2.4.0,双击解压到%opencv%(凡是出现%opencv%的地方均替换为你自己opencv的路径全名,如D:\program\opencv)。

下载VS2010,安装。

 2、配置OpenCV环境变量

计算机->(右键)属性->高级系统设置->高级(标签)->环境变量->(双击)path(用户,系统里面的path任选其一)->在变量值里面添加” %opencv%\build\x86\vc10\bin”和”%opencv%\build\common\tbb\ia32\vc10”(里面的%opencv%记得换成自己的opencv路径。例如我的:D:\program\ifly\bin;D:\Program Files (x86)\opencv\build\x86\vc10\bin;D:\Program Files (x86)\opencv\build\common\tbb\ia32\vc10)。

2012042521370765

3、配置工程的opencv依赖(每次新建工程都要重新配置,要执行此步骤请先跳到第4步建立工程)

1)、项目(菜单项)->…属性->VC++目录:需要配置“包含目录”和“库目录”两项。

2012042521403569

2)、配置“包含目录”项:添加行”%opencv%\build\include”即可。

但在运行别人的opencv项目时,可能别人直接引用了上述目录的子目录路径,如果出现include错误,则再添加”%opencv%\build\include\opencv”和(或)”%opencv%\build\include\opencv2”,即可解决问题。

2012042521411894

3)、配置“库目录”项:添加行”%opencv%\build\x86\vc10\lib”即可。

2012042521415632

4)、配置连接器:项目(菜单项)->…属性->连接器->输入->附加依赖项

针对debug配置添加以下库:

opencv_calib3d240d.lib

opencv_contrib240d.lib

opencv_core240d.lib

opencv_features2d240d.lib

opencv_flann240d.lib

opencv_gpu240d.lib

opencv_highgui240d.lib

opencv_imgproc240d.lib

opencv_legacy240d.lib

opencv_ml240d.lib

opencv_objdetect240d.lib

opencv_ts240d.lib

opencv_video240d.lib

如果是release配置(以后再说,只需要添加上面的debug配置就行了现在),则添加:

opencv_calib3d240.lib

opencv_contrib240.lib

opencv_core240.lib

opencv_features2d240.lib

opencv_flann240.lib

opencv_gpu240.lib

opencv_highgui240.lib

opencv_imgproc240.lib

opencv_legacy240.lib

opencv_ml240.lib

opencv_objdetect240.lib

opencv_ts240.lib

opencv_video240.lib

2012042521423828

4、用VS2010新建控制台工程测试:

1)、文件->新建->项目->Visual C++->Win32 控制台应用程序(输入名称test)

2012042521442467

2)、确定->下一步->附加选项选“空项目”->完成

2012042521460556

3)、解决方案资源管理器->源文件(右键)->添加->新建项

2012042521533454

4)、Visual C++->C++文件:输入名称test点添加

2012042521545853

5)、粘贴下面的代码,保存

 1 #include 
 2 #include 
 3 #include 
 4 using namespace cv;
 5 using namespace std;
 6 int main()
 7 {
 8     Mat img = imread("pp.jpg");
 9     if(img.empty())
10     {
11         cout<<"error";
12         return -1;
13     }
14     imshow("xx的靓照",img);
15     waitKey();
16 
17     return 0;
18 }

6)、把自己的靓照改名为pp.jpg,然后放到工程项目的test文件夹里面(是里面那个test文件夹)

2012042521584579

7)、按照第3步骤的方法配置工程的opencv依赖。

8)、按F5,如果你的图片出来了就OK了。

2012042617492156

Git教程系列-详细版(转载收藏)

http://blog.enjoyrails.com/2008/12/28/git%E8%AF%A6%E8%A7%A3%EF%BC%88%E4%B8%80%EF%BC%89/

http://www.5iphp.com/node/124

 

流程:取代码 → 每次工作前更新代码到最新版本 → 修改代码 → 提交代码到服务器

取代码及修改全局设置

设置用户名与邮箱

1
2
git config --global user.name "My Name"
git config --global user.email "my@email.com"

从已有的git库中提取代码

1
git clone git@server:app.git myrepo

每次更改代码的操作

更新本地代码到最新版本(需要merge才能合到本地代码中)

1
git fetch

合并更新后的代码到本地

1
git merge

更新代码方式的另一种方法(git pull是git fetch和git merge命令的一个组合)

1
git pull

修改代码后,查看已修改的内容

1
git diff --cached

将新增加文件加入到git中

1
git add file1 file2 file3

从git中删除文件

1
2
git rm file1
git rm -r dir1

提交修改

1
git commit -m 'this is memo'

如果想省掉提交之前的 git add 命令,可以直接用

1
git commit -a -m 'this is memo'

commit和commit -a的区别, commit -a相当于:

  • 第一步:自动地add所有改动的代码,使得所有的开发代码都列于index file中
  • 第二步:自动地删除那些在index file中但不在工作树中的文件
  • 第三步:执行commit命令来提交

提交所有修改到远程服务器,这样,其它团队成员才能更新到这些修改

1
git push

其它常用命令

显示commit日志

1
git log

不仅显示commit日志,而且同时显示每次commit的代码改变。

1
git log -p

回滚代码:

1
git revert HEAD

你也可以revert更早的commit,例如:

1
git revert HEAD^

将branchname分支合并到当前分支中。(如果合并发生冲突,需要自己解决冲突)

1
git merge branchname

解决冲突

当merge命令自身无法解决冲突的时候,它会将工作树置于一种特殊的状态,并且给用户提供冲突信息,以期用户可以自己解决这些问题。当然在这个时候,未发生冲突的代码已经被git merge登记在了index file里了。如果你这个时候使用git diff,显示出来的只是发生冲突的代码信息。

在你解决了冲突之前,发生冲突的文件会一直在index file中被标记出来。这个时候,如果你使用git commit提交的话,git会提示:filename.txt needs merge

在发生冲突的时候,如果你使用git status命令,那么会显示出发生冲突的具体信息。

在你解决了冲突之后,你可以使用如下步骤来提交:

第一步(如果需要增加文件):

1
git add file1

第二步:

1
git commit

越狱检测/越狱检测绕过—xCon

一直忽略了越狱检测与越狱检测绕过的问题,因为我认为在app争抢装机率的环境下,是不会在乎对方的设备越狱与否的。但很显然,我忽略了一个问题,app在设计的时候或许会依照设备是否越狱而采取不同的流程,比如说对越狱的设备采取更多的安全措施,在这种场景下,越狱检测是否可靠就成为了关键问题。本篇文章主要介绍越狱检测的常见方法(并配有相应的测试代码),以及最流行的越狱检测绕过插件xCon(会分析该工具会绕过哪些检测方法),最后总结了个人认为的比较可靠的越狱检测方法。

一、越狱检测

(一)《Hacking and Securing iOS Applications》这本书的第13章介绍了以下方面做越狱检测
1. 沙盒完整性校验
根据fork()的返回值判断创建子进程是否成功
(1)返回-1,表示没有创建新的进程
(2)在子进程中,返回0
(3)在父进程中,返回子进程的PID
沙盒如何被破坏,则fork的返回值为大于等于0.
我在越狱设备上,尝试了一下,创建子进程是失败,说明不能根据这种方法来判断是否越狱。xCon对此种方法有检测
代码如下:
1344605963764714110

2. 文件系统检查
(1)检查常见的越狱文件是否存在
以下是最常见的越狱文件。可以使用stat函数来判断以下文件是否存在

/Library/MobileSubstrate/MobileSubstrate.dylib 最重要的越狱文件,几乎所有的越狱机都会安装MobileSubstrate

/Applications/Cydia.app/ /var/lib/cydia/绝大多数越狱机都会安装

/var/cache/apt /var/lib/apt /etc/apt

/bin/bash /bin/sh

/usr/sbin/sshd /usr/libexec/ssh-keysign /etc/ssh/sshd_config

代码如下

6597697587796059517

(1)返回0,表示指定的文件存在
(2)返回-1,表示执行失败,错误代码存于errno中
错误代码:
ENOENT         参数file_name指定的文件不存在
ENOTDIR        路径中的目录存在但却非真正的目录
ELOOP          欲打开的文件有过多符号连接问题,上限为16符号连接
EFAULT         参数buf为无效指针,指向无法存在的内存空间
EACCESS        存取文件时被拒绝
ENOMEM         核心内存不足
ENAMETOOLONG   参数file_name的路径名称太长
struct stat {
dev_t         st_dev;       //文件的设备编号
ino_t         st_ino;       //节点
mode_t        st_mode;      //文件的类型和存取的权限
nlink_t       st_nlink;     //连到该文件的硬连接数目,刚建立的文件值为1
uid_t         st_uid;       //用户ID
gid_t         st_gid;       //组ID
dev_t         st_rdev;      //(设备类型)若此文件为设备文件,则为其设备编号
off_t         st_size;      //文件字节数(文件大小)
unsigned long st_blksize;   //块大小(文件系统的I/O 缓冲区大小)
unsigned long st_blocks;    //块数
time_t        st_atime;     //最后一次访问时间
time_t        st_mtime;     //最后一次修改时间
time_t        st_ctime;     //最后一次改变时间(指属性)
};
该方法最简单,也是流程最广的,但最容易被破解。在使用该方法的时候,注意使用底层的c函数 stat函数来判断以下路径名,路径名做编码处理(不要使用base64编码),千万不要使用NSFileManager类,会被hook掉

 

(2) /etc/fstab文件的大小
该文件描述系统在启动时挂载文件系统和存储设备的详细信息,为了使得/root文件系统有读写权限,一般会修改该文件。虽然app不允许查看该文件的内容,但可以使用stat函数获得该文件的大小。在iOS 5上,未越狱的该文件大小未80字节,越狱的一般只有65字节。
代码如下
6597704184865825988
在安装了xCon的越狱设备上运行,result的大小为803705776 ;卸载xCon后在越狱设备上运行,result的大小为66
个人觉得该方法不怎么可靠,并且麻烦,特别是在app在多个iOS版本上运行时。xCon对此种方法有检测,不能采用这种办法
(3)检查特定的文件是否是符号链接文件
iOS磁盘通常会划分为两个分区,一个只读,容量较小的系统分区,和一个较大的用户分区。所有的预装app(例如appstore)都安装在系统分区的/Application文件夹下。在越狱设备上,为了使得第三方软件可以安装在该文件夹下同时又避免占用系统分区的空间,会创建一个符号链接到/var/stash/下。因此可以使用lstat函数,检测/Applications的属性,看是目录,还是符号链接。如果是符号链接,则能确定是越狱设备。
以下列出了一般会创建符号链接的几个文件,可以检查以下文件
6598150586586535859

代码如下:

6597655806354205806
没有检测过未越狱设备的情况,所以不好判断该方法是否有效
(二)http://theiphonewiki.com/wiki/index.php?title=Bypassing_Jailbreak_Detection 给出了以下6种越狱监测方法
1、检测特定目录或文件是否存在
检测文件系统是否存在越狱后才会有的文件,例如/Applications/Cydia.app, /privte/var/stash
一般采用NSFileManager类的- (BOOL)fileExistsAtPath:(NSString *)path方法(很容易被hook掉)
或者采用底层的C函数,例如fopen(),stat() or access()
《Hacking and Securing iOS Applications》的方法2文件系统检查相同
xCon对此种方法有检测
2、检测特定目录或文件的文件访问权限
检测文件系统中特定文件或目录的unix文件访问权限(还有大小),越狱设备较之未越狱设备有太多的目录或文件具备写权限
一般采用NSFileManager类的- (BOOL)isWritableFileAtPath:(NSString *)path(很容易被hook掉)
或者采用底层的C函数,例如statfs()
xCon对此种方法有检测
3、检测是否能创建子进程
检测能否创建子进程,在非越狱设备上,由于沙箱保护机制,是不允许进程的
可以调用一些会创建子进程的C函数,例如fork(),popen()
《Hacking and Securing iOS Applications》的方法1沙盒完整性检查相同
xCon对此种方法有检测
4、检测能否执行ssh本地连接
检测能否执行ssh本地连接,在绝大多数的非越狱设备上,一般会安装OpenSSH(ssh服务端),如果能检测到ssh 127.0.0.1 -p 22连接成功,则说明为越狱机
xCon对此种方法有检测
5、检测system()函数的返回值
检测system()函数的返回值,调用sytem()函数,不要任何参数。在越狱设备上会返回1,在非越狱设备上会返回0
sytem()函数如果不要参数会报错
6597409515750961892
6、检测dylib(动态链接库)的内容

这种方法是目前最靠谱的方法,调用_dyld_image_count()和_dyld_get_image_name()来看当前有哪些dylib被加载

测试结果:
使用下面代码就可以知道目标iOS设备加载了哪些dylib

#include

#import

#import

#import


void printDYLD()

{

//Get count of all currently loaded DYLD


uint32_t count = _dyld_image_count();


for(uint32_t i = 0; i < count; i++)


{


//Name of image (includes full path)


const char *dyld = _dyld_get_image_name(i);

//Get name of file


int slength = strlen(dyld);

 

int j;


for(j = slength – 1; j>= 0; –j)


if(dyld[j] == ‘/’) break;

 

printf(“%s\n”,  dyld);


}


printf(“\n”);


}


int main(int argc, char *argv[])

{


printDYLD();

 

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];


int retVal = UIApplicationMain(argc, argv, nil, nil);


[pool release];


return retVal;


}

下图显示了我的iOS设备当前加载的dylib的路径,最下面就可以看到xCon

6597237991936914762
此种方法存在一个问题,是否能通过app store审核呢?
二、越狱检测绕过——xCon
可以从Cydia中安装,是目前为止最强大的越狱检测工具。由n00neimp0rtant与Lunatik共同开发,它据说patch了目前所知的所有越狱检测方法(也有不能patch的应用)。估计是由于影响太大了,目前已不开放源码了。
安装xCon后,会有两个文件xCon.dylib与xCon.plist出现在设备/Library/MobileSubstrate/DynamicLibraries目录下
(1)xCon.plist
该文件为过滤文件,标识在调用com.apple.UIKit时加载xCon.dylib
6597805339935558059
(2) xCon.dylib
可以使用otool工具将该文件的text section反汇编出来从而了解程序的具体逻辑(在windows下可以使用IDA Pro查看)

DANI-LEE-2:iostools danqingdani$ otool -tV xCon.dylib >xContextsection

可以根据文件中的函数名,同时结合该工具的原理以及越狱检测的一些常用手段(文章第一部分有介绍)来猜其逻辑,例如越狱检测方法中的文件系统检查,会根据特定的文件路径名来匹配,我们可以使用strings查看文件中的内容,看看会有哪些文件路径名。

DANI-LEE-2:IAP tools danqingdani$ strings xCon.dylib >xConReadable

以下是xCon中会匹配的文件名

/usr/bin/sshd
/usr/libexec/sftp-server
/usr/sbin/sshd

/bin/bash
/bin/sh
/bin/sw
/etc/apt
/etc/fstab
/Applications/blackra1n.app
/Applications/Cydia.app
/Applications/Cydia.app/Info.plist
/Applications/Cycorder.app
/Applications/Loader.app
/Applications/FakeCarrier.app
/Applications/Icy.app
/Applications/IntelliScreen.app
/Applications/MxTube.app
/Applications/RockApp.app
/Applications/SBSettings.app
/Applications/WinterBoard.app
/bin/bash/Applications/Cydia.app
/Library/LaunchDaemons/com.openssh.sshd.plist
/Library/Frameworks/CydiaSubstrate.framework
/Library/MobileSubstrate
/Library/MobileSubstrate/
/Library/MobileSubstrate/DynamicLibraries
/Library/MobileSubstrate/DynamicLibraries/
/Library/MobileSubstrate/DynamicLibraries/LiveClock.plist
/Library/MobileSubstrate/DynamicLibraries/Veency.plist
/Library/MobileSubstrate/DynamicLibraries/xCon.plist
/private/var/lib/apt
/private/var/lib/apt/
/private/var/lib/cydia
/private/var/mobile/Library/SBSettings/Themes
/private/var/stash
/private/var/tmp/cydia.log
/System/Library/LaunchDaemons/com.ikey.bbot.plist
/System/Library/LaunchDaemons/com.saurik.Cydia.Startup.plist

NzI0MS9MaWJyYXJ5L01vYmlsZVN1YnN0cmF0ZQ==  (对应7241/Library/MobileSubstrate)

通过分析,xCon会绕过以下越狱检测方法

(1)    根据是否存在特定的越狱文件,及特定文件的权限是否发生变化来判断设备是否越狱

 

 

fileExistsAtPath:

fileExistsAtPath:isDirectory:

filePermission:

fileSystemIsValid:

checkFileSystemWithPath:forPermissions:

mobileSubstrateWorkaround

detectIllegalApplication:

(2)       根据沙箱完整性检测设备是否越狱

canUseFork

(3)       根据文件系统的分区是否发生变化来检测设备是否越狱

partitionsModified

(4)       根据是否安装ssh来判断设备是否越狱

ssh root@127.0.0.1

 

三、总结
总之,要做好越狱检测,建议使用底层的c语言函数进行,用于越狱检测的特征字符也需要做混淆处理,检测函数名也做混淆处理。第一部分介绍的以下三种方法,可以尝试一下
(1)检查常见的越狱文件是否存在,使用stat(),检查以下文件是否存在

/Library/MobileSubstrate/MobileSubstrate.dylib 最重要的越狱文件,几乎所有的越狱机都会安装MobileSubstrate

/Applications/Cydia.app/ /var/lib/cydia/绝大多数越狱机都会安装

/var/cache/apt /var/lib/apt /etc/apt

/bin/bash /bin/sh

/usr/sbin/sshd /usr/libexec/ssh-keysign /etc/ssh/sshd_config

(2)检查特定的文件是否是符号链接文件,使用lstat(),检查以下文件是否为符号链接文件

/Applications

/Library/Ringtones

/Library/Wallpaper

/usr/include

/usr/libexec

/usr/share

   (3)检差dylib(动态链接库)的内容,使用_dyld_image_count与_dyld_get_image_name,检查是否包含越狱插件的dylib文件

参考:
http://theiphonewiki.com/wiki/index.php?title=XCon
http://theiphonewiki.com/wiki/index.php?title=Bypassing_Jailbreak_Detection

分析特征码修改技术

如果你想学习免杀技术:
1.基础的汇编语言
2.修改工具(不指那些傻瓜式软件)。如:
OllyDbg . PEditor. C32ASM . MYCCL复合特征码定位器。UE .OC. 资源编辑器等。还有一些查壳 脱壳软件(如:PEID RL脱壳机等) . 以下是常用的几种免杀方法及工具:
一、要使一个木马免杀
首先要准备一个不加壳的木马,这点非常重要,否则 免杀操作就不能进行下去。 然后我们要木马的内存免杀,从上面分析可以看出,目前的内存查杀,只有瑞星最强,其它杀毒软件内存查杀现在还不起作用所以我们只针对瑞星的内存查杀,要进行内存特征码的定位和修改,才能内存免杀。
二、对符其它的杀毒软件
比如江民,金山,诺顿,卡巴。我们可以采用下面的方法,或这些方面的组合使用。
1>.入口点加1免杀法。
2>.变化入口地址免杀法
3>.加花指令法免杀法
4>.加壳或加伪装壳免杀法。
5>.打乱壳的头文件免杀法。
6>.修改文件特征码免杀法。
第三部分:免杀技术实例演示部分
一、入口点加1免杀法:
1.用到工具:PEditor
2.特点:非常简单实用,但有时还会被卡巴查杀。
3.操作要点:用PEditor打开无壳木马程序,把原入口点加1即可。
二、变化入口地址免杀法:
1.用到工具:OllyDbg,PEditor
2.特点:操作也比较容易,而且免杀效果比入口点加1点要佳。
3.操作要点:用OD载入无壳的木马程序,把入口点的前二句移到零区域去执行,然后又跳回到入口点的下面第三句继续执行。最后用PEditor把入口点改成零区域的地址。
三、加花指令法免杀法:
1.用到工具:OllyDbg,PEditor
2.特点:免杀通用性非常好,加了花指令后,就基本达到大量杀毒软件的免杀。
3.操作要点:用OD打开无壳的木马程序,找到零区域,把我们准备好的花指令填进去填好后又跳回到入口点,保存好后,再用PEditor把入口点改成零区域处填入花指令的着地址。
四、加壳或加伪装壳免杀法:
1.用到工具:一些冷门壳,或加伪装壳的工具,比如木马彩衣等。
2.特点:操作简单化,但免杀的时间不长,可能很快被杀,也很难躲过卡巴的追杀。
3.操作要点:为了达到更好的免杀效果可采用多重加壳,或加了壳后在加伪装壳的免杀效果更佳。
五、打乱壳的头文件或壳中加花免杀法:
1.用到工具:秘密行动 ,UPX加壳工具。
2.特点:操作也是傻瓜化,免杀效果也正当不错,特别对卡巴的免杀效果非常好。
3.操作要点:首先一定要把没加过壳的木马程序用UPX加层壳,然后用秘密行动这款工具中的SCramble功能进行把UPX壳的头文件打乱,从而达到免杀效果。
六、修改文件特征码免杀法:
1.用到工具:特征码定位器,OllyDbg
2.特点:操作较复杂,要定位修改一系列过程,而且只针对每种杀毒软件的免杀,要达到多种杀毒软件的免杀,必需修改各种杀毒软件的特征码。但免杀效果好。
3.操作要点:对某种杀毒软件的特征码的定位到修改一系列慢长过程。
第四部分:快速定位与修改瑞星内存特征码
一、瑞星内存特征码特点:由于技术原因,目前瑞星的内存特征码在90%以上把字符串作为病毒特征码,这样对我们的定位和修改带来了方便。
二定位与修改要点:
1>.首先用特征码定位器大致定位出瑞星内存特征码位置
2>.然后用UE打开,找到这个大致位置,看看,哪些方面对应的是字符串,用0替换后再用内存查杀进行查杀。直到找到内存特征码后,只要把字符串的大小写互换就能达到内存免杀效果。
第五部分:木马免杀综合方案
修改内存特征码——>1>入口点加1免杀法——> 1>加压缩壳——>1>再加壳或多重加壳
2>变化入口地址免杀法 2>加成僻壳 2>加壳的伪装。
3>加花指令法免杀法 3>打乱壳的头文件
4>修改文件特征码免杀法
注:这个方案可以任意组合各种不同的免杀方案。并达到各种不同的免杀效果。
第六部分:免杀方案实例演示部分
1.完全免杀方案一:
内存特征码修改 + 加UPX壳 + 秘密行动工具打乱UPX壳的头文件。
2.完全免杀方案二:
内存特征码修改 + 加压缩壳 + 加壳的伪装 )
3.完全免杀方案三:
GD内存特征码修改 + 修改各种杀毒软件的文件特征码 + 加压缩壳
4.完全免杀方案四:
内存特征码修改 + 加花指令 + 加压壳
5.完全变态免杀方案五:
内存特征码修改 + 加花指令 + 入口点加1 + 加压缩壳UPX + 打乱壳的头文件
还有其它免杀方案可根据第五部分任意组合

PHP 使用 GeoLiteCity 库解析 IP 为地理位置

关于把 IP 地址转换为地理位置可以使用网络上很多的 API,好处就是不用在本地存储一个 IP 数据库,而且一般网络上的 IP 库会自动更新,不利的地方就是太依赖于网络,性能表现也可能会弱些。比如像下面的 API:

http://api.hostip.info/get_html.php?ip=58.63.236.31
http://api.hostip.info/flag.php?ip=58.63.236.31

这里介绍 PHP 如何使用 GeoLiteCity.dat 库把 IP 转换为地理位置,GeoLiteCity.dat 可以在 http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz 下,解压出 GeoLiteCity.dat,即可,我们可以手动去更新新的 IP 库。

下面 PHP 解析 IP 的过程参考自 WordPress 插件 Visitor Maps and Who’s Online 的实现。可以找到该插件的两个文件 include-whos-online-geoip.php 和 visitor-maps.php 告诉了我们怎么做。你可以点击这里的链接下载到这两个文件,我这里把 include-whos-online-geoip.php 改名为 geoipcity.inc.php,然后参考 visitor-maps.php 中的 get_location_info($user_ip) 函数,那么我们可以写出自己的解析 IP 地址的程序 resolve_ip.php:

city)) ? $record->city : '';  //城市
    $location_info['state_name']   = (isset($record->country_code) && isset($record->region)) //州名
          ? $GEOIP_REGION_NAME[$record->country_code][$record->region] : '';
    $location_info['state_code']   = (isset($record->region)) ? strtoupper($record->region) : ''; //州代号
    $location_info['country_name'] = (isset($record->country_name)) ? $record->country_name : '--'; //国家名
    $location_info['country_code'] = (isset($record->country_code)) ? strtoupper($record->country_code) : '--'; //国家代号
    $location_info['latitude']     = (isset($record->latitude)) ? $record->latitude : '0';   //维度
    $location_info['longitude']    = (isset($record->longitude)) ? $record->longitude : '0'; //经度
    //php 站点设置了 utf-8 字符集必要时进行转码
    $charset = 'utf-8';
    // this fixes accent characters on UTF-8, only when the blog charset is set to UTF-8
    if ( strtolower($charset) == 'utf-8' && function_exists('utf8_encode') ) {
        if ($location_info['city_name'] != '' ) {
            $location_info['city_name'] = utf8_encode($location_info['city_name']);
        }
        if ($location_info['state_name'] != '') {
            $location_info['state_name'] = utf8_encode($location_info['state_name']);
        }
        if ($location_info['country_name'] != '') {
            $location_info['country_name'] = utf8_encode($location_info['country_name']);
        }
    }
    return $location_info;
}
//查询一个 IP 测试下
$record = get_ip_record("206.19.49.154");
var_dump($record);
$location = get_location_info("206.19.49.154");
var_dump($location);
?>

执行后输出如下(可以作为系统脚本直接用 php resolve_ip.php 来执行):

object(geoiprecord_VMWO)#2 (10) {
  ["country_code"]=>
  string(2) "US"
  ["country_code3"]=>
  string(3) "USA"
  ["country_name"]=>
  string(13) "United States"
  ["region"]=>
  string(2) "TX"
  ["city"]=>
  string(10) "Richardson"
  ["postal_code"]=>
  string(5) "75080"
  ["latitude"]=>
  float(32.9722)
  ["longitude"]=>
  float(-96.7376)
  ["area_code"]=>
  int(972)
  ["dma_code"]=>
  float(623)
}
array(7) {
  ["city_name"]=>
  string(10) "Richardson"
  ["state_name"]=>
  string(5) "Texas"
  ["state_code"]=>
  string(2) "TX"
  ["country_name"]=>
  string(13) "United States"
  ["country_code"]=>
  string(2) "US"
  ["latitude"]=>
  float(32.9722)
  ["longitude"]=>
  float(-96.7376)
}

 

只要取你想要的数据就是了,里面还有诸如区号,邮编等数所,GeoLiteCity.dat 是个二进制文件,比普通文本要紧凑省空间。

不知道您有没有多留一份心,有无浏览链接:http://geolite.maxmind.com/download/geoip/api/php/,是这样的:

geopi_11

看到 GeoIp 给我们提供了不少的例子,那么多 sample.php,而实际上前面用到的 geoipcity.inc.php,就是 geopip.inc、geoipcity.inc 和 geoipregionvars.php 三个程序的内容合体。

再往上看:

geopi_21

官方提供的 API 何止 PHP 啊,几乎能全线满足您的实际需求了,c、java、perl、python、vb、ruby、tcl 等……,放其他程序里以后也不用愁了。

再进到 http://geolite.maxmind.com/download/geoip/database/ 瞧瞧:

geopi_31

正考虑着呢,不是说 IPv4 快用净了吗?IPv6 的数据也正为我们准备着呢?当然,天朝的 IPv9 恐怕永远不会有的。

本只是把 Visitor Maps and Who’s Online 里的解析 IP 的做法抽出来用用,可总能不断 深入再深入,不知道可喜还是可怕了。

其實很久以前就注意到,某些計數器可以很準確的判定IP來源的位置,甚至連所在城市都可以顯示出來
後來才知道是因為有GeoIP這樣的東西
MaxMind – GeoIP | IP Address Location Technology
這是MaxMind開發的東西,有不同平台的API和定期更新的”IP-位置”資料庫
如果要在網站上應用的話,可以找Apache module,perl和php的API

在Apache上面的模組叫”mod_geoip
さすが,租用的主機空間不可能給我隨便安裝模組,所以先在自己的電腦試…
不過仔細看才發現那檔案是linux上面用的,只有個c檔要自己make install
好吧…只好跳過…不想為了這東西去裝linux

再來試試perl,它的module是”Geo::IP
這也是要安裝的,所以先在自己的電腦試..
不過不知道是不是activeperl的版本問題,根本就裝不起來…orz
在目前的主機上面雖然可以自己安裝perl module,但是卻限制CPAN上面的東西,還好搜尋了一下就發現這個模組
Apache2::Geo::IP 
但是不知道為什麼,安裝到最後出現錯誤:

 CODE:
  CPAN.pm: Going to build R/RK/RKOBES/Apache-GeoIP-1.99.tar.gz

Please install either mod_perl 1 or mod_perl 2 first at Makefile.PL line 118.
No 'Makefile' created  RKOBES/Apache-GeoIP-1.99.tar.gz
/usr/bin/perl Makefile.PL PREFIX=/home/jwintaiw/perl/usr -- NOT OK
Running make install
Make had some problems, won't install

呃阿…orz
還好仔細看,發現主機裡面有預裝另外一個類似功能的”Geo::IPfree
它會從ip或主機名尋找之後回傳三個變數的陣列:二文字國碼,國家全名,IP
小試了一下可以動作,不過速度無敵慢!

最後嘗試PHP API
網頁上面有geoip和geoipcity兩種,前者是從ip/主機名尋找之後回傳二文字國碼和國家全名;後者是回傳更詳細的位置資訊,包含國家,程式和經緯度
不過兩者資料庫差很多,geoip需要的資料庫大約1MB附近,但是geocity的資料庫快30MB…|||
這邊照著該網頁上放的範例自己弄了一個測試的程式,有興趣可以試試…
http://snow-sugar.net/lookup.php (會放多久不確定,因為database太大)
同樣的東西也在自己電腦的自架網站動作確認,感覺大概像這樣
8184315216_f2s

其實最重要的應用不在這裡,而是可以利用辨識來源IP的國家進而讓server作不同的動作,例如台港的IP就自動轉入中文頁面,歐美的IP就自動轉入英文頁面,韓國的IP就block等等…因為IP對應位置的資料庫有持續更新,也讓誤動做的可能減少

EXCEL、WORD、POWERPOINT+VBA利用CDO组件发送邮件

前几天学习宏病毒的时候用到了,顺手记录一下~
Sub EMAIL()
Dim cm As Variant
Set cm = CreateObject(“CDO.Message”) ‘创建对象
cm.From = “” ‘设置发信人的邮箱
cm.To = “” ‘设置收信人的邮箱
cm.Subject = “主题:邮件发送试验” ‘设定邮件的主题
‘cm.TextBody = “宝坻一中信息中心/” ‘使用文本格式发送邮件
cm.HtmlBody = “邮件发送试验^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^” ‘使用html格式发送邮件
‘cm.AddAttachment Server.MapPath(“test.zip”)
‘发送附件test.zip。
stUl = “http://schemas.microsoft.com/cdo/configuration/” ‘微软服务器网址
With cm.Configuration.Fields
.Item(stUl & “smtpserver”) = “smtp.bdyz.net” ‘SMTP服务器地址
.Item(stUl & “smtpserverport”) = 25 ‘SMTP服务器端口
.Item(stUl & “sendusing”) = 2 ‘发送端口
.Item(stUl & “smtpauthenticate”) = 1 ‘
.Item(stUl & “sendusername”) = “changxi” ‘发送方邮箱名称
.Item(stUl & “sendpassword”) = “*************” ‘发送方邮箱密码
.Update
End With

cm.Send ‘最后当然是执行发送了
Set cm = Nothing
‘发送成功后即时释放对象
End Sub

在PPT和Word中添加带有语法高亮的代码块

问题很简单,我想在ppt中添加带有语法高亮的程序代码,搞了几天,总算找到了比较好的解决方法了。

详细的要求如下:

1.代码带有语法高亮。

2.结果是矢量图,也就是说可以随便缩小放大的,因此别拿直接对代码截图来忽悠我。

3.最好带有行号。

 

方法一:

下载软件SciTE,下载地址:http://www.fauskes.net/nb/syntaxms/

这个软件是我从网上搜到的,外国人写的。效果如下:

0_1318335729CRmh

不过要把带有语法高亮的格式拷贝到ppt里有点麻烦,把代码复制到这个软件内,然后用Copy as RTF复制,再粘到Word里面,然后再在ppt里面选择性粘贴为带格式文本。

当然这种方法不满足条件3。

PPT里的效果如下:

0_13183357924zyj

好吧,其实我想说一开始我看到大段的英文就很头疼,我简单看了下,没有看到在ppt里面需要额外的步骤,直接粘贴了,结果当然很失望,于是继续找其他的方法。

 

 

以下两个应该是我自己原创的吧。

方法二:

首先使用notepad++打印源代码的话可以获得带有完整语法高亮的代码,我一般打印成pdf,但是pdf在PPT里面虽然能够直接插入,但是pdf一般都是一整页A4,如果代码比较短的话需要对pdf重新进行裁剪,还是比较麻烦的。

这个方法不满足条件2,虽然在pdf里面内容是矢量的,但是我发现在PowerPoint里面插入pdf后放大时出现了模糊。

 

方法三:

继续想,本质上我想要一个矢量图,所以我就想到了eps格式,把pdf另存为eps后就直接能够在PPT里面像插入图片一样插入代码了。编辑是也可以直接像编辑图片一样,比较方便,可以随意裁剪。

这种方法基本能够满足上述三个条件了。

效果如下:

0_1318335993rYrE

 

最后总结一下,整体的思路分为两个方向:

a)将代码自动转换成带有格式的文本。方法一是这个路子,另外一个流产的方法是生成html代码然后插入到PPT里,但是这个我没有试成功。

b)将代码转换成带有语法高亮的矢量图。方法二、三都是这个思路,虽然方法二在实际插入到PPT中时失去了矢量图的特性。而将代码转换成带语法高亮的图片则是依靠Notepad++强大的打印功能。

 

个人推荐方法三,因为我不是很喜欢SciTE里的语法高亮,而Notepad++提供了各种语法高亮方案,可以自定义输出,并且可以输出行号。

 

 

10月18日更新

找到了一个比SciTE更加强大的软件HightLight,官网是:http://www.andre-simon.de/

这款软件可以把源码输出成各种不同格式,例如tex、html等。我最初就是想找在Latex下的代码高亮而找到的。

0_1318930764lQin

就看这个界面就知道非常强大了……支持自动调整格式、添加行号、n多配色方案,字体设置等等……

 

不过需要注意的是,上述软件均对中文支持不好!!!代码有中文注释的话一律会被转换成乱码。建议转换前去掉注释或者干错习惯写英文注释。

10大最适合编程的字体推荐下载,让代码看起来更美更舒服!

现在有事没事就喜欢写写代码的人越来越多了,对于成天盯着屏幕工作的开发人员来说,编程代码可能是每天见得最多的东西了。可是绝大部分人都一直使用编辑器默认的字体,其实,换一套适合自己的编程字体不仅能让代码看得更舒服,甚至还能提高工作效率的!

如果你有想过换一种编程字体,却不知道哪里找合适的,那么看看异次元软件世界为您推荐的10款最适合编程的字体吧,这些字体能让你的代码瞬间“优雅”起来!换一种字体,换一番心情嘛。当然,除了编程之外,经常需要编辑英文文档的朋友同样适用……

前言:

下面字体的排序是作者的主观感受,每个人的喜好都不一样。建议您都试试,按照自己的喜好来选择。另外,还在使用 Windows XP 的同学,如果您希望显示到如截图中清晰的字体效果,则必须安装微软的ClearType设置程序对清晰度进行设置。

10. Courier

也叫Courier New,这大概是我们最熟悉的字体了,基本上所有系统都有。很不幸,很多终端和编辑器都默认使用此种字体,虽然不会影响使用,但它太无趣了。如果你正在使用这种字体,建议调大一点,并打开系统的 anti-aliasing (抗锯齿) 设置。

clip_image001

下载 Courier New 字体

9. Andale Mono

比Courier稍好,也是常见的默认字体。我感觉字母太宽了,字符间距也比较蠢。

clip_image002

下载 Andale Mono 字体

8. Monaco

Mac的默认字体,好像也只有Mac上有。小字号的时候表现不错,而且再大些也不寒碜。

clip_image003

下载 Monaco 字体

7. Profont

与Monaco类似的位图字体,你能够在Mac, Windows和Linux上面使用。小字号的时候表现好。非Mac平台上Monaco的最佳替代。喜欢小字号且不怕眼睛疲劳的同学可以考虑。

clip_image004

下载 Profont 字体

6. Monofur

独特的等宽字体,各种字号下都表现不错,但是需要设置anti-aliasing。怀旧而且喜欢与众不同的人推荐。

clip_image005

下载 Monofur 字体

5. Proggy

干净的等宽字体,好像很受Windows用户欢迎,但在Mac上也不错。使用时,字号可以小一点,无需anti-aliasing。

clip_image006

下载 Proggy 字体

4. Droid Sans Mono

开源字体,可以在这里下载,适合手机屏幕。是等宽字体中最突出的一个。可惜0和O区别不大。

clip_image007

下载 Droid Sans Mono 字体

3. Deja Vu Sans Mono

我最喜欢的免费字体系列,以Vera为基础,但是比后者提供更多字符了。适于任何字号,需要anti-aliasing。

clip_image008

下载 Deja Vu Sans Mono 字体

2. Consolas + 中文雅黑混合版

Consolas 是商业字体,专门为微软设计,微软不少产品上都有,所以很可能你的系统上已经有了。需要anti-aliasing。如果不是商业的,我可能就把它放第一了。Consolas仅含英文字母部分,这里提供的是雅黑中文+Consolas英文的混合体,即使代码里有中文注释显示效果也能很好的!

clip_image009

下载 Consolas 雅黑字体

1. Inconsolata

我最喜欢的等宽字体,免费。我遇到它之后,很快就把原来的默认字体Deja Vu Sans Mono抛弃了。真正适合任何字号的好字体。感谢它的创造者Raph Levien!

clip_image010

下载 Inconsolata 字体

How to Install Java on Linux

Java allows you run cross-platform applications that can run on Mac OS-X, Linux, and Windows (among other OSs) without modification. Here’s how to install it on a GNU/Linux machine.

Steps

Manual Non-RPM Method

This is the generic method that also works with GNU/Linux clones that do not support RPM. It does not require administrator rights and allows installing multiple Java versions on the same computer.

  1. 1.Download the JDK.[1].
    • Click on the “Download” link under Java Platform (JDK) 7u4.
    • Accept the license and continue.
  2. 2.Select the right download. Under the “Product/File Description” you should pick your corresponding Linux option. For example, if you’re running Linux x86 (32-bit), you need to choose the corresponding “*.tar.gz” version.

    2943-21

  3. 3.Download the file as a .gz. Save it to your GNU/Linux machine.
  4. 4.Switch to the directory where you saved the file. You do not need to be a root and only must have the write access to the folder where you wish to install Java. If your administrator is not supportive, you may need to place Java into your home folder or (even better) on some shared network location
  5. 5.Uncompress the file. For example, you could do this in your home folder. Uncompressing will create a folder called “jdk1.7.0_04”. Java is now installed.
    • The installed Java jre is rather independent and can be easily moved into another place just by copying all its files.
    • You can install multiple different jre’s this way: they coexist together and can be used if some software requires the older version to run.
  6. 6.Launch Java. The Java executable you need to launch is located in a subfolder, called “bin.” This way of installation will not configure a default Java command for you — you must do this manually or always include the full path in your startup script.

Manual RPM Method

This seems like a “more civilized” way to install Java because it allows the installer to check the dependencies on some system libraries that may be missing. However, it does not support versioning easily and may fail even in some systems that do support RPMs. (Though the current Java installations are rather self-dependent and the required minimal requirements are usually satisfied anyway.)

  1. 1.Download the JDK.[2].
    • Click on the “Download” link under Java Platform (JDK) 7u4.
    • Accept the license and continue.
  2. 2.Select the right download. Under the “Product/File Description” you should pick your corresponding Linux option. For example, if you’re running Linux x86 (32-bit), you need to choose the corresponding “*.rpm” version, for example “jdk-7u4-linux-i586.rpm”.

    2943-2

  3. 3.Download the .rpm file. Save it to your GNU/Linux machine.
  4. 4.Log in as root and switch to the directory where you saved the file. Or, become root by running su and entering the super-user password.
  5. 5.Install the rpm file by executing ‘rpm -ivh filename.rpm’, where filename is the name of your .rpm file. (Such as jdk-7u4-linux-i586.rpm).
    • You may receive a message telling that program “rpm” is not installed.
    • If that is the case the program “rpm” is not installed. You need to install it writing: sudo apt-get install rpm. Enter your password, and you’re finished.
  6. 6.Create symbolic links. If you want to be able to execute this version of Java interpretor or compiler from any directory on your GNU/Linux system, you will have to create a few symbolic links:
    • sudo ln -s -v jdk1.7.0_04/bin/java /usr/bin/java
    • sudo ln -s -v jdk1.7.0_04/bin/javac /usr/bin/javac
    • Note that by installing using this method there could be dependencies that fail. It is better to use the package installer that handles all dependencies for you, since you will not be able to use Java correctly until the dependencies are resolved.

Ubuntu Method Using a GUI Package Manager

  1. 1.Open a package manager. You can use Synaptic or Adept Manager.
  2. 2.Install Open JDK. Java JDK and JRE are not available for installation through GUI Package Manager. You’ll need to install Open JDK instead.
    • Perform a search for openjdk-7-jdk.
    • Select openjdk-7-jdk for installation. Depending on the package manager, you may be asked if you wish to install the required dependencies or it will automatically select them without confirmation. For example, the openjdk-7-jre was already selected by Synaptic Package Manager. If you want to use Java as a plug-in in your browser, then also select to install icedtea-7-plugin.
  3. 3.Apply the changes. Click the button to apply the changes. Depending on the package manager, a pop-up window may appear asking for you to confirm the changes.
  4. 4.Wait for Java to install.

Ubuntu Method Using a Console

  1. 1.Enter one of the following commands into your console program:
    • sudo apt-get install openjdk-7-jdk openjdk-7-jre (if you don’t want the browser plug-in)
    • sudo apt-get install openjdk-7-jdk openjdk-7-jre icedtea-7-plugin (if you do need the plug-in)
    • apt-get automatically takes care of the dependencies and lists the changes for confirmation.
  2. 2.Enter y to confirm the installation.

Ubuntu OpenJDK Method Using a Console

  1. 1.Ubuntu no longer supports the Sun Java package in favor of OpenJDK.
  2. 2.Enter one of the following into your console program:
    • If you do not want the browser plugin, sudo apt-get install openjdk-6-jre.
    • If you do want the browser plugin, sudo apt-get install openjdk-6-jre icedtea6-plugin
    • If you’re working on a server without graphics, and want an environment just for running server applications (e.e. Tomcat or Glassfish), sudo apt-get install –no-install-recommends openjdk-6-jre-headless
    • If you need the full JDK (for writing Java programs): sudo apt-get install openjdk-6-jdk
    • apt-get automatically takes care of the dependencies and lists the changes for confirmation.
  3. 3.Enter y to confirm the installation.

Tips

  • It’s much easier to install from the repositories than from the download on Oracle’s site.
  • Even though it might be unfamiliar to you, using the console method is actually easier than the GUI method.
  • If you find how-to specific for your distribution we recommend using it because in some distributions, Java can be included in the software repositories (which you can benefit from).
  • On Red Hat 8.0 Linux, one could start a Nautilus file manager, desending to the directory, and click on the name of the rpm filename and activate the installation process. This does not work any more in Fedora Core 4 (other FC versions not tested). In reality, if you do this you will get a (warning) message saying that the file name indicates the file is not executable while the content of the file is of the type “executable”.
  • Another tip to follow progress of the rpm install is to use ‘rpm -ivv … ‘ which turns on theverbose output and gives you more info on the install as it progresses. You can do the same thing with other rpm actions to get rpm to be more verbose about what is going on.

Sources and Citations

  1.  www.oracle.com/technetwork/java/javase/downloads/index.html
  2.  www.oracle.com/technetwork/java/javase/downloads/index.html