[反汇编练习] 160个CrackMe之018.

本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注册机的东西。

其中,文章中按照如下逻辑编排(解决如下问题):

1、使用什么环境和工具

2、程序分析

3、思路分析和破解流程

4、注册机的探索

----------------------------------

提醒各位看客: 如果文章中的逻辑看不明白,那你一定是没有亲手操刀!OD中的跳转提示很强大,只要你跟踪了,不用怎么看代码就理解了!

----------------------------------

1、工具和环境:

WinXP SP3 + 52Pojie六周年纪念版OD + PEID + 汇编金手指。

160个CrackMe的打包文件。

下载地址: http://pan.baidu.com/s/1xUWOY  密码: jbnq

注:

1、Win7系统对于模块和程序开启了随机初始地址的功能,会给分析带来很大的负担,所以不建议使用Win7进行分析。

2、以上工具都是在52PoJie论坛下的原版程序,NOD32不报毒,个人承诺绝对不会进行任何和木马病毒相关内容。

 

2、程序分析:

想要破解一个程序,必须先了解这个程序。所以,在破解过程中,对最初程序的分析很重要,他可以帮助我们理解作者的目的和意图,特别是对于注册码的处理细节,从而方便我们反向跟踪和推导。

和上一节一样,打开CHM,选择第19个Brad Soblesky.2.exe,保存下来。运行程序,程序界面如下:

3、思路分析和破解流程

又见信息框,哈哈哈!

PEID查看: Microsoft Visual C++ 6.0

和以前的一样,直接上步骤:

1、打开OD,将exe拖到OD窗口中,等程序暂停后,直接点击运行按钮(F9),不用理会。

2、在exe中输入伪码:bbdxf   123123。点击OK按钮,弹出错误信息框,不要关闭。

3、在OD中点击暂停按钮(Ctrl+F12),再点击堆栈K按钮(Ctrl+K),可以看到当前堆栈情况。

和上一个一模一样,右键->show call。

4、反汇编窗口看到如下信息:

