100个,免得每次重装都又申请
99J6N-YD78Q-23Q37-43PLE
9C540-YD30P-296DH-4CQCM
93H4H-YDPAP-2129L-417CE
9904J-Y4286-23K9Q-4JJJ5
91J45-YF30L-29L4N-43HA5
991FH-Y47AQ-23K64-4UM3H
93JF4-Y4L87-23365-403C4
9CNDH-Y662Q-2334M-487H5
93NF5-YDP27-21PDH-4HMKE
91M6M-Y462Q-2173L-4TH08
93M41-YFQ8K-2C236-4HP9M
9C164-Y6707-233F1-4A7V5
99ND4-Y6L82-23L6H-4HQTW
990FM-Y4Q23-2374N-4H43X
930FM-YD78K-29716-4U51X
99H4M-YD72P-292D4-4V100
99440-Y4K87-29K93-4UQAJ
9154H-YD227-29K6J-4C6RD
9316J-YDPA3-2CLD0-49JU0
9CNF4-YFKA2-2C765-41KR0
934F0-Y6KAK-2CPDM-4VHAW
9956J-YFQ22-21292-4KJHE
9356H-Y438P-29K45-40QA9
93J44-YD2A2-29LD5-4R0T9
990FH-Y6P06-2C79P-4H6HH
91MFM-YD62L-2CQDN-4V1HX
99M44-YF203-2C345-43195
91M61-Y6Q8K-236CP-436U4
93H45-YF382-2C7F4-4U6HT
93N64-Y630P-2964J-4UK2E
9C5FN-Y6L8P-23396-4J1R0
91M44-Y4KA3-2CPDH-4CQ2T
991F4-YF202-297CQ-49L8R
99M6J-YFL2P-2C76M-42LJD
9CN4N-Y632Q-293D1-4A5K8
99J4N-YD70P-292FN-4CQ9D
994FJ-YFP8L-21661-4U62M
93H44-YF72K-296CL-4KQLJ
934F0-Y62AQ-2369L-4VKLE
910D1-Y6L0K-21QF1-41NUD
9CHD4-YDP8P-21KCP-4KN25
91444-Y6KA6-2979L-4T5RT
9116J-YDL8K-213D5-4J0HJ
93N61-Y4386-2371P-4JJ35
910F0-Y420K-23232-41LCH
99ND4-YD30L-21612-4TKUE
9C0F5-YFP23-212D1-4HL9E
91NF5-Y4323-21712-4U6CE
9C14J-Y4283-2C264-4H3L0
9114M-Y672K-2364M-42H3W
93JF0-YF727-2CL4J-40M00
91564-Y66AL-21P33-43221
9146N-Y6P8L-2C76M-491J5
9C1FJ-YDL86-2CLD0-4U7R5
9CJF5-Y6L06-2C297-4TH19
9C5DM-Y6726-29P4N-4AHJJ
93NFN-YFQ0P-21LF4-48N31
93NDM-YF78Q-21KD5-4U52W
990F1-Y6PAL-21217-4VQCR
9CH4N-Y4P0L-21PF4-4HNK1
9CJDN-YDP83-29Q97-4C5J5
9CMD0-YFK03-23L9Q-4UJT0
99N6J-YDP03-29K9P-4R5A8
990F5-YD202-232DN-4TM3D
9CJ4J-Y42A2-297F4-4JH94
91464-Y6L2Q-2CP60-4J4L4
9104M-Y6307-2374M-40QAM
93560-YFK2K-29365-4A00X
91JD4-YF7AK-29P9K-4T581
990FH-Y62AL-29PDN-4C11X
99N60-Y6KAQ-2CK9P-493TN
99141-YDQ0L-21L3L-4CNTX
91JDN-YD2A2-2CQ45-404LX
911FJ-Y6Q0P-23L1L-4C3UT
931F4-Y670K-29717-4TNJD
9C4DH-Y6Q27-21L13-4L2JN
9C14N-YDL8K-23QC3-4K7JT
9C045-Y4K06-23293-4K5RH
99145-Y4622-21QFM-43KLE
9CNDJ-Y4K2Q-2C732-4LPHJ
9CJDN-Y6Q26-23Q61-43L0N
994DN-YD207-21Q97-4H3UD
99J64-YFQ2Q-2C713-4L325
91144-YDQAQ-23K93-4U490
9346H-YD20Q-21K3L-4VQ94
91N40-Y4P87-29QD5-4T78W
9C041-YDQAL-29360-4CJ88
91M6N-YD3A7-23Q4M-40PR8
99M45-Y67AL-2C29Q-4U5TW
99HFH-YF6AK-2CL40-4TLAJ
93H4J-YDL2K-233DJ-43KT1
93M6J-Y4L0K-296D4-410TR
9C161-YF7A6-2C7F1-4L0LR
9C1DN-YFQA7-23LDM-40L9R
91J45-YDP8Q-213F1-480HH
9C1F0-YF22K-212DN-4R581
93H4M-Y4727-21QCK-4JLAE
99J61-YFQ27-296DN-4KQ3N
99461-Y460L-2121P-4H38R
93NDH-Y62A2-2CK4H-4UHV0
2008年8月18日
vmware 激活码
天才Phelps(菲尔普斯)
![]()
个人信息:
全名: Michael Fred Phelps
昵称: 巴尔的摩子弹
国籍: 美国
游泳项目: 蝶泳,个人混合泳,自由泳,仰泳
出生日期: 1985.6.30
出生地: Baltimore, Maryland, United States
身高: 1.93m
体重: 91kg
在2008北京奥运会上简直让世人感到震惊,一人一届就获得8玫金牌,人家一个国家一玫金牌都还没有呢!打破了Mark Spitz的一届7玫金牌的记录。
1985年出生,同时代的人阿,呵呵。到现在他已经得了16块奥林匹克的奖牌了,其中2004雅典奥运会获得6玫金牌(gold),2玫铜牌(Athens),2008北京奥运会获得8玫金牌。
和他同时代的人是否有种如NBA遇上乔丹的苦恼?
LINUX Fork bomb
看了某书,防止DOS攻击,修改/etc/security/limits.conf
* hard core 0
* hard rss 5000
* hard nproc 20
于是重启后,出现
resource temporarily unavailable
查了相关资料,原来是这个配置文件的问题,第三行是限制用户的fork进程数的,这里太小了,以至于不够用了,进个图形界面都超过限制了,于是修改一下:
* hard nproc 100
现在够用了,顺便了解了一下forkbomb(fork炸弹)
fork就是用来创建进程的,fork炸弹就是通过快速的创建很多进程让你机器挂掉,属于拒绝服务攻击的一种,因为进程数量是有限的,可以通过命令ulimit -a查看
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 16383
max locked memory (kbytes, -l) 32
max memory size (kbytes, -m) 10000
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 100 最大用户进程数
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
这里看到和刚才配置文件/etc/security/limits.conf设置的一样,用-u命令可以直接改成你要的限制数目。
举例:
下面这段代码可以作为一个fork炸弹(Jaromil ,2002),在bash下执行
:(){ :|:& };:
windows下的fork炸弹,batch编写
:s
START %0
GOTO :s
更简洁的写法:
%0|%0
perl语言:
#!/usr/bin/perl
fork while 1
Haskell:
import Control.Monad
import System.Posix.Process
forkBomb = forever $ forkProcess forkBomb
Python:
import os
while True:
os.fork()
c语言:
#include
int main(int argc, char* args[])
{
while(1)
fork();
return 0;
}
PHP:
while(1)
pcntl_fork();
x86(fasm):
format ELF executable
entry start
start:
push 0x2 ; Linux fork system call
pop eax ;
int 0x80 ; Call to the kernel
jmp start ; Loop back to the start
通过不停的申请内存造成内存不足也可以达到同样效果。
C:
#include
#include
int main(void) {
/* An infinite loop. */
while (1) {
/* Try to allocate 1MB of memory. */
malloc(1048576);
/* Fork the process so that we have exponential growth in memory. */
fork();
}
return EXIT_SUCCESS;
}
因为现代的操作系统运用了Copy-on-write虚拟内存技术,也就是你不使用的话,他不会真正的分配到物理内存。
上面代码修改成这样就可以:
#include
#include
int main(void) {
int *x;
while (1) {
fork();
/* Allocate the memory to a pointer to int */
x = malloc(sizeof(int) * 1048576);
/* Try to use the newly allocated memory */
*x = 0;
}
return EXIT_SUCCESS;
}
这段代码只影响其中第一页,要想影响整个1M空间,必须至少使用每一页的一个字节
解决方法:
一个成功的fork bomb除非reboot,系统不会恢复,因为已经不能新建进程(kill)来杀掉炸弹进程。
:(){ :|:& };:
这段代码的作用是不能再fork,我们可以用一个什么也不做的新进程,每一个新进程都可以减少一个forkbomb的数量,最后就可以消灭掉它,然后这个新进程就可以退出了。
Z Shell语法:
while (sleep 100 &!) do; done
预防:
像最开始修改配置文件/etc/security/limits.conf一样,我们限制用户的最大进程数量(以至于俺限制得过分了^_^!!)。
linux补丁如grsecurity可以检测哪个用户执行了fork炸弹程序
参考:http://en.wikipedia.org/wiki/Forkbomb
2008年8月17日
OLLYDBG消息断点+控件ID 准确下断
这篇文章是CCDEBUGER的OD教程五的补充,很好
作 者: hklzt
时 间: 2007-06-06,16:50
联 系: QQ:87784858
看完了《OllyDBG 入门系统(五)-消息断点及 RUN 跟踪》之后感觉如何?会否有如下问题:
1、 是否觉得不知道在哪下断?
2、 为什么要这样子下断?
3、 如何确定断下来后的位置就是正确的?
好,就本着这几个问题来分析一遍。
首先,先回顾下Windows的消息机制。要点:所有要处理的消息必然会由程序自己处理,不处理的消息都交由Windows处理。Windows的消息处理函数的格式,如下:
LRESULT CALLBACK WindowProc(
HWND hwnd, // handle of window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
);
其中uMsg就是关键,它代表消息的类型,如:WM_COMMAND,WM_GETTEXT等。记好哦。
下面,我们来用实例讲解。
这个CrackMe是用对话框做的(你是怎么知道的?)。
1、 用OllyDbg加载,Crtl + N,找到函数:USER32.DialogBoxParamA,右击->“在每个参考上设置断点”。
2、 F9,运行。看,被拦了下来,如图:
3、 其中DlgProc的内容,就是我们需要找的东东。这个地址是消息处理函数的入口点。现在来解释为什么要在窗口那才有消息断点,看图,
要下消息断点,首先得找到具有Windows消息处理函数格式的函数,然后,再根据栈的数据来判断消息,如果符合下断的消息,那么,OllyDbg就会拦下来(还会觉得不知道在哪下消息断点了吗?知道该如何下消息断点了吧?)。很明显有一点,这个消息断点的功能是有限的,比如,要拦主窗口中的菜单消息呢?所以,消息断点的功能还是有限的。如何扩展?扯远了,下面再讲。
4、 Ctrl + G来到cyle.0041029,我们来到了消息处理函数了,但是,OllyDbg并未识别出这个函数是消息处理函数。所以,在cyle.0041029处,右击->“分析”->“假定参数”,如图:
弹出一个对话框,选择“WinProc(hWnd,msg,wParam,lParam)”。
点击“应用”后,如图。
5、在cyle.0041029处,右击->“断点”->“在WinProc上的消息断点”(平时是不是没见过这个菜单呀?呵呵)。
6、 在“消息”列表框中,选择你要下断的消息(Alt+B,删除以前的断点,以免影响心情)。
7、 F9,运行,程序运行起来了。这时没什么事情发生,当你在里面点了一个文本框之后(点它,是想让它获得Focus(焦点),以便能够输入数据),事情就发生了。现在没办法在文本框里输入注册码,也没办法点击按钮。这是怎么回事呢?仔细看一下Stack(栈)的那个窗口,噢!原来被文本框的通知 EN_SETFOUCE搞坏了!停留在EN_SETFOCUS和EN_KILLFOCUS两个消息之间了。
8、 好,现在来扩展消息断点(消息断点是否是条件断点的特殊例子?),即使用条件断点(卖弄了一下,呵呵)。
看你需求,条件和条件记录,在这里是没什么区别的,因为不需要记录的内容。
8、 按Shitf+F2,输入 MSG ==WM_COMMAND && [ESP+C]==66(这个66是怎么来的?这个就是那个Check按钮的ID,意思就是“当收到WM_COMMAND,且是由ID为0x66发出的时候中断”),确定,F9,运行。
9、现在,输入Name和Serial之后,点”Check”按钮。
10、这次中断,位置上似乎没有变化,但是,明白了消息处理机制,应该知道这次中断的不同吧?(这次会流程会流到注册算法那哦)
00401029 >/. >enter 0, 0 ; 解码为
0040102D |. >push ebx
0040102E |. >push edi
0040102F |. >push esi
00401030 |. >cmp [arg.2], 110
00401037 |. >je short cycle.0040105E
00401039 |. >cmp [arg.2], 111 //111=WM_COMMAND
00401040 |. >je short cycle.00401082 //肯定在这里跳(为什么?)
00401042 |. >cmp [arg.2], 10
00401046 |. >je short cycle.00401057
00401048 |. >cmp [arg.2], 2
0040104C |. >je short cycle.00401057
0040104E |. >xor eax, eax
11、来到 cycle.00401082,
00401082 |> \>cmp [arg.3], 67
00401086 |. >jnz short cycle.0040108D //这里肯定会跳
00401088 |. >call cycle.00401151
0040108D |> >cmp [arg.3], 66
00401091 |. >jnz short cycle.00401098 //这里肯定不会跳(又是为什么呢?)
00401093 |. >call cycle.0040109C //关键,
00401098 |> >xor eax, eax
12、蓝色部分,已经在CCDebuger那篇文章分析过了,这里就不分析了,我用红色字体来标明重点。
0040109C /$ >mov dword ptr ds:[402182], FEDCBA98
004010A6 |. >push 11 ; /Count = 11 (17.)
004010A8 |. >push cycle.00402171 ; |Buffer = cycle.00402171
004010AD |. >push 3E9 ; |ControlID = 3E9 (1001.)
004010B2 |. >push [arg.1] ; |hWnd
004010B5 |. >call
004010BA |. >or eax, eax
004010BC |. >je short cycle.0040111F
004010BE |. >push 11 ; /Count = 11 (17.)
004010C0 |. >push cycle.00402160 ; |Buffer = cycle.00402160
004010C5 |. >push 3E8 ; |ControlID = 3E8 (1000.)
004010CA |. >push [arg.1] ; |hWnd
004010CD |. >call
004010D2 |. >or eax, eax
004010D4 |. >je short cycle.0040111F
004010D6 |. >mov ecx, 10
004010DB |. >sub ecx, eax
004010DD |. >mov esi, cycle.00402160
004010E2 |. >mov edi, esi
004010E4 |. >add edi, eax
004010E6 |. >cld
004010E7 |. >rep movs byte ptr es:[edi], byte ptr>
004010E9 |. >xor ecx, ecx
004010EB |. >mov esi, cycle.00402171
004010F0 |> >/inc ecx
004010F1 |. >|lods byte ptr ds:[esi]
004010F2 |. >|or al, al
004010F4 |. >|je short cycle.00401100
004010F6 |. >|cmp al, 7E
004010F8 |. >|jg short cycle.00401100
004010FA |. >|cmp al, 30
004010FC |. >|jb short cycle.00401100
004010FE |.^ >\jmp short cycle.004010F0
00401100 |> >cmp ecx, 11
00401103 |. >jnz short cycle.0040111F //判断长度是否为16个有效字符,即16个字节,不是则跳
00401105 |. >call cycle.004011F1 //算法
0040110A |. >mov ecx, 0FF01
0040110F |. >push ecx
00401110 |. >call cycle.00401190 //算法
00401115 |. >cmp ecx, 1
00401118 |. >je short cycle.00401120 //需要跳
0040111A |> >call cycle.00401166
0040111F |> >retn
00401120 |> >mov eax, dword ptr ds:[402168]
00401125 |. >mov ebx, dword ptr ds:[40216C]
0040112B |. >xor eax, ebx
0040112D |. >xor eax, dword ptr ds:[402182]
00401133 |. >or eax, 40404040
00401138 |. >and eax, 77777777
0040113D |. >xor eax, dword ptr ds:[402179]
00401143 |. >xor eax, dword ptr ds:[40217D]
00401149 |.^ >jnz short cycle.0040111A //不可以跳
0040114B |. >call cycle.0040117B //提示注册成功!
00401150 \. >retn
终于写完了,现在来回顾下刚开始的问题:
1、 是否觉得不知道在哪下断?
答:在Windows消息处理函数的入口处下消息断点。
2、 为什么要这样子下断?
答:可能OllyDbg是根据栈的数据和函数原型来匹配,所以,一般来说,匹配条件都会是[Esp + XX] ==XXXXX
3、 如何确定断下来后的位置就是正确的?
答:这里是根据编程的思路以及Windows的消息处理机制来定位的,理论与实战相结合。
最后,总结下,由于windows是消息驱动的,很大一部分都是通过消息来完成的,所以,有很大一部分可以通过对消息下断来达到目的,但是,如何下消息断点?从大体上讲,是这样子的:1、找出消息循环处理的函数 2、在消息循环处理函数的入口处设断
写到这里,废话一下。赞扬CCDebuger的太多了,但是,在赞扬的同时,不知道大家有没仔细消化人家的成果?呵呵,其实,我也没有,因为我看不太懂,所以,还是照着自己的思路走。写这篇文章的目的是为了帮一位朋友,他想下消息断点,但是,不知道如何下,我就把CCDebuger的这那篇消息断点给他,可是,还是没解决,后来,自己也动了一下手,确实,对于WM_COMMAND消息来说,OD肯定会不停的拦下来的,所以,单纯的消息断点就行不通了,所以,再结合Run跟踪来记录下,刚好能解决问题,也就产生了CCDebuger的那篇文章(猜的,呵呵)。
最后,帮忙纠正下错误:
引用:
写到这准备跟踪算法时,才发现这个 crackme 还是挺复杂的,具体算法我就不写了,实在没那么多时间详细跟踪。有兴趣的可以跟一下,注册码是17 位,用户名采用复制的方式扩展到 16 位,如我输入“CCDebuger”,扩展后就是“CCDebugerCCDebug”。大致是先取扩展后用户名的前 8 位和注册码的前 8 位,把用户名的前四位和后四位分别与注册码的前四位和后四位进行运算,算完后再把扩展后用户名的后 8 位和注册码的后 8 位分两部分,再与前面用户名和注册码的前 8 位计算后的值进行异或计算,最后结果等于 0 就成功。注册码的第 17 位我尚未发现有何用处。对于新手来说,可能这个 crackme 的难度大了一点。没关系,我们主要是学习 OllyDBG 的使用,方法掌握就可以了。
关于“位”的概念,“位”,是指二进制位,在这里,一个字节等于8位,一个字符等于一个字节。“注册码是17位”,应改成“注册码是17个字节”,如果你跟踪分析过,你可以发现,这样子还是不对的,最后应该是“注册码是16个字节”,
cmp ecx, 11,这里的11是16进制,即十进制数:17。从代码中可以看出这个十进制数17,还得减1才是字符串的真实长度,所以,应该改成“注册码是16个字节”,后面的“位”,需要改成“字节”。第一次看的时候,没注意看,都给蒙了。
北京高考零分作文(搞笑)
题目:“细雨湿衣看不见,闲花落地听无声”是唐朝诗人刘长卿在《别严士元》中的诗句。曾经有人这样理解这句诗:
1、这是歌颂春天的美好意境。
2、闲花、细雨表达了不为人知的寂寞。
3、看不见、听不见不等于无所作为,是一种恬淡的处世之道。
4、这种意境已经不适合当今的世界……
根据你的看法写一篇作文。题目自拟,体裁不限。字数800以上。
盛夏,夜,深夜。
景山山颠。
山上有人,两个人,一男一女。
这两人就是当今武林名声最响的两位杀手,男的名秋细雨,女的叫叶闲花,江湖人称“细雨闲花”。
诗人刘长卿曾用“细雨湿衣看不见,闲花落地听无声”来描述这两个可怕的杀手。细雨湿衣,湿衣的是鲜血;闲花落地,落地的是人头。这两人杀人来无影去无踪,如果他们想杀你,当你还没看到他们人影没听到他们声音的时候,你就已经死了。
秋细雨三天前接到一份帖子,指名要杀叶闲花。事成之后,不但有三百万两冥币,更可以让他在“红楼梦中人”选秀节目中担任曹雪芹的角色!
但是杀死叶闲花比杀死比尔还要困难得多。
江湖中没有一个人清楚叶闲花的武功来历,性格脾气,但是每个人都知道叶闲花的故事。
叶闲花有一双迷人的大眼睛,据说她曾一动不动地瞪死过赵薇和高圆圆,而那一年她才十七岁。
叶闲花声音有如黄莺般幽婉醉人,传说听过她说话后林志玲身体酥麻了整整一年,你说要不要命?
叶闲花轻功独步武林,踏雪无痕,落地无声,号称超过当年青翼蝠王韦一笑。有人见她上星期在高速公路上偷了刘翔奥运会入场证,刘翔追出一万公里最后被活活累倒。
一般人听到叶闲花的故事早就吓得去买尿不湿了,但是秋细雨没有去买。
秋细雨不是一般人。
他知道,杀人不但要靠技术,还要拼人品!
秋细雨很镇定,他正用一把指甲刀修整着手指甲,他的手指修长有力。
他要等待,等待对方先沉不住气。高手相争,不允许一丝一毫的失误,先沉不住气的人就会露出破绽。
致命的破绽!
因此秋细雨一言不发,只是静静地玩弄着指甲刀。
没想到叶闲花更是好整以暇,自己悠然自得地涂口红,喷香水。
秋细雨只好先发制人,道:“你知道我找你出来是为什么。”
叶闲花温柔道:“在我们动手之前,不能先谈谈么?”
秋细雨道:“我是来杀人的,不是来聊天的。”
叶闲花道:“你有把握杀我?”
秋细雨道:“我从不做没有把握的事情。”
叶闲花道:“我要提醒你一件事。”
秋细雨道:“你说。”
叶闲花道:“百晓生作杀手谱,小女子是杀手榜排名第一,阁下区区第二,你真能杀得了我么?”
秋细雨道:“我也要提醒你一件事。”
叶闲花道:“你说。”
秋细雨道:“论杀手实力,我本在你之前,只是那次排名百晓生采用了短信投票系统,中国‘花痴’人数过于庞大才让你得了第一。”
叶闲花的脸色一变,道:“我更要提醒你,我的粉丝团叫‘花粉’,不叫‘花痴’!”
秋细雨道:“我最后要提醒你,你的那些‘花粉’全都是花痴。还有,我们已经跑题了。”
叶闲花道:“我们这样拼命厮杀,你难道不怕麻烦么?”
秋细雨道:“你以后再也不用怕麻烦了,天下只有一种人永远不怕麻烦,死人!”
叶闲花道:“这么说你非逼我出手不可?”
秋细雨没有回答,他已不用回答。
秋细雨道:“亮兵器!”
叶闲花道:“我用刀。”
秋细雨道:“你用刀?刀在何处?”
叶闲花道:“我就是刀!”
叶闲花露出甜甜的笑容,忽然间褪下了自己的衣服,全身上下只剩下蕾丝比基尼和黑色丝袜。
叶闲花的脸美得让人窒息,再配上这样的身材,这样的服饰,充满了一种原始的诱惑力。
她的眼睛会说话,她的媚笑会说话,她的手,她的胸膛,她的腿……她身上每分每寸都会说话。
她知道,只要是个不瞎的男人,现在肯定会被她迷得神魂颠倒。
秋细雨是个男人,而且是个不瞎的男人。
可他现在却偏偏好像瞎了一样,完全无动于衷。
他知道,美丽的女人是一把刀,当你沉醉的时候,刀就会切进你的胸口。
秋细雨沉吟道:“我只想问你一件事。”
叶闲花娇笑着:“请讲。”
秋细雨道:“大夏天的,穿这么少你丫不怕蚊子叮啊?”
叶闲花沉默了半晌,幽幽地道:“你一定以为刚才我在喷香水,是不是?我告诉你,我喷的是六神花露水!”
叶闲花又道:“不过这不是普通的六神,是我特别提炼的药水,无色无味无毒,不过却会慢慢扩散在空气中,闻到它的人会四肢麻痹不能动弹。”
秋细雨一惊,忽然觉得身体已经麻木不听使唤,不由得一身冷汗。
叶闲花又道:“你以为我和你扯淡是因为我害怕,以为我脱掉衣服是想色诱你,其实这都是为了拖延时间让药水能扩散到你周围。”
秋细雨面上不动声色,道:“难道你自己不怕药水的厉害?”
叶闲花得意地道:“一开始我涂的口红就是解药,所以我仍然可以自由行动。”
叶闲花逼视着秋细雨,问道:“现在你还认为你能杀了我么?”
秋细雨道:“我能。”
叶闲花道:“你不能动而我能动,你却能杀了我,这不是很好笑么?”
秋细雨道:“是很好笑,但是你一定会被我杀死。”
叶闲花道:“为什么我会被你杀死?”
秋细雨忽然反问道:“飞刀能不能杀人?”
叶闲花道:“好像能。”
秋细雨道:“我有没有手?”
叶闲花道:“的确有。”
秋细雨道:“我手上有没有刀?”
叶闲花道:“你手上好像只有指甲刀。”
秋细雨道:“足够了。”
叶闲花道:“足够了?”
秋细雨道:“我有手有刀,就能置人死地。”
叶闲花道:“指甲刀也能杀人?实在可笑!”
秋细雨道:“以前江湖中有七十三个人觉得我这把指甲刀很可笑。”
叶闲花道:“现在呢?”
秋细雨道:“现在人都已死了,死在这把刀下。”
叶闲花道:“你的手还能动?”
秋细雨道:“你要不要试试?”
叶闲花脸上的笑容渐渐凝固,忽然间,她已出手!
一招“冒牌九阴白骨爪”直逼秋细雨天灵盖,这一招她已练过七年四个月零二十九天,她完全有把握相信没有任何人可以抵挡得了这一招。
可这一次她错了。
刀光一闪,“盗版小李飞刀”已插入她的咽喉。
她到死也不相信,一把指甲刀可以要了她的命!
闲花终于落地!
三个时辰后,药水的药效渐渐淡去,秋细雨终于可以动弹了。
望着叶闲花的尸体,秋细雨道:“虽然你已经死了,但是我还要告诉你两件事。第一,我一直用甲刀修整着手指甲是为了调整手和刀之间的同步率,说白了就是找手感。第二,我杀你的真正目的不是为了钱或者名利。”
一边说,秋细雨一边从叶闲花衣服的口袋里搜出了刘翔的奥运会入场证。
秋细雨坚定地说:“我爱北京,我要看奥运!”
2008年8月16日
csdn遭封停?
最近写程序总搜索着一些问题的解答,不过好像csdn的访问让人莫名其妙,就是打不开,不管是公司的网络还是家里的,看来不妙。
据不可靠消息称csdn被封停了,原因是同一IP段的服务器播放奥运开幕式视频,导致整个IP段被封停,csdn就这样跟着倒霉了。
版权啊,谁都想分杯奥运羹,别拿自己的前途开玩笑,整得大家都莫名其妙,影响心情哈~~
国足,国耻?
由于国足的一再丢人,网络上掀起了一场骂潮,很有意思。摘录一下。
1.
布什:( 小胡)晚上去看篮球比赛!
涛哥:(害我啊)哎呀!晚上忙啊!
改天去看乒乓球吧
布什:(妈的,忽悠我)那你明天有空看
游泳比赛不?
涛哥:(怕你?)我已经决定去看跳水了,
那可是空中芭蕾啊!。
布什:(晕,看来不出狠的不行了)
那我们去看男足吧!
涛哥:(...)还是去看篮球吧
2.
我家球门常打开
要进几个随你
交锋过后就有了底
你会爱上这里
不管远近都是客人
请不用客气
进的少了别在意
下次补给你
我家住着谢亚龙
书写每段传奇
不懂足球也不要紧
仕途才是第一
陌生熟悉都是客人
请不用拘礼
谢主席他很热情
场场都陪你
国足欢迎你
为你敞开球门
再不济的实力
也能找信心
国足欢迎你
在主场上分享平局
哪怕你(世界)排名垫底
我家球门常打开
开怀容纳天地
一个两个不算稀奇
再多也输得起
天大地大都是朋友
请不用客气
场上梦游是惯例
场下才牛B
国足欢迎你
用红牌感动你
你们捞足积分
我们来出局
国足欢迎你
遇上了您就随便赢
有我们就会有奇迹
3.
上联“试问中国男足有多愁”
下联“恰似一群太监逛青楼”
横批“没人会射”
4.
珍爱生命远离国足
吸烟有害健康,看国足有害生命
看英超要钱看国足要命
正确使用数字电视机可有效预防国足
国足不是病踢起来真要命
5.
中国队要是能出线,我就投案自首!--拉登
中国队要是能出线,我就停止核武器!--内贾德
中国队要是能出线,我就改革开放!--金正日
中国队要是能出线,我就把靖国神社拆了!--小泉纯一郎
中国队要是能出线,我就认拉灯当干爹!--布什
中国队要是能出线,我就信佛!--上帝
中国队要是能出线,我就信上帝!--释迦牟尼
中国队要是能出线,我就回归!--阿扁
中国队要是能出线,我马上复活--阿拉法特
中国队要是能出线,我们就辞职!--中国足协最后说
中国队要是能出线,我就倒着转!--地球说
中国对要是能出线,我就从西边出来!--太阳说
中国对要是能出线,我就去给猫当伴娘!--耗子说
中国对要是能出线,我就再爆炸一次!-宇宙最后说
6.
20xx年,一老人垂危之即,颤抖着嘴唇对自己的孙子说:"孩子……等……中国足球……世界杯出线,一定……要写……在纸上……烧给我,我在下面也高兴。"
孩子说:"放心吧爷爷,我一定努力活到那一天。"听完孙子的话爷爷满意的闭上了双眼。
21xx年,一位行将就木的老人跪坐于坟前,禁不住泪如泉涌:"孙子不肖啊,这么多年来,我一直等,也没等到世界杯出线,我愧对列祖列宗呀!"说完,急怒攻心,浑身颤了两颤就不动了。那双眼睛却还瞪得大大的,死不瞑目呀!!
孙子死后上了天堂,一天他遇到了上帝,上帝说:我能满足你一个愿望。
他说:"能把日本岛沉了吗?"
上帝说:这个难度太高,换个吧。
孙子又说:"那我要中国队世界杯出线。
"上帝擦了擦头上的汗说:"你前一个愿望是什么?把地球仪拿来我看看。
7.
队长问警员:“犯人招了没有?”
警员说:“没有,犯人嘴硬的很。”
队长说:“给犯人看《还珠格格》没?”
警员说:“看了,连《流星花园》都看了,犯人也没招。”
队长说:“那给犯人看美女作家的文章了吗?”
警员说:“也看了,犯人吐了,但是仍然没招。”
队长恼了:“那给犯人看小资写的东西。”
警员说:“大哥,也给犯人看了,犯人晕倒了三次,还是挺了过来。”
队长大怒:“那把新版的《射雕》和《笑傲》一起拿给犯人看!左边右边各摆一电视”
警员:“大哥,这,这太狠了点吧。”
队长:“没办法,硬汉就得下猛的。”
过了一天,
队长又问:“怎么样,招了没?”
警员说:“犯人大小便失禁,硬是没招。”
队长咆哮着:“放中国足球。”
警员:“大哥,会出人命的,要不换一个?”
队长:“不是犯人死就是我亡。”
过了一天,
队长又问;“怎么样,招了没?”
警员说:“犯人咬舌自尽了………”·····
珍爱生命,远离国足!
8.
河中生灵神秘死亡,下游居民得上怪病,沿岸植物不断变异,
是残留农药?还是生化攻击?
敬请关注今晚《科学探索》即将播出的专题节目:《国足在河边洗脚》
2008年8月15日
2008年8月13日
unicode编程
看windows循序渐进的例子都是基于unicode的,在自己动手的时候设置了一番,颇费了点力气
我用的是2003,vc6.0一样
1:
选择项目->属性->c/c++->预处理器->预处理器定义
加上
";UNICODE;_UNICODE"(不要引号,";"隔开)
2:
链接器->高级->入口点(Entry-point)
加上wWinMainCRTStartup
于是就可以
this->MassageBox(_L"This is My first dialog");
了
2008年8月12日
对话框置顶
按照windows核心编程思路,在MFC框架下开发相应功能
调用SetWindowspos会出现
cannot convert parameter 1 from 'struct HWND__ *' to 'const class CWnd *'
解决方法:
In your dialog's OnInitDialog() function, just add this line
SetWindowPos(&wndTopMost,0,0,0,0, SWP_NOMOVE | SWP_NOSIZE);
安装eclipse的svn插件
原文
第一步:
选择菜单Help->Software Updates->Find and Install
第二步:
选择Search for new features to install
第三步:
选择New Remote Site,或者本地已经下载好了,选择New Local Site
根据版本选择
Name: Subclipse 1.4.x (Eclipse 3.2+)
URL: http://subclipse.tigris.org/update_1.4.x
Name: Subclipse 1.2.x (Eclipse 3.2+)
URL: http://subclipse.tigris.org/update_1.2.x
Name: Subclipse 1.0.x (Eclipse 3.0/3.1)
URL: http://subclipse.tigris.org/update_1.0.x
第四步:
电机OK后华回到上一界面,不管警告,一路Next
最后restart,yes。
第五步:
使用svn插件
右上角有个带"+"号的窗口按钮,点击后,选择
2008年8月11日
2008年8月4日
真正的代码高亮
不能写i<r0
其他直接贴上来。单独一贴说怎么配置
package 字符串操作;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
/** 输入字符格式:
* 大小 字符1 字符2 ...
* 每两行,进行一次处理
* 比如:
* 2 1 3
* 4 9 19 29 0
* 排序后得到
* 6 0 1 3 9 19 29
* PS:baidu一贴,用c语言写了一天没写出来,很郁闷,字符串的处理,内存的管理烦死了
* 于是用java写了下,1个小时内吧,哎~~~
* @author gnuser
*
*
*/
class 输入字符串对 {
String[] r0;
String[] r1;
int[] result;
public 输入字符串对(String[] r0, String[] r1) {
super();
this.r0 = r0;
this.r1 = r1;
}
public 输入字符串对() {
}
/**
* 将r0,r1合并后,转换为整形数组
*/
public void changeMig() {
int[] s = new int[r0.length + r1.length];
for(int i=0; i < r0.length; i++)
{
s[i] = Integer.parseInt(r0[i]);
}
for(int i=0; i < r1.length; i++)
{
s[r0.length+i] = Integer.parseInt(r1[i]);
}
this.setResult(s);
}
/**
* 排序后打印
*/
public void printSorted() {
int[] rs = this.getResult();
Arrays.sort(rs);
System.out.print(rs.length + " ");
for(int i=0; i < rs.length; i++)
System.out.print(rs[i] + " ");
System.out.println();
}
public String[] getR0() {
return r0;
}
public void setR0(String[] r0) {
this.r0 = r0;
}
public String[] getR1() {
return r1;
}
public void setR1(String[] r1) {
this.r1 = r1;
}
public int[] getResult() {
return result;
}
public void setResult(int[] result) {
this.result = result;
}
}
public class 分割_排序_输入 {
输入字符串对 ip;
public 输入字符串对 getIp() {
return ip;
}
public void setIp(输入字符串对 ip) {
this.ip = ip;
}
public 分割_排序_输入() {
super();
ip = new 输入字符串对();
}
public void BOBO() throws IOException
{
BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));
String s;
String[] r0 = null,r1 = null;
int row = 0;
while((s = stdin.readLine()) != null && s.length() != 0)
{
if(s.trim().equals("q"))
break;
if((row++) % 2 == 0)
r0 = s.substring(2).split(" ");
else
{
r1 = s.substring(2).split(" ");
ip.setR0(r0);
ip.setR1(r1);
ip.changeMig();
ip.printSorted();
}
}
}
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
分割_排序_输入 fps = new 分割_排序_输入();
fps.BOBO();
}
}
java实现某题
周末搞了好久没搞出来,很不舒服。
package 字符串操作;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
/** 输入字符格式:
* <p>
* 大小 字符1 字符2 ...
* <p>
* 每两行,进行一次处理
* <p>
* 比如:
* <p>
* 2 1 3
* <p>
* 4 9 19 29 0
* <p>
* 排序后得到
* <p>
* 6 0 1 3 9 19 29
* <p>
* PS:baidu一贴,用c语言写了一天没写出来,很郁闷,字符串的处理,内存的管理烦死了
* 于是用java写了下,1个小时内吧,哎~~~
* @author gnuser
*
*
*/
class 输入字符串对 {
String[] r0;
String[] r1;
int[] result;
public 输入字符串对(String[] r0, String[] r1) {
super();
this.r0 = r0;
this.r1 = r1;
}
public 输入字符串对() {
}
/**
* 将r0,r1合并后,转换为整形数组
*/
public void changeMig() {
int[] s = new int[r0.length + r1.length];
for(int i=0; i<r0.length; i++)
{
s[i] = Integer.parseInt(r0[i]);
}
for(int i=0; i<r1.length; i++)
{
s[r0.length+i] = Integer.parseInt(r1[i]);
}
this.setResult(s);
}
/**
* 排序后打印
*/
public void printSorted() {
int[] rs = this.getResult();
Arrays.sort(rs);
System.out.print(rs.length + " ");
for(int i=0; i<rs.length; i++)
System.out.print(rs[i] + " ");
System.out.println();
}
public String[] getR0() {
return r0;
}
public void setR0(String[] r0) {
this.r0 = r0;
}
public String[] getR1() {
return r1;
}
public void setR1(String[] r1) {
this.r1 = r1;
}
public int[] getResult() {
return result;
}
public void setResult(int[] result) {
this.result = result;
}
}
public class 分割_排序_输入 {
输入字符串对 ip;
public 输入字符串对 getIp() {
return ip;
}
public void setIp(输入字符串对 ip) {
this.ip = ip;
}
public 分割_排序_输入() {
super();
ip = new 输入字符串对();
}
public void BOBO() throws IOException
{
BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));
String s;
String[] r0 = null,r1 = null;
int row = 0;
while((s = stdin.readLine()) != null && s.length() != 0)
{
if(s.trim().equals("q"))
break;
if((row++) % 2 == 0)
r0 = s.substring(2).split(" ");
else
{
r1 = s.substring(2).split(" ");
ip.setR0(r0);
ip.setR1(r1);
ip.changeMig();
ip.printSorted();
}
}
}
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
分割_排序_输入 fps = new 分割_排序_输入();
fps.BOBO();
}
}
2008年7月31日
emacs实现键盘录制功能
就像按键精灵的录制功能,emacs也轻松能做到,帅
将下面的代码拷贝到配置文件,一般c:/_emacs或者~/.emacs
(global-set-key [(f3)] 'start-kbd-macro)
(global-set-key [(f4)] 'end-kbd-macro)
(defun call-last-kbd-macro-N-times (n)
"Call call-last-kbd-macro N times."
(interactive "How many times?")
(call-last-kbd-macro n))
(global-set-key [(f5)] 'call-last-kbd-macro-N-times)
使用方法:
按f3开始录制,然后按键(鼠标无效), f4结束
f5,输入重复次数。
于是重复编辑动作瞬间完成
或者录制好后,按c-x e,然后每次执行后,按e,则重复执行,按住不放吧,boy^_^
2008年7月11日
Eclipse编码保存出错
保存时出现一下错误。
Save could not be completed. Reason: some characters cannot be mapped using “ISO-8859-1“ character encoding. Either change the encoding or remove the characters which are not supported by the “ISO-8859-1“ character encoding.
解决方法:
eclipse --> window --> Preferences --> General --> Content Types --> Test --> 单击 Java Properties File,在底部出现 'Default edcodng:',改成utf-8或GBK,然后update
2008年5月20日
排序算法
選擇排序
將要排序的對象分作兩部份,一個是已排序的,一個是未排序的,從後端未排序部份選擇一個最小值,並放入前端已排序部份的最後一個,例如:
排序前:70 80 31 37 10 1 48 60 33 80
[1] 80 31 37 10 70 48 60 33 80 選出最小值1
[1 10] 31 37 80 70 48 60 33 80 選出最小值10
[1 10 31] 37 80 70 48 60 33 80 選出最小值31
[1 10 31 33] 80 70 48 60 37 80 ......
[1 10 31 33 37] 70 48 60 80 80 ......
[1 10 31 33 37 48] 70 60 80 80 ......
[1 10 31 33 37 48 60] 70 80 80 ......
[1 10 31 33 37 48 60 70] 80 80 ......
[1 10 31 33 37 48 60 70 80] 80 ......
插入排序
像是玩樸克一樣,我們將牌分作兩堆,每次從後面一堆的牌抽出最前端的牌,然後插入前面一堆牌的適當位置,例如:
排序前:92 77 67 8 6 84 55 85 43 67
[77 92] 67 8 6 84 55 85 43 67 將77插入92前
[67 77 92] 8 6 84 55 85 43 67 將67插入77前
[8 67 77 92] 6 84 55 85 43 67 將8插入67前
[6 8 67 77 92] 84 55 85 43 67 將6插入8前
[6 8 67 77 84 92] 55 85 43 67 將84插入92前
[6 8 55 67 77 84 92] 85 43 67 將55插入67前
[6 8 55 67 77 84 85 92] 43 67 ......
[6 8 43 55 67 77 84 85 92] 67 ......
[6 8 43 55 67 67 77 84 85 92] ......
氣泡排序法
顧名思義,就是排序時,最大的元素會如同氣泡一樣移至右端,其利用比較相鄰元素的方法,將大的元素交換至右端,所以大的元素會不斷的往右移動,直到適當的位置為止。
基本的氣泡排序法可以利用旗標的方式稍微減少一些比較的時間,當尋訪完陣列後都沒有發生任何的交換動作,表示排序已經完成,而無需再進行之後的迴圈比較與交換動作,例如:
排序前:95 27 90 49 80 58 6 9 18 50
27 90 49 80 58 6 9 18 50 [95] 95浮出
27 49 80 58 6 9 18 50 [90 95] 90浮出
27 49 58 6 9 18 50 [80 90 95] 80浮出
27 49 6 9 18 50 [58 80 90 95] ......
27 6 9 18 49 [50 58 80 90 95] ......
6 9 18 27 [49 50 58 80 90 95] ......
6 9 18 [27 49 50 58 80 90 95] 由於接下來不會再發生交換動作,排序提早結束
2008年5月15日
Apache2 VirtualHost 403 error
Apache2 VirtualHost 403 error
From Noah.org
error 403 with virtual hosts
Working with virtual hosts under Apache2 is pretty easy, but I had some trouble getting things started due to some unclear docs and lack of examples. My biggest problem was the "HTTP 403 / client denied by server configuration error".
There are two causes to 403 errors with virtual hosts.
First, every single parent path to the virtual document root must be Readable, Writable, and Executable by the web server httpd user. The access_log will show a 403 code, but the following message is returned to the browser with no "403" string printed:
Forbidden
You don't have permission to access /index.html on this server.
I got nailed a couple of times because one of the parent directories in the virtual document root was not executable by 'www' (the user my web server runs as). The error log file messages offer no hints when this happens. It makes it seem like a configuration problem, so you can waste a lot of time look for the problem in httpd.conf.
The second cause is actually a configuration problem -- the problem is forgetting to allow access in the httpd.conf. In this case the access_log will show a 403 error and Aapche2 will also sometimes send a "403" in the error string to the browser:
HTTP 403 / client denied by server configuration error
It may also send the Forbidden message with no "403" string. I don't know what this difference means.
Forbidden
You don't have permission to access /index.html on this server.
A tail of the error_log gives a message like this for each access attempt:
[Tue Jul 25 17:58:17 2006] [error] [client 192.168.1.1] client denied by server
configuration: /var/www/vhosts/palermo/
The problem is that the extra/httpd-vhosts.conf is missing the directive to allow access to the directory.
Allow access by adding a <directory> section inside the <vhost> section.
<directory /vhost_document_root>
allow from all
<directory>
The following should give a better idea of how this should work:
<VirtualHost *>
ServerName palermo.example.com
ServerAlias palermo.example.com
DocumentRoot /var/www/vhosts/palermo
<directory /var/www/vhosts/palermo>
allow from all
</directory>
</VirtualHost>
It is strange that neither the sample httpd-vhosts.conf file that comes with Apache2 nor the Apache2 documentation on VirtualHost gives a example that could work.
Retrieved from "http://www.noah.org/wiki/Apache2_VirtualHost_403_error"
2008年4月20日
SEH原理追踪
附件
我也来分析看雪的seh实例程序。当然第一步是ollydbg载入啦
入口
00401000 > $ 8D4424 F8 lea eax, dword ptr [esp-8] ;;把esp-8后的地址传给 eax,lea的 ;;用法,别把[]当成取值啦,这里这样用是提前把esp指向
;;_EXCEPTION_REGISTRATION结构地址,当然下面就是在堆栈中去构造那个结构,参考图1,2
00401004 . 64:8705 00000>xchg dword ptr fs:[0], eax ;;交换指令,eax存放旧的fs[0], 现在fs:[0]被替换,为我们提前准备的地址
0040100B . BB 2E104000 mov ebx, 0040102E ;;开始构造,放我们的异常处理函数
00401010 . 53 push ebx ;;push一下, [esp-4] : handler
00401011 . 50 push eax ;;push两下, [esp-8] : pre
00401012 . BE 00000000 mov esi, 0 ;;构造异常,esi放入0地址
00401017 . 8B06 mov eax, dword ptr [esi] ;;取0地址的值,当然出错啦,相当于在 ;;c语言里这样用: int a = *0;
;;正常情况不会到这里了,直接到我们定义的异常处理函数地址
00401019 . 6A 00 push 0 ; /Style = MB_OK|MB_APPLMODAL
0040101B . 68 00304000 push 00403000 ; |Title = "OK"
00401020 . 68 10304000 push 00403010 ; |Text = "SEH Fail"
00401025 . 6A 00 push 0 ; |hOwner = NULL
00401027 . E8 1C000000 call ; \MessageBoxA
0040102C . EB 13 jmp short 00401041
0040102E . 6A 00 push 0 ; /Style = MB_OK|MB_APPLMODAL
00401030 . 68 00304000 push 00403000 ; |Title = "OK"
00401035 . 68 03304000 push 00403003 ; |Text = "SEH Succeed "
0040103A . 6A 00 push 0 ; |hOwner = NULL
0040103C . E8 07000000 call ; \MessageBoxA
00401041 > 6A 00 push 0 ; /ExitCode = 0
00401043 . E8 06000000 call ; \ExitProcess
00401048 $- FF25 08204000 jmp dword ptr [<&USER32.MessageBoxA>>; USER32.MessageBoxA
0040104E .- FF25 00204000 jmp dword ptr [<&KERNEL32.ExitProces>; kernel32.ExitProcess
很明显是masm的,注释在代码中
图1, 先指向esp-8
图 2 push两下放好数据
OK,异常产生了,单步过这一句,od提示访问[00000000]异常,在跟壳的时候貌似经常出现这些访问异常
00401017 . 8B06 mov eax, dword ptr [esi]
shift+f7
到了ntdll区域,看od提示
7C92EAEC > 8B4C24 04 mov ecx, dword ptr [esp+4]
7C92EAF0 8B1C24 mov ebx, dword ptr [esp] ;;停在这里,可见F7的作用,当然就是step了一下
7C92EAF3 51 push ecx
7C92EAF4 53 push ebx
7C92EAF5 E8 C78C0200 call 7C9577C1
7C92EAFA 0AC0 or al, al
7C92EAFC 74 0C je short 7C92EB0A
7C92EAFE 5B pop ebx
这个时候看堆栈,换堆栈了,这个堆栈地址应该是内核堆栈,
OD ALT+M可以看到主线程的堆栈是
0012D000 - 00130000
看看有些什么东西,下面就很枯燥了,一堆结构指针以及数据,不过用来做坏事相当有用哦(@_@)
0012FCCC 0012FCD4 ;; 指向EXCEPTION_RECORD,不就在下面吗
0012FCD0 0012FCF0 ;; 指向EXCEPTION_CONTEXT,EXCEPTION_RECORD结构之后
0012FCD4 C0000005 ;; 异常代码,windows.inc 定义的STATUS_开头的类型, 这里就是读取内存 ;; 异常,还有很多,暂时不管,你脱壳时迟早会遇到,到时有兴趣再查一样
0012FCD8 00000000 ;; 异常标识,0--可修复, 1-不可修复, 2-正在展开,不要试图修复什 ;; 么,需要的话,释放必要的资源
0012FCDC 00000000 ;; 指向另一个EXCEPTION_RECORD结构
0012FCE0 00401017 Seh.00401017 ;; 异常发生的地址,被抓住了吧
0012FCE4 00000002 ;; ExceptionInformation所含有的dword数目
0012FCE8 00000000 ;; ExceptionInformation 1
0012FCEC 00000000 ;; ExceptionInformation 2
0012FCF0 0001003F ;; EXCEPTION_CONTEXT结构, ContextFlags
0012FCF4 00000000 ;; iDr0
0012FCF8 00000000 ;; iDr1
0012FCFC 00000000 ;; iDr2
0012FD00 00000000 ;; iDr3
0012FD04 00000000 ;; iDr6
0012FD08 00000000 ;; iDr7
0012FD0C FFFF027F ;; FloatSave 1C - 88h, 这里就是 0012FD0C - 0012FD78
;;不重要,略去
0012FD7C 00000000 ;; Gs
0012FD80 0000003B ;; Fs
0012FD84 00000023 ;; Es
0012FD88 00000023 ;; Ds
0012FD8C 7C930738 ntdll.7C930738 ;; Edi
0012FD90 00000000 ;; Esi
0012FD94 0040102E Seh.0040102E ;; Ebx
0012FD98 7C92EB94 ntdll.KiFastSystemCallRet ;; Edx
0012FD9C 0012FFB0 ;; Ecx
0012FDA0 0012FFE0 ;; Eax
0012FDA4 0012FFF0 ;; Ebp
0012FDA8 00401017 Seh.00401017 ;; Eip,指向的是发生异常的地址
0012FDAC 0000001B ;; Cs
0012FDB0 00010383 ;; Flag
0012FDB4 0012FFBC ;; Esp
0012FDB8 00000023 ;; Ss
0012FDBC 0000027F
0012FDC0 00000000
结构分析完了, 现在继续走, 就是处理这些数据了
7C92EAF3 51 push ecx ;;0012FCF0, 看上面的堆栈,EXCEPTION_CONTEXT结构地址
7C92EAF4 53 push ebx ;;0012FCD4, EXCEPTION_RECORD结构指针
7C92EAF5 E8 C78C0200 call 7C9577C1 ;;如果f8过,会出现SEH succeed 提示窗口,即执行了程序 ;;自己的异常代码,F7跟进追踪
7C92EAFA 0AC0 or al, al
7C92EAFC 74 0C je short 7C92EB0A
7C92EAFE 5B pop ebx
7C92EAFF 59 pop ecx
;; 到这里
7C9577C1 8BFF mov edi, edi ; ntdll.7C930738
7C9577C3 55 push ebp
7C9577C4 8BEC mov ebp, esp
7C9577C6 83EC 64 sub esp, 64
7C9577C9 56 push esi
7C9577CA FF75 0C push dword ptr [ebp+C] ;;ebp+4返回地址,+8参数1地址。+C参数2地址
7C9577CD 8B75 08 mov esi, dword ptr [ebp+8]
7C9577D0 56 push esi
7C9577D1 C645 FF 00 mov byte ptr [ebp-1], 0
7C9577D5 E8 C2FFFFFF call 7C95779C ;; 跟进, 没干什么, 检测 7C99C320 地址是否指向 7C99C320??
7C9577DA 84C0 test al, al
7C9577DC 0F85 84720100 jnz 7C96EA66
7C9577E2 53 push ebx ;; 0012FCD4, EXCEPTION_RECORD结构指针
7C9577E3 8D45 F4 lea eax, dword ptr [ebp-C] ;; 局部变量3 ,ebp = 0012FCBC ,存放线程堆栈地址上限
7C9577E6 50 push eax
7C9577E7 8D45 F8 lea eax, dword ptr [ebp-8] ;; local2, 存放下限
7C9577EA 50 push eax
7C9577EB E8 1CC1FCFF call 7C92390C ;; 取线程堆栈地址范围, 小技巧, dd跟随ebp地址, dd跟随fs指向的地址, 寄存器窗口上有
7C9577F0 E8 38C1FCFF call 7C92392D ;; mov eax, dword ptr fs:[0]
7C9577F5 8365 08 00 and dword ptr [ebp+8], 0 ;; 参数1清零
7C9577F9 8BD8 mov ebx, eax ;; 后面是一系列检测地址是否合法,可以略看,大概是检测堆栈地址,SEH异常处理函数地址
7C9577FB 83FB FF cmp ebx, -1
7C9577FE 0F84 8F000000 je 7C957893
7C957804 57 push edi
7C957805 3B5D F8 cmp ebx, dword ptr [ebp-8]
7C957808 ^ 0F82 1D32FFFF jb 7C94AA2B
7C95780E 8D43 08 lea eax, dword ptr [ebx+8]
7C957811 3B45 F4 cmp eax, dword ptr [ebp-C]
7C957814 ^ 0F87 1132FFFF ja 7C94AA2B
7C95781A F6C3 03 test bl, 3
7C95781D ^ 0F85 0832FFFF jnz 7C94AA2B
7C957823 8B43 04 mov eax, dword ptr [ebx+4]
7C957826 3B45 F8 cmp eax, dword ptr [ebp-8]
7C957829 72 09 jb short 7C957834
7C95782B 3B45 F4 cmp eax, dword ptr [ebp-C]
7C95782E ^ 0F82 F731FFFF jb 7C94AA2B
7C957834 50 push eax ;; 异常处理函数地址
7C957835 E8 67000000 call 7C9578A1 ;; 可以看见利用fs一系列指针,fs:[18]即为fs指向的地址
;; fs:[30],貌似指向PEB,PEB:[C]又是什么,继续偏移+18,找到ImageBase,再取入口地址,来检测异常处理函数地址^_^!!,真不嫌麻烦
下一个call继续跟进,得到NTHEADER地址
7C9579D1 E8 738EFDFF call RtlImageNtHeader
;;后面不太清楚在干啥,反正是系统API就直接F8,是call xxxxxxxx这种就F7进, 否则跑飞了又要重来了,还是很痛苦滴
7C95783A 84C0 test al, al
7C95783C ^ 0F84 E931FFFF je 7C94AA2B
当到了这里时
7C923799 55 push ebp
7C92379A 8BEC mov ebp, esp
7C92379C FF75 0C push dword ptr [ebp+C]
7C92379F 52 push edx
7C9237A0 64:FF35 0000000>push dword ptr fs:[0]
7C9237A7 64:8925 0000000>mov dword ptr fs:[0], esp ; 替换fs:[0]了,指向我们定义的地址
7C9237AE FF75 14 push dword ptr [ebp+14] ; 参数4 _lpDispatchrContext ?,大概放了线程堆栈范围
7C9237B1 FF75 10 push dword ptr [ebp+10] ; 参数3 _lpDContext,指向Context结构
7C9237B4 FF75 0C push dword ptr [ebp+C] ; 参数2 _lpSEH ,指向ERR结构
7C9237B7 FF75 08 push dword ptr [ebp+8] ; 参数1 _lpExceptionRecord ,指向ExceptionRecord结构
7C9237BA 8B4D 18 mov ecx, dword ptr [ebp+18] ;; 取我们定义的地址,到这里可以看下堆栈
7C9237BD FFD1 call ecx ;; 直接去执行了
7C9237BF 64:8B25 0000000>mov esp, dword ptr fs:[0]
7C9237C6 64:8F05 0000000>pop dword ptr fs:[0]
7C9237CD 8BE5 mov esp, ebp
7C9237CF 5D pop ebp
7C9237D0 C2 1400 retn 14
相关数据结构
;//================================以下是两个成员的详细结构
EXCEPTION_RECORD STRUCT
ExceptionCode DWORD ? ;//异常码
ExceptionFlags DWORD ? ;//异常标志
pExceptionRecord DWORD ? ;//指向另外一个EXCEPTION_RECORD的指针
ExceptionAddress DWORD ? ;//异常发生的地址
NumberParameters DWORD ? ;//下面ExceptionInformation所含有的dword数目
ExceptionInformation DWORD EXCEPTION_MAXIMUM_PARAMETERS dup(?)
EXCEPTION_RECORD ENDS ;//EXCEPTION_MAXIMUM_PARAMETERS ==15
;//================================具体解释========================================
ExceptionCode 异常类型,SDK里面有很多类型,你可以在windows.inc里查找STATUS_来找到更多
的异常类型,下面只给出hex值,具体标识定义请查阅windows.inc,你最可能遇到的几种类型如下:
C0000005h----读写内存冲突
C0000094h----非法除0
C00000FDh----堆栈溢出或者说越界
80000001h----由Virtual Alloc建立起来的属性页冲突
C0000025h----不可持续异常,程序无法恢复执行,异常处理例程不应处理这个异常
C0000026h----在异常处理过程中系统使用的代码,如果系统从某个例程莫名奇妙的返回,则出现此代码,
如果RtlUnwind时没有Exception Record参数也同样会填入这个代码
80000003h----调试时因代码中int3中断
80000004h----处于被单步调试状态
注:也可以自己定义异常代码,遵循如下规则:
_____________________________________________________________________+
位: 31~30 29~28 27~16 15~0
_____________________________________________________________________+
含义: 严重程度 29位 功能代码 异常代码
0==成功 0==Mcrosoft MICROSOFT定义 用户定义
1==通知 1==客户
2==警告 28位
3==错误 被保留必须为0
ExceptionFlags 异常标志
0----可修复异常
1----不可修复异常
2----正在展开,不要试图修复什么,需要的话,释放必要的资源
pExceptionRecord 如果程序本身导致异常,指向那个异常结构
ExceptionAddress 发生异常的eip地址
ExceptionInformation 附加消息,在调用RaiseException可指定或者在异常号为C0000005h即内存异常时含义如下
第一个dword 0==读冲突 1==写冲突
第二个dword 读写冲突地址
;//================================解释结束========================================
off.
CONTEXT STRUCT ; _
ContextFlags DWORD ? ; | +0
iDr0 DWORD ? ; | +4
iDr1 DWORD ? ; | +8
iDr2 DWORD ? ; >调试寄存器 +C
iDr3 DWORD ? ; | +10
iDr6 DWORD ? ; | +14
iDr7 DWORD ? ; _| +18
FloatSave FLOATING_SAVE_AREA <> ;浮点寄存器区 +1C~~~88h
regGs DWORD ? ;--| +8C
regFs DWORD ? ; |\段寄存器 +90
regEs DWORD ? ; |/ +94
regDs DWORD ? ;--| +98
regEdi DWORD ? ;____________ +9C
regEsi DWORD ? ; | 通用 +A0
regEbx DWORD ? ; | 寄 +A4
regEdx DWORD ? ; | 存 +A8
regEcx DWORD ? ; | 器 +AC
regEax DWORD ? ;_______|___组_ +B0
regEbp DWORD ? ;++++++++++++++++ +B4
regEip DWORD ? ; |控制 +B8
regCs DWORD ? ; |寄存 +BC
regFlag DWORD ? ; |器组 +C0
regEsp DWORD ? ; | +C4
regSs DWORD ? ;++++++++++++++++ +C8
ExtendedRegisters db MAXIMUM_SUPPORTED_EXTENSION dup(?)
CONTEXT ENDS
;//================================以上是两个成员的详细结构


