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

本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将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,选择第4个ajj,保存下来。运行程序,程序界面如下:

这似乎是一个标准的Name/Serial注册码方式,二话不说,来个伪码测试:

Name: 3333     Serial: 44445555

但是,但是什么提示也没有,只有一个鼠标提示,我点,我点,编辑框,灰色的小框框,我单击,我双击,KAO,啥提示也没有。

还是看看说明书吧:

前两天我和[CCG]的大哥Sun Bird兄闲聊时引出一个话题,
我要想想办法难为一下Sun Bird兄。
因此就用了两个半天的时间,作了一个小东东。
这个CKme与一般的软件注册过程不一样,它没有"确定"键,
当然CK这样的软件其实一点也不麻烦,没遇到过的朋友可要动动脑子了。     8)
另外这个CKme还作了一点别的手脚,不多说了,自己看着办吧。
这个软件是用Delphi编的,由于我刚学了一星期的Delphi,
有很多想法在这个小程序里没有实现,因此这个CKme应该算是比较简单的了。
如果你成功的注册了,请给我来封信好吗?谢谢!!!
还有你千万不要告诉我你只用了2分钟就搞定了,如果是这样我就。。8~~~(

                            ajj
                            2000/08/30

好吧,这位大哥再给我们玩猜谜呢!

 

3、思路分析和破解流程:

这个程序就像作者说的,诡异的不知道到底是那里出发判断,无论点什么地方都没有任何提示。查一下壳:Delphi的,没有加壳。对Delphi不了解,没关系,我们先尝试熟悉的程序的方式看看是否能行。

个人比较擅长VC,先按照VC思路思考一下程序可能会通过什么方式触发检测序列号动作:

1、要进行序列号检测,必须的获取Name/Serial的文本,在VC中WM_GETTEXT消息用来获取文本使用,我们可以通过对Edit控件下消息断点,然后看看是否能得到一些信息。操作:菜单->View->Windows,很容易就看到了标题,Class名称为TForm1,右键Message Breakpoint on callproc,找到WM_GetText消息,确定。这时无论我们怎么尝试都无法断下。没办法,对delphi不了解,再试试别的。

2、在第一个的基础上尝试WM_KEYDOWN/WM_KEYUP消息,API断点(GetWindowTextW/A),发现都无法获得任何信息。

尝试到这里,只说明了一个问题,Delphi并不是简单地封装了API函数,所以我们无法通过这方面来进行筛选和拦截。

退一步,我们的目的是破解这个程序,所以只要能够找到和关键跳转相关的东西就行。进论坛,搜了一大桶,原来除了堆栈找法,还有很多看起来很小白的方法,比如最碰运气的【字符串查找】,如果程序中有很多和流程相关的字符串,我们就可以根据字符串的意思猜测程序的流程。Ctrl+E(E图标),选中CKme.exe模块,右键->Follow entry,这样我们就在主程序模块,然后右键->中文搜索引擎->智能搜索,哈哈哈,终于露出狐狸的小尾巴了!我们发现有一个很明显的中文字符串【恭喜恭喜!注册成功】,二话不说,跟进去。

  1. 0045803B /75 76 jnz short 004580B3 ; // 关键跳,爆破这里就可以了
  2. 0045803D |. |33DB xor ebx,ebx
  3. 0045803F |> |8D55 E4 /lea edx,[local.7]
  4. 00458042 |. |8B86 D4020000 |mov eax,dword ptr ds:[esi+0x2D4]
  5. 00458048 |. |E8 FBB2FCFF |call 00423348
  6. 0045804D |. |8B45 E4 |mov eax,[local.7]
  7. 00458050 |. |E8 27BBFAFF |call 00403B7C
  8. 00458055 |. |83C0 03 |add eax,0x3
  9. 00458058 |. |8D55 E8 |lea edx,[local.6]
  10. 0045805B |. |E8 A4FAFAFF |call 00407B04
  11. 00458060 |. |FF75 E8 |push [local.6]
  12. 00458063 |. |8D55 E0 |lea edx,[local.8]
  13. 00458066 |. |8B86 D4020000 |mov eax,dword ptr ds:[esi+0x2D4]
  14. 0045806C |. |E8 D7B2FCFF |call 00423348
  15. 00458071 |. |FF75 E0 |push [local.8]
  16. 00458074 |. |8D55 DC |lea edx,[local.9]
  17. 00458077 |. |8BC3 |mov eax,ebx
  18. 00458079 |. |E8 86FAFAFF |call 00407B04
  19. 0045807E |. |FF75 DC |push [local.9]
  20. 00458081 |. |8D45 FC |lea eax,[local.1]
  21. 00458084 |. |BA 03000000 |mov edx,0x3
  22. 00458089 |. |E8 AEBBFAFF |call 00403C3C
  23. 0045808E |. |43 |inc ebx
  24. 0045808F |. |83FB 13 |cmp ebx,0x13
  25. 00458092 |.^|75 AB \jnz short 0045803F
  26. 00458094 |. |33D2 xor edx,edx
  27. 00458096 |. |8B86 F0020000 mov eax,dword ptr ds:[esi+0x2F0]
  28. 0045809C |. |E8 BFB1FCFF call 00423260
  29. 004580A1 |. |A1 20B84500 mov eax,dword ptr ds:[0x45B820]
  30. 004580A6 |. |83C0 70 add eax,0x70
  31. 004580A9 |. |BA 14814500 mov edx,00458114 ; 恭喜恭喜!注册成功
  32. 004580AE |. |E8 9DB8FAFF call 00403950

到CALL的地方后,向上查看代码,很容易就找到了两个JNZ,最近的那个一直在循环,不会跳过中文的提示,而最上面的那个jnz short 004580B3 一眼就能看到它会跳出正确提示,SO,爆破很easy啦!选中这个JNZ,右键->Binary->Fill with NOPs. 随意输入Name/Serial试试,OK,非常完美,收工!

4、注册机的探索:

我们的目的不单单是爆破他,尽量算出注册码,SO,找到代码头,输入伪码:

Name: 112233   Serial: 44445555

下断,F8分析:

  1. 00457FB8 /. 55 push ebp ; 00A053D8
  2. 00457FB9 |. 8BEC mov ebp,esp
  3. 00457FBB |. B9 04000000 mov ecx,0x4
  4. 00457FC0 |> 6A 00 /push 0x0
  5. 00457FC2 |. 6A 00 |push 0x0
  6. 00457FC4 |. 49 |dec ecx
  7. 00457FC5 |.^ 75 F9 \jnz short 00457FC0 ; // 毫无意义地循环了4次
  8. 00457FC7 |. 51 push ecx
  9. 00457FC8 |. 53 push ebx
  10. 00457FC9 |. 56 push esi ; //00A053D8
  11. 00457FCA |. 8BF0 mov esi,eax ; // esi=00A019CC=纹E
  12. 00457FCC |. 33C0 xor eax,eax
  13. 00457FCE |. 55 push ebp
  14. 00457FCF |. 68 FD804500 push 004580FD
  15. 00457FD4 |. 64:FF30 push dword ptr fs:[eax]
  16. 00457FD7 |. 64:8920 mov dword ptr fs:[eax],esp
  17. 00457FDA |. 33DB xor ebx,ebx
  18. 00457FDC |> 8D55 F4 /lea edx,[local.3]
  19. 00457FDF |. 8B86 D4020000 |mov eax,dword ptr ds:[esi+0x2D4]
  20. 00457FE5 |. E8 5EB3FCFF |call 00423348
  21. 00457FEA |. 8B45 F4 |mov eax,[local.3] ; // eax=112233 字符串地址
  22. 00457FED |. E8 8ABBFAFF |call 00403B7C
  23. 00457FF2 |. 83C0 1E |add eax,0x1E ; // eax=6+1E=0x24
  24. 00457FF5 |. 8D55 F8 |lea edx,[local.2]
  25. 00457FF8 |. E8 07FBFAFF |call 00407B04 ; // 修改了edx地址处的值为36
  26. 00457FFD |. FF75 F8 |push [local.2] ; // ecx=0x24
  27. 00458000 |. 8D55 F0 |lea edx,[local.4]
  28. 00458003 |. 8B86 D4020000 |mov eax,dword ptr ds:[esi+0x2D4]
  29. 00458009 |. E8 3AB3FCFF |call 00423348
  30. 0045800E |. FF75 F0 |push [local.4] ; // ss=112233
  31. 00458011 |. 8D55 EC |lea edx,[local.5]
  32. 00458014 |. 8BC3 |mov eax,ebx
  33. 00458016 |. E8 E9FAFAFF |call 00407B04
  34. 0045801B |. FF75 EC |push [local.5]
  35. 0045801E |. 8D45 FC |lea eax,[local.1]
  36. 00458021 |. BA 03000000 |mov edx,0x3
  37. 00458026 |. E8 11BCFAFF |call 00403C3C
  38. 0045802B |. 43 |inc ebx ; ebx=0++
  39. 0045802C |. 83FB 13 |cmp ebx,0x13 ; // 不知道为什么比较了0x13次
  40. 0045802F |.^ 75 AB \jnz short 00457FDC ; // 这个形成了一个xxName18的字符串,3611223318
  41. 00458031 |. 81BE 0C030000>cmp dword ptr ds:[esi+0x30C],0x85 ; // esi是关键点
  42. 0045803B 75 76 jnz short 004580B3 ; // 关键跳,爆破这里就可以了
  43. 0045803D |. 33DB xor ebx,ebx
  44. 0045803F |> 8D55 E4 /lea edx,[local.7]
  45. 00458042 |. 8B86 D4020000 |mov eax,dword ptr ds:[esi+0x2D4]
  46. 00458048 |. E8 FBB2FCFF |call 00423348
  47. 0045804D |. 8B45 E4 |mov eax,[local.7]
  48. 00458050 |. E8 27BBFAFF |call 00403B7C
  49. 00458055 |. 83C0 03 |add eax,0x3
  50. 00458058 |. 8D55 E8 |lea edx,[local.6]
  51. 0045805B |. E8 A4FAFAFF |call 00407B04
  52. 00458060 |. FF75 E8 |push [local.6]
  53. 00458063 |. 8D55 E0 |lea edx,[local.8]
  54. 00458066 |. 8B86 D4020000 |mov eax,dword ptr ds:[esi+0x2D4]
  55. 0045806C |. E8 D7B2FCFF |call 00423348
  56. 00458071 |. FF75 E0 |push [local.8]
  57. 00458074 |. 8D55 DC |lea edx,[local.9]
  58. 00458077 |. 8BC3 |mov eax,ebx
  59. 00458079 |. E8 86FAFAFF |call 00407B04
  60. 0045807E |. FF75 DC |push [local.9]
  61. 00458081 |. 8D45 FC |lea eax,[local.1]
  62. 00458084 |. BA 03000000 |mov edx,0x3
  63. 00458089 |. E8 AEBBFAFF |call 00403C3C
  64. 0045808E |. 43 |inc ebx
  65. 0045808F |. 83FB 13 |cmp ebx,0x13
  66. 00458092 |.^ 75 AB \jnz short 0045803F
  67. 00458094 |. 33D2 xor edx,edx
  68. 00458096 |. 8B86 F0020000 mov eax,dword ptr ds:[esi+0x2F0]
  69. 0045809C |. E8 BFB1FCFF call 00423260
  70. 004580A1 |. A1 20B84500 mov eax,dword ptr ds:[0x45B820]
  71. 004580A6 |. 83C0 70 add eax,0x70
  72. 004580A9 |. BA 14814500 mov edx,00458114 ; 恭喜恭喜!注册成功
  73. 004580AE |. E8 9DB8FAFF call 00403950
  74. 004580B3 |> 33C0 xor eax,eax

这段代码对Name进行了处理,在堆栈中得到了一个类似3611223318的字符串,但是比较的时候使用的是cmp dword ptr ds:[esi+0x30C],0x85,esi+0x30C地址处的值才是真正影响结果的,翻看代码发现,没有任何地方修改了这个值,没办法,重新断在循环头部,db [esi+0x30C],对内容下内容写入断点,取消其他断点,F9运行,尝试。。。

悲剧了,什么也找不到。

多次尝试此代码段的上层代码和跟踪内部CALL代码,无法找到有用的信息。实在没办法了,继续求救大神吧!

搜索发现了两点有用的信息:

1、看雪论坛找到了一个正确的Name/Serial。Name: findlakes   Serial: 黑头Sun Bird14dseloffc-012-OKfindlakes

2、OD对于Delphi程序确实有些乏力,反汇编Delphi有更好的软件Dede。

 

下面我们尝试使用Dede反编译它(工具下载链接里有):

如图,在窗体选项中发现注册码编辑框TEdit2有OnKeyUp事件chkcode。

在过程选项中,双击chkcode查看代码:

代码如下:

  1. 00457C40 55 push ebp
  2. 00457C41 8BEC mov ebp, esp
  3. 00457C43 51 push ecx
  4. 00457C44 B905000000 mov ecx, $00000005
  5. 00457C49 6A00 push $00
  6. 00457C4B 6A00 push $00
  7. 00457C4D 49 dec ecx
  8. 00457C4E 75F9 jnz 00457C49
  9. 00457C50 51 push ecx
  10. 00457C51 874DFC xchg [ebp-$04], ecx
  11. 00457C54 53 push ebx
  12. 00457C55 56 push esi
  13. 00457C56 8BD8 mov ebx, eax
  14. 00457C58 33C0 xor eax, eax
  15. 00457C5A 55 push ebp
  16. 00457C5B 683D7E4500 push $00457E3D
  17. ...

OK,关闭Dede,我们在OD中加载它:

Ctrl+G 转到开头地址: 00457C40,向上找到段头,开始F8分析:

  1. 00457C1C . 53 75 6E 20 4>ascii "Sun Bird",0
  2. 00457C25 00 db 00
  3. 00457C26 00 db 00
  4. 00457C27 00 db 00
  5. 00457C28 . FFFFFFFF dd FFFFFFFF
  6. 00457C2C . 0F000000 dd 0000000F
  7. 00457C30 . 64 73 65 6C 6>ascii "dseloffc-012-OK",0
  8. 00457C40 /. 55 push ebp ; // 这里是头部,下断
  9. 00457C41 |. 8BEC mov ebp,esp
  10. 00457C43 |. 51 push ecx
  11. 00457C44 |. B9 05000000 mov ecx,0x5
  12. 00457C49 |> 6A 00 /push 0x0
  13. 00457C4B |. 6A 00 |push 0x0
  14. 00457C4D |. 49 |dec ecx
  15. 00457C4E |.^ 75 F9 \jnz short 00457C49 ; // 无意义的循环
  16. 00457C50 |. 51 push ecx
  17. 00457C51 |. 874D FC xchg [local.1],ecx
  18. 00457C54 |. 53 push ebx
  19. 00457C55 |. 56 push esi
  20. 00457C56 |. 8BD8 mov ebx,eax
  21. 00457C58 |. 33C0 xor eax,eax
  22. 00457C5A |. 55 push ebp
  23. 00457C5B |. 68 3D7E4500 push 00457E3D
  24. 00457C60 |. 64:FF30 push dword ptr fs:[eax]
  25. 00457C63 |. 64:8920 mov dword ptr fs:[eax],esp
  26. 00457C66 |. 8BB3 F8020000 mov esi,dword ptr ds:[ebx+0x2F8]
  27. 00457C6C |. 83C6 05 add esi,0x5
  28. 00457C6F |. FFB3 10030000 push dword ptr ds:[ebx+0x310] ; // (ASCII "黑头Sun Bird")
  29. 00457C75 |. 8D55 F8 lea edx,[local.2]
  30. 00457C78 |. 8BC6 mov eax,esi
  31. 00457C7A |. E8 85FEFAFF call 00407B04
  32. 00457C7F |. FF75 F8 push [local.2] ; // 10
  33. 00457C82 |. FFB3 14030000 push dword ptr ds:[ebx+0x314] ; // (ASCII "dseloffc-012-OK")
  34. 00457C88 |. 8D55 F4 lea edx,[local.3]
  35. 00457C8B |. 8B83 D4020000 mov eax,dword ptr ds:[ebx+0x2D4]
  36. 00457C91 |. E8 B2B6FCFF call 00423348
  37. 00457C96 |. FF75 F4 push [local.3] ; // ASCII bbdxf
  38. 00457C99 |. 8D83 18030000 lea eax,dword ptr ds:[ebx+0x318]
  39. 00457C9F |. BA 04000000 mov edx,0x4
  40. 00457CA4 |. E8 93BFFAFF call 00403C3C
  41. 00457CA9 |. 33D2 xor edx,edx
  42. 00457CAB |. 8B83 F4020000 mov eax,dword ptr ds:[ebx+0x2F4]
  43. 00457CB1 |. E8 AAB5FCFF call 00423260
  44. 00457CB6 |. 8B93 18030000 mov edx,dword ptr ds:[ebx+0x318] ; //(ASCII "黑头Sun Bird10dseloffc-012-OKbbdxf")
  45. 00457CBC |. 8B83 F4020000 mov eax,dword ptr ds:[ebx+0x2F4]
  46. 00457CC2 |. E8 B1B6FCFF call 00423378 ; // 根据我们之前查找的资料,上面的字符串其实就是注册码了
  47. 00457CC7 |. 33F6 xor esi,esi
  48. 00457CC9 |> 8D55 EC /lea edx,[local.5] ; // 0x13 次不知道干什么的循环
  49. 00457CCC |. 8B83 D4020000 |mov eax,dword ptr ds:[ebx+0x2D4]
  50. 00457CD2 |. E8 71B6FCFF |call 00423348
  51. 00457CD7 |. 8B45 EC |mov eax,[local.5]
  52. 00457CDA |. E8 9DBEFAFF |call 00403B7C
  53. 00457CDF |. 83C0 03 |add eax,0x3
  54. 00457CE2 |. 8D55 F0 |lea edx,[local.4]
  55. 00457CE5 |. E8 1AFEFAFF |call 00407B04
  56. 00457CEA |. FF75 F0 |push [local.4]
  57. 00457CED |. 8D55 E8 |lea edx,[local.6]
  58. 00457CF0 |. 8B83 D4020000 |mov eax,dword ptr ds:[ebx+0x2D4]
  59. 00457CF6 |. E8 4DB6FCFF |call 00423348
  60. 00457CFB |. FF75 E8 |push [local.6]
  61. 00457CFE |. 8D55 E4 |lea edx,[local.7]
  62. 00457D01 |. 8BC6 |mov eax,esi
  63. 00457D03 |. E8 FCFDFAFF |call 00407B04
  64. 00457D08 |. FF75 E4 |push [local.7]
  65. 00457D0B |. 8D45 FC |lea eax,[local.1]
  66. 00457D0E |. BA 03000000 |mov edx,0x3
  67. 00457D13 |. E8 24BFFAFF |call 00403C3C
  68. 00457D18 |. 46 |inc esi
  69. 00457D19 |. 83FE 13 |cmp esi,0x13
  70. 00457D1C |.^ 75 AB \jnz short 00457CC9
  71. 00457D1E |. 8D55 E0 lea edx,[local.8]
  72. 00457D21 |. 8B83 D8020000 mov eax,dword ptr ds:[ebx+0x2D8]
  73. 00457D27 |. E8 1CB6FCFF call 00423348

实在是被Delphi折磨的不能行了,注册码很简单,特别是根据开头的几个ANSI能够看出来,他就是固定的字符串加上我们的Name,即"黑头Sun Bird10dseloffc-012-OK"+Name。随便怎么搞都没问题。

总结一下:这个CrackMe就像作者说的,更多的算是一个小游戏,再加上Delphi不熟,做完之后实在感到有些鸡肋,不过,相信,所有的付出都会有收获的,只是时间的问题。加油!

 

BY  笨笨D幸福

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

  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之019

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

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

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

随机推荐

  1. 编写一段程序,从标准输入读取string对象的序列直到连续出现两个相同的单词或者所有单词都读完为止。使用while循环一次读取一个单词,当一个单词连续出现两次是使用break语句终止循环。输出连续重复出现的单词,或者输出一个消息说明没有人任何单词是重复出现的。

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

  2. error X3025:global variables are implicitly constant, enable compatibility mode to allow modification

    global variables are implicitly constant, enable compatibility mode to allow modification http://xbo ...

  3. Windows Server 2008下共享资源访问走捷径 (不用用户名 和 密码 访问共享)

    1. 启用来宾帐号2. 共享目录添加“Guest”帐号3. “gpedit.msc”,打开对应系统的组策略编辑窗口;在该编辑窗口的左侧显示区域,依次展开“本地计算机策略”/“计算机配置”/“Windo ...

  4. soap消息机制 讲解

    SOAP(Simple Object Access Protocol,简单对象访问协议)作为一种信息交互协议在分布式应用中非常广泛,如WebService.在使用.Net开发WebService时候, ...

  5. How to define Servlet filter order of execution using annotations

    If we define Servlet filters in web.xml, then the order of execution of the filters will be the same ...

  6. java基础知识回顾之java Thread类学习(六)--java多线程同步函数用的锁

    1.验证同步函数使用的锁----普通方法使用的锁 思路:创建两个线程,同时操作同一个资源,还是用卖票的例子来验证.创建好两个线程t1,t2,t1线程走同步代码块操作tickets,t2,线程走同步函数 ...

  7. hdu 1270 小希的数表

    思路:一定有sum[1]=num[1]+num[2],sum[2]=num[1]+num[3]; 但是sum[3]不知道是由num[1]+num[4]还是num[2]+num[3],这就需要枚举一下了 ...

  8. lintcode :搜索二维矩阵

    题目: 搜索二维矩阵 写出一个高效的算法来搜索 m × n矩阵中的值. 这个矩阵具有以下特性: 每行中的整数从左到右是排序的. 每行的第一个数大于上一行的最后一个整数. 样例 考虑下列矩阵: [ [1 ...

  9. 【nginx网站性能优化篇(2)】反向代理实现Apache与Nginx的动静分离(LNMPA)

    为什么要使用反向代理 具体请参考这篇博文:[Linux常识篇(1)]所谓的正向代理与反向代理 在虚拟机上配置反向代理的步骤 首先假设你已经假设好了LNMP架构了,这时我们还要安装Apache和php, ...

  10. 【PHP高效搜索专题(2)】sphinx&coreseek在PHP程序中的应用实例

    PHP可以通过三种途径来调用sphinx 通过Sphinx官方提供的API接口(接口有Python,Java,Php三种版本) 通过安装SphinxSE,然后创建一个中介sphinxSE类型的表,再通 ...