00401618  |.^\EB AD         \jmp short 004015C7
0040161A  |>  8B45 F0       mov eax,[local.4]
0040161D  |.  50            push eax
0040161E  |.  68 54404000   push 00404054                            ;  ASCII "%lu"
00401623  |.  8D4D DC       lea ecx,[local.9]
00401626  |.  51            push ecx
00401627  |.  E8 52070000   call <jmp.&MFC42.#2818>
0040162C  |.  83C4 0C       add esp,0xC
0040162F  |.  8D4D DC       lea ecx,[local.9]
00401632  |.  E8 79020000   call 004018B0
00401637  |.  50            push eax                                 ; /Arg1
00401638  |.  8D4D E8       lea ecx,[local.6]                        ; |
0040163B  |.  E8 80020000   call 004018C0                            ; \Brad_Sob.004018C0
00401640  |.  85C0          test eax,eax
00401642  |.  0F85 FF000000 jnz 00401747
00401648  |.  8D8D ACFEFFFF lea ecx,[local.85]
0040164E  |.  E8 19070000   call <jmp.&MFC42.#540>
00401653  |.  C645 FC 03    mov byte ptr ss:[ebp-0x4],0x3
00401657  |.  6A 66         push 0x66
00401659  |.  8D8D ACFEFFFF lea ecx,[local.85]
0040165F  |.  E8 02070000   call <jmp.&MFC42.#4160>
00401664  |.  B9 07000000   mov ecx,0x7
00401669  |.  BE 58404000   mov esi,00404058                         ;  ASCII "Correct!!                     "
0040166E  |.  8DBD 48FEFFFF lea edi,[local.110]
00401674  |.  F3:A5         rep movs dword ptr es:[edi],dword ptr ds>
00401676  |.  66:A5         movs word ptr es:[edi],word ptr ds:[esi]
00401678  |.  A4            movs byte ptr es:[edi],byte ptr ds:[esi]
00401679  |.  B9 11000000   mov ecx,0x11
0040167E  |.  33C0          xor eax,eax
00401680  |.  8DBD 67FEFFFF lea edi,dword ptr ss:[ebp-0x199]
00401686  |.  F3:AB         rep stos dword ptr es:[edi]
00401688  |.  AA            stos byte ptr es:[edi]
00401689  |.  B9 07000000   mov ecx,0x7
0040168E  |.  BE 78404000   mov esi,00404078                         ;  ASCII "<BrD-SoB>                    "
00401693  |.  8DBD 14FFFFFF lea edi,[local.59]
00401699  |.  F3:A5         rep movs dword ptr es:[edi],dword ptr ds>
0040169B  |.  66:A5         movs word ptr es:[edi],word ptr ds:[esi]
0040169D  |.  B9 11000000   mov ecx,0x11
004016A2  |.  33C0          xor eax,eax
004016A4  |.  8DBD 32FFFFFF lea edi,dword ptr ss:[ebp-0xCE]
004016AA  |.  F3:AB         rep stos dword ptr es:[edi]
004016AC  |.  66:AB         stos word ptr es:[edi]
004016AE  |.  B9 06000000   mov ecx,0x6
004016B3  |.  BE 98404000   mov esi,00404098                         ;  ASCII "Incorrect!!, Try Again."
004016B8  |.  8DBD 78FFFFFF lea edi,[local.34]
004016BE  |.  F3:A5         rep movs dword ptr es:[edi],dword ptr ds>
004016C0  |.  B9 13000000   mov ecx,0x13
004016C5  |.  33C0          xor eax,eax
004016C7  |.  8D7D 90       lea edi,[local.28]
004016CA  |.  F3:AB         rep stos dword ptr es:[edi]
004016CC  |.  B9 07000000   mov ecx,0x7
004016D1  |.  BE B0404000   mov esi,004040B0                         ;  ASCII "Correct way to go, You Got It."
004016D6  |.  8DBD B0FEFFFF lea edi,[local.84]
004016DC  |.  F3:A5         rep movs dword ptr es:[edi],dword ptr ds>
004016DE  |.  66:A5         movs word ptr es:[edi],word ptr ds:[esi]
004016E0  |.  A4            movs byte ptr es:[edi],byte ptr ds:[esi]
004016E1  |.  B9 11000000   mov ecx,0x11
004016E6  |.  33C0          xor eax,eax
004016E8  |.  8DBD CFFEFFFF lea edi,dword ptr ss:[ebp-0x131]
004016EE  |.  F3:AB         rep stos dword ptr es:[edi]
004016F0  |.  AA            stos byte ptr es:[edi]
004016F1  |.  6A 40         push 0x40
004016F3  |.  68 D0404000   push 004040D0                            ;  ASCII "CrackMe"
004016F8  |.  8D8D ACFEFFFF lea ecx,[local.85]
004016FE  |.  E8 AD010000   call 004018B0
00401703  |.  50            push eax
00401704  |.  8B8D 40FEFFFF mov ecx,[local.112]
0040170A  |.  E8 75060000   call <jmp.&MFC42.#4224>
0040170F  |.  C645 FC 02    mov byte ptr ss:[ebp-0x4],0x2
00401713  |.  8D8D ACFEFFFF lea ecx,[local.85]
00401719  |.  E8 42060000   call <jmp.&MFC42.#800>
0040171E  |.  C645 FC 01    mov byte ptr ss:[ebp-0x4],0x1
00401722  |.  8D4D DC       lea ecx,[local.9]
00401725  |.  E8 36060000   call <jmp.&MFC42.#800>
0040172A  |.  C645 FC 00    mov byte ptr ss:[ebp-0x4],0x0
0040172E  |.  8D4D E8       lea ecx,[local.6]
00401731  |.  E8 2A060000   call <jmp.&MFC42.#800>
00401736  |.  C745 FC FFFFF>mov [local.1],-0x1
0040173D  |.  8D4D EC       lea ecx,[local.5]
00401740  |.  E8 1B060000   call <jmp.&MFC42.#800>
00401745  |.  EB 70         jmp short 004017B7
00401747  |>  8D8D 44FEFFFF lea ecx,[local.111]
0040174D  |.  E8 1A060000   call <jmp.&MFC42.#540>
00401752  |.  C645 FC 04    mov byte ptr ss:[ebp-0x4],0x4
00401756  |.  6A 67         push 0x67
00401758  |.  8D8D 44FEFFFF lea ecx,[local.111]
0040175E  |.  E8 03060000   call <jmp.&MFC42.#4160>
00401763  |.  6A 40         push 0x40
00401765  |.  68 D8404000   push 004040D8                            ;  ASCII "CrackMe"
0040176A  |.  8D8D 44FEFFFF lea ecx,[local.111]
00401770  |.  E8 3B010000   call 004018B0
00401775  |.  50            push eax
00401776  |.  8B8D 40FEFFFF mov ecx,[local.112]
0040177C  |.  E8 03060000   call <jmp.&MFC42.#4224>

向上查找,很容易地找到了一个跳转 jnz 00401747 ,逻辑上很难明白到底对不对,但是我们可以试试,选中它,右键->Binary->Fill with Nops。回到exe,试试,哈哈!

 

4、注册机的探索

我们已经知道了关键跳转,那他的附近肯定有判断条件,刚好,他的上面有一个call,我们跟进去看看,F8只到返回:

004018C0  /$  55            push ebp
004018C1  |.  8BEC          mov ebp,esp
004018C3  |.  51            push ecx
004018C4  |.  894D FC       mov [local.1],ecx
004018C7  |.  8B45 08       mov eax,[arg.1]
004018CA  |.  50            push eax                                 ; /Arg2
004018CB  |.  8B4D FC       mov ecx,[local.1]                        ; |
004018CE  |.  8B11          mov edx,dword ptr ds:[ecx]               ; |
004018D0  |.  52            push edx                                 ; |Arg1
004018D1  |.  E8 0A000000   call 004018E0                            ; \Brad_Sob.004018E0
004018D6  |.  83C4 08       add esp,0x8
004018D9  |.  8BE5          mov esp,ebp
004018DB  |.  5D            pop ebp
004018DC  \.  C2 0400       retn 0x4
004018DF      CC            int3
004018E0  /$  55            push ebp                                 ;  // 上面的函数跳到这里
004018E1  |.  8BEC          mov ebp,esp
004018E3  |.  8B45 0C       mov eax,[arg.2]
004018E6  |.  50            push eax                                 ; /s2 = "3524958250"
004018E7  |.  8B4D 08       mov ecx,[arg.1]                          ; |
004018EA  |.  51            push ecx                                 ; |s1 = "123123"
004018EB  |.  FF15 B4314000 call dword ptr ds:[<&MSVCRT._mbscmp>]    ; \_mbscmp
004018F1  |.  83C4 08       add esp,0x8
004018F4  |.  5D            pop ebp
004018F5  \.  C3            retn

很容易看出,这个Call就是用来比较两个字符串的。

5、返回关键跳转附近代码,向上查看与算法相关东西:

004014E4  |.  68 8F204000   push 0040208F                            ;  SE handler installation
004014E9  |.  64:A1 0000000>mov eax,dword ptr fs:[0]
004014EF  |.  50            push eax
004014F0  |.  64:8925 00000>mov dword ptr fs:[0],esp
004014F7  |.  81EC B4010000 sub esp,0x1B4
004014FD  |.  56            push esi
004014FE  |.  57            push edi
004014FF  |.  898D 40FEFFFF mov [local.112],ecx
00401505  |.  C745 F0 45632>mov [local.4],0x81276345                 ;  // 常量在这里赋值
0040150C  |.  68 AC414000   push 004041AC
00401511  |.  8D4D EC       lea ecx,[local.5]
00401514  |.  E8 77080000   call <jmp.&MFC42.#537>
00401519  |.  C745 FC 00000>mov [local.1],0x0
00401520  |.  68 B0414000   push 004041B0
00401525  |.  8D4D E8       lea ecx,[local.6]
00401528  |.  E8 63080000   call <jmp.&MFC42.#537>
0040152D  |.  C645 FC 01    mov byte ptr ss:[ebp-0x4],0x1
00401531  |.  68 B4414000   push 004041B4
00401536  |.  8D4D DC       lea ecx,[local.9]
00401539  |.  E8 52080000   call <jmp.&MFC42.#537>
0040153E  |.  C645 FC 02    mov byte ptr ss:[ebp-0x4],0x2
00401542  |.  8D45 EC       lea eax,[local.5]
00401545  |.  50            push eax
00401546  |.  68 E8030000   push 0x3E8
0040154B  |.  8B8D 40FEFFFF mov ecx,[local.112]
00401551  |.  E8 34080000   call <jmp.&MFC42.#3097>
00401556  |.  8D4D E8       lea ecx,[local.6]
00401559  |.  51            push ecx
0040155A  |.  68 E9030000   push 0x3E9
0040155F  |.  8B8D 40FEFFFF mov ecx,[local.112]
00401565  |.  E8 20080000   call <jmp.&MFC42.#3097>
0040156A  |.  8D4D EC       lea ecx,[local.5]
0040156D  |.  E8 DE020000   call 00401850
00401572  |.  8945 E4       mov [local.7],eax
00401575  |.  837D E4 05    cmp [local.7],0x5                        ;  // name 的长度比较
00401579  |. /7D 43         jge short 004015BE
0040157B  |. |6A 40         push 0x40
0040157D  |. |68 20404000   push 00404020                            ;  ASCII "CrackMe"
00401582  |. |68 28404000   push 00404028                            ;  ASCII "User Name must have at least 5 characters."
00401587  |. |8B8D 40FEFFFF mov ecx,[local.112]
0040158D  |. |E8 F2070000   call <jmp.&MFC42.#4224>
00401592  |. |C645 FC 01    mov byte ptr ss:[ebp-0x4],0x1
00401596  |. |8D4D DC       lea ecx,[local.9]
00401599  |. |E8 C2070000   call <jmp.&MFC42.#800>
0040159E  |. |C645 FC 00    mov byte ptr ss:[ebp-0x4],0x0
004015A2  |. |8D4D E8       lea ecx,[local.6]
004015A5  |. |E8 B6070000   call <jmp.&MFC42.#800>
004015AA  |. |C745 FC FFFFF>mov [local.1],-0x1
004015B1  |. |8D4D EC       lea ecx,[local.5]
004015B4  |. |E8 A7070000   call <jmp.&MFC42.#800>
004015B9  |. |E9 F9010000   jmp 004017B7
004015BE  |> \C745 E0 00000>mov [local.8],0x0
004015C5  |.  EB 09         jmp short 004015D0
004015C7  |>  8B55 E0       /mov edx,[local.8]
004015CA  |.  83C2 01       |add edx,0x1
004015CD  |.  8955 E0       |mov [local.8],edx
004015D0  |>  8B45 E0        mov eax,[local.8]
004015D3  |.  3B45 E4       |cmp eax,[local.7]
004015D6  |.  7D 42         |jge short 0040161A
004015D8  |.  8B4D E0       |mov ecx,[local.8]
004015DB  |.  51            |push ecx                                ; /Arg1
004015DC  |.  8D4D EC       |lea ecx,[local.5]                       ; |
004015DF  |.  E8 1C030000   |call 00401900                           ; \Brad_Sob.00401900
004015E4  |.  0FBED0        |movsx edx,al
004015E7  |.  8B45 F0       |mov eax,[local.4]
004015EA  |.  03C2          |add eax,edx
004015EC  |.  8945 F0       |mov [local.4],eax
004015EF  |.  8B4D E0       |mov ecx,[local.8]
004015F2  |.  C1E1 08       |shl ecx,0x8
004015F5  |.  8B55 F0       |mov edx,[local.4]
004015F8  |.  33D1          |xor edx,ecx
004015FA  |.  8955 F0       |mov [local.4],edx
004015FD  |.  8B45 E0       |mov eax,[local.8]
00401600  |.  83C0 01       |add eax,0x1
00401603  |.  8B4D E4       |mov ecx,[local.7]
00401606  |.  0FAF4D E0     |imul ecx,[local.8]
0040160A  |.  F7D1          |not ecx
0040160C  |.  0FAFC1        |imul eax,ecx
0040160F  |.  8B55 F0       |mov edx,[local.4]
00401612  |.  0FAFD0        |imul edx,eax
00401615  |.  8955 F0       |mov [local.4],edx
00401618  |.^ EB AD         \jmp short 004015C7
0040161A  |>  8B45 F0       mov eax,[local.4]
0040161D  |.  50            push eax
0040161E  |.  68 54404000   push 00404054                            ;  ASCII "%lu"
00401623  |.  8D4D DC       lea ecx,[local.9]
00401626  |.  51            push ecx
00401627  |.  E8 52070000   call <jmp.&MFC42.#2818>
0040162C  |.  83C4 0C       add esp,0xC
0040162F  |.  8D4D DC       lea ecx,[local.9]
00401632  |.  E8 79020000   call 004018B0                            ;  // 字符串比较,它的返回值是eax
00401637  |.  50            push eax                                 ; /Arg1 = ASCII "3524958250"
00401638  |.  8D4D E8       lea ecx,[local.6]                        ; |
0040163B  |.  E8 80020000   call 004018C0                            ; \Brad_Sob.004018C0
00401640  |.  85C0          test eax,eax
00401642  |.  0F85 FF000000 jnz 00401747                             ;  // 关键跳转

在这里面有一个大的循环,应该就是处理算法部分,并且对于Name部分,他还有长度判断:

0040157B  |.  6A 40         push 0x40
0040157D  |.  68 20404000   push 00404020                            ;  ASCII "CrackMe"
00401582  |.  68 28404000   push 00404028                            ;  ASCII "User Name must have at least 5 characters."
00401587  |.  8B8D 40FEFFFF mov ecx,[local.112]
0040158D  |.  E8 F2070000   call <jmp.&MFC42.#4224>

至少5个字符。

算法循环处理部分分析如下:

004015B9  |. /E9 F9010000   jmp 004017B7
004015BE  |> |C745 E0 00000>mov [local.8],0x0                        ;  // 开始处理
004015C5  |. |EB 09         jmp short 004015D0
004015C7  |> |8B55 E0       /mov edx,[local.8]
004015CA  |. |83C2 01       |add edx,0x1                             ;  // 序号+1
004015CD  |. |8955 E0       |mov [local.8],edx
004015D0  |> |8B45 E0        mov eax,[local.8]                       ;  // 初始值为0
004015D3  |. |3B45 E4       |cmp eax,[local.7]                       ;  与Name的长度比较
004015D6  |. |7D 42         |jge short 0040161A
004015D8  |. |8B4D E0       |mov ecx,[local.8]
004015DB  |. |51            |push ecx                                ; /Arg1 = ASCII "bbdxf"
004015DC  |. |8D4D EC       |lea ecx,[local.5]                       ; |
004015DF  |. |E8 1C030000   |call 00401900                           ; \Brad_Sob.00401900
004015E4  |. |0FBED0        |movsx edx,al                            ;  // 取第一个字符的ANSII值,放在al中
004015E7  |. |8B45 F0       |mov eax,[local.4]                       ;  // 这是一个常量
004015EA  |. |03C2          |add eax,edx
004015EC  |. |8945 F0       |mov [local.4],eax                       ;  // eax = 812763A7; 然后又存进去
004015EF  |. |8B4D E0       |mov ecx,[local.8]                       ;  // 序号,初值0
004015F2  |. |C1E1 08       |shl ecx,0x8                             ;  // 左移8位
004015F5  |. |8B55 F0       |mov edx,[local.4]
004015F8  |. |33D1          |xor edx,ecx                             ;  // 异或
004015FA  |. |8955 F0       |mov [local.4],edx                       ;  // 存进去
004015FD  |. |8B45 E0       |mov eax,[local.8]
00401600  |. |83C0 01       |add eax,0x1                             ;  // 序号+1
00401603  |. |8B4D E4       |mov ecx,[local.7]                       ;  // Name长度
00401606  |. |0FAF4D E0     |imul ecx,[local.8]                      ;  // 带符号乘法,Name长度*序号
0040160A  |. |F7D1          |not ecx                                 ;  // 取反
0040160C  |. |0FAFC1        |imul eax,ecx                            ;  // 序号*ecx
0040160F  |. |8B55 F0       |mov edx,[local.4]                       ;  // 取出来
00401612  |. |0FAFD0        |imul edx,eax                            ;  // 与刚才的结果相乘
00401615  |. |8955 F0       |mov [local.4],edx                       ;  // 存进去
00401618  |.^|EB AD         \jmp short 004015C7
0040161A  |> |8B45 F0       mov eax,[local.4]
0040161D  |. |50            push eax                                 ;  eax=D21A982A
0040161E  |. |68 54404000   push 00404054                            ;  ASCII "%lu"
00401623  |. |8D4D DC       lea ecx,[local.9]
00401626  |. |51            push ecx
00401627  |. |E8 52070000   call <jmp.&MFC42.#2818>                  ;  // 格式化字符串
0040162C  |. |83C4 0C       add esp,0xC
0040162F  |. |8D4D DC       lea ecx,[local.9]
00401632  |. |E8 79020000   call 004018B0                            ;  // 字符串比较,它的返回值是eax
00401637  |. |50            push eax                                 ; /Arg1 = ASCII "3524958250"
00401638  |. |8D4D E8       lea ecx,[local.6]                        ; |
0040163B  |. |E8 80020000   call 004018C0                            ; \Brad_Sob.004018C0
00401640  |. |85C0          test eax,eax
00401642  |. |0F85 FF000000 jnz 00401747                             ;  // 关键跳转

大概的流程是:

。。。直接看C++代码吧,我也说不清楚:

// CrackMeDemo.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "iostream"

int _tmain(int argc, _TCHAR* argv[])
{
	char Name[100] = "bbdxf";
	char key[100] = {0};
	int nLen = strlen(Name);
	int uStart = 0x81276345;
	for (int i=0;i<nLen;i++)
	{
		uStart += Name[i];
		uStart = uStart ^ (i<<8);
		uStart *= (i+1)*(~(nLen*i));

	}
	printf("hex: %X\r\n",uStart);
	printf("Key: %lu\r\n",uStart);
	system("pause");
	return 0;
}

 

BY  笨笨D幸福

[反汇编练习] 160个CrackMe之019的更多相关文章

  1. [反汇编练习] 160个CrackMe之027

    [反汇编练习] 160个CrackMe之027. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

  2. [反汇编练习] 160个CrackMe之026

    [反汇编练习] 160个CrackMe之026. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

  3. [反汇编练习] 160个CrackMe之025

    [反汇编练习] 160个CrackMe之025. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

  4. [反汇编练习] 160个CrackMe之024

    [反汇编练习] 160个CrackMe之024. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

  5. [反汇编练习] 160个CrackMe之022

    [反汇编练习] 160个CrackMe之022. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

  6. [反汇编练习] 160个CrackMe之021

    [反汇编练习] 160个CrackMe之021. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

  7. [反汇编练习] 160个CrackMe之020

    [反汇编练习] 160个CrackMe之020. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

  8. [反汇编练习] 160个CrackMe之018

    [反汇编练习] 160个CrackMe之018. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

  9. [反汇编练习] 160个CrackMe之017

    [反汇编练习] 160个CrackMe之017. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

随机推荐

  1. selenium 常见面试题以及答案(Java版)

    1.怎么 判断元素是否存在? 判断元素是否存在和是否出现不同, 判断是否存在意味着如果这个元素压根就不存在, 就会抛出NoSuchElementException 这样就可以使用try catch,如 ...

  2. 记录一则RMAN备份策略修正案例

    背景:在给某客户处理问题时,发现客户数据库的备份空间即将用尽,进一步查看发现是用户数据库的当前RMAN备份策略存在潜在问题,需要修改备份策略. 环境:SunOS 5.10 + Oracle 11.2. ...

  3. ubuntu和centos安装RRDTool——cacti前置技能

    Installing Pre-Requisites Note that RRDTool 1.0.x versions included all dependancies, but 1.2.x vers ...

  4. CentOS设置防火墙开放端口

    1. iptables是linux下的防火墙,同时也是服务的名称. service iptables status service iptables start service iptables st ...

  5. java web 学习 --第二天(Java三级考试)

    第一天的学习在这http://www.cnblogs.com/tobecrazy/p/3444474.html 2.jsp 基础知识 Jsp页面中的Java脚本主要有3部分:声明(Declaratio ...

  6. 5-04用Sql语句创建表

    用Sql语句创建表的基本语法: USE E_Market--指向当前所操作的数据库 GO CREATE TABLE CommoditySort--创建表的名字 { sortID int IDENTIT ...

  7. Nginx日志切割,以及脚本上传nginx的切割日志

    一:日志切割步骤 命令都在root下进行 1.创建目录 mkdir -p /etc/opt/modules/bin ## 创建文件夹 2.上传cut 3.观察目录 4.修改的cut文件 5.检测 需要 ...

  8. Android学习笔记(第二篇)View中的五大布局

    PS:人不要低估自己的实力,但是也不能高估自己的能力.凡事谦为本... 学习内容: 1.用户界面View中的五大布局... i.首先介绍一下view的概念   view是什么呢?我们已经知道一个Act ...

  9. [CLR via C#]15. 枚举类型和位标志

    一.枚举类型 枚举类型(enumerated types)定义了一组"符号名称/值"配对. 例如,以下Color类型定义了一组符号,每个符号都标识一种颜色: internal en ...

  10. 强调语气&lt;strong&gt;和&lt;em&gt;标签,文字设置单独样式&lt;span&gt;

    区别:1,<em> 表示强调,<strong> 表示更强烈的强调. 2,并且在浏览器中<em> 默认用斜体表示,<strong> 用粗体表示. 3,两个 ...