首页
社区
课程
招聘
[原创]算法分析实战篇和应用篇之提高(二)动态调试和静态汇编(IDA ABC)
发表于: 2008-4-30 15:34 87727

[原创]算法分析实战篇和应用篇之提高(二)动态调试和静态汇编(IDA ABC)

2008-4-30 15:34
87727

算法分析实战篇和应用篇之提高(二)动态调试和静态汇编(IDA ABC)

【文章标题】: 算法分析实战篇和应用篇之提高(二)动态调试和静态汇编(IDA ABC)
【文章作者】: NBA2005
【作者邮箱】: stockfox1699@sohu.com
【作者QQ号】: 382309369
【软件名称】: Pic2Ico 2.1
【下载地址】: http://www.newhua.com/soft/45891.htm
【加壳方式】: ASPack 2.001 -> Alexey Solodovnikov
【使用工具】: PEID、OD、IDA
【操作平台】: WinXP
【作者声明】: 认真看了一本书,书名叫《雷峰的故事》,感动之余,写下此文。感谢看雪
             论坛及网上的雷峰们的辛勤汗水和劳动成果。

老夫聊发教学文
A B C D君莫笑
抛砖引玉共进步
破解技术节节高

初学破解三道坎
爆破算法注册机
提高破解三种心
耐心恒心和虚心

                       序篇:巧卸还原精灵

    前两天朋友聚餐,席上某大学的一位电教系主任得知我有破解爱好,向我求救:
    由于近来的磁碟机病毒猖狂,他们系的上百台电脑安装了国内的某一键还原精灵软件。后来
才发现居然不知道管理员的默认密码。现在无法安装一套教学软件,必须将一键还原精灵软件完
全卸载。

    电教系主任是一个,那双眼睛真好看。看着看着我就来到了电教室。技术员向我抱怨该
国内某一键还原精灵软件的恶毒。当时他分别下载了美国的、台湾的和国内的一键还原精灵软件,
出于爱国情结他最后选择并安装了最新版本的国产软件。事后才发现就国内的软件没有告知默认
的管理员密码,美国的、台湾的软件都明确告知默认的管理员密码。我听着听着汗就下来了,
真是色字头上一把刀啊,这问题还真棘手。该一键还原精灵软件应该是写入MBR处,先于WIN
系统启动。用DEBUG调试?我的功力不够啊。你遇到这种情况怎么办?哥们泡妞真的不容易啊。

****************请先思考***************************

****************请先思考***************************

****************请先思考***************************

    娱乐花絮一:
    泡妞秘籍1:要泡妞,先破解。

   可是怎么办呢?网上搜,必有我师。可怪了,网上关于这问题
都是要泡妞的急盼解放军--期盼破解。只好响应伟大的毛主席的号
召?自立更生!望着那迷人的眼睛,我灵机一动,计上心来。我实
验性地在一台机器上安装了台湾的一键还原精灵软件,目的是覆盖
掉MBR上的管理员密码信息,然后用台湾软件的默认的管理员密码
将之卸载。国内的一键还原精灵软件在WIN系统也轻松卸载。原理
很简单,台湾的和国内的一键还原精灵软件的程序原理是一样的。这
种方法很简单,剩下的一百多台就交给技术员吧。一个软件首先要做
的,是如何完善自己的功能,其次才是如何保护自己的软件。简单在
网上一搜,发现对这款国内的一键还原精灵软件是骂声不断。根本的
原因是它剥夺了试用用户的选择权。虽然可以通过邮件获得默认的管
理员密码,但用户只是试用,就如此麻烦,以后的升级和问题咨询想
来也是令人头疼的。该电教系就打消了购买此软件的初衷,依然用原
来的Ghost光盘备份。

     说这个经历是想说明两点:

    1.实践是最好的老师。要学好破解,就要勇于实践。灵感来源于辛勤的实践。光看不练是没用的。
    2.破解没有固定的模式。我的文章里说的固定模式是相对的,是为了方便初学者的模仿和理解
而提出来的。破解的最高境界应该是无招胜有招,利用软件的保护漏洞应势利导,有针对性地进行破解。

                   第一章  破解的系统性思路

    我是一个很菜的菜鸟,破解是我自学人生中最得意的一项爱好。虽然我很菜,但我
能了解初学破解的种种困惑。虽然不自量力,但我还是努力写下自己自学破解的一些思考,
仙剑奇侠们还是宽容我的无知和好为人师吧。个人的体会:坚持破文是学习破解的相当有
效率的方法。了解是一回事,完全让别人看明白则需要更深入的理解和透彻的钻研。

    许多的初学者刚接触算法分析时,看了许多的破文并跟着做成功.但一到自己独立破
解时,往往不知该如何下手。这种情况很常见。最常见的原因有两种。一种是自己缺乏
破解该软件的相关破解知识。实战要求的是你破解的综合素质,差一点就是破解不了。
另一种情况是大多数破文属于回忆性质的,是破文作者的总结回顾文章。而初学者渴望
现场直播式的指导,而不是比赛回顾的录象剪辑。Petnt大侠的破文受到大多数人的喜爱,
就是因为他始终以一种现场解说的模式来叙述自己的破解过程,有破解关键处的思考和
常规处理手段,也有神来之猜想。总的来说,初学者渴望的是较系统的实战直播性质的破文,
而不是片面而零碎的回忆录或记叙文。

     看过了我的《算法分析实战篇和应用篇之入门篇》,破解的基础知识也掌握得八九
不离十了。但拿到了具体的软件,为什么还是不知如何下手呢?最根本的原因是:初学
者的脑中没有系统的破解思路。我们要对软件进行算法分析,就必须解答算法分析的三个
基本问题:
1.注册判断的关键位置在哪?具体又分为两部分:
  A.注册成功与失败的关键位置。
  B.注册判断的关键CALL。
        判断方法:确定关键变量,按照就近原则顺藤摸瓜。

2.注册判断的关键变量是谁?
3.注册判断的程序流程。具体又分为两部分:
  A.注册正确的程序流程。
  B.注册正确的程序流程所要求的一些条件。

1.注册判断的关键位置在哪?
  A.这其实是一个如何下断点的问题。我在上篇《算法分析实战篇和应用篇之提高(一)我的
常用断点系统》中和入门篇中已经详细说明了。
  B.关键CALL往往与注册判断的关键变量相互关联。
       判断方法:确定关键变量,按照就近原则顺藤摸瓜。

2.注册判断的关键变量是谁?  
  这是高手讲解的盲区,却是不会编程的初学者最感困惑的知识点。其实很简单,一点就懂。
  这里感到疑惑的多是业余的破解者,建议看懂《加密和解密II》P33的函数章节。我就偷
  个懒,不和看雪老大抢镜头了,毕竟京城的美女都喜欢看雪。

  关键变量 != 注册标志变量
  也可以是算法中的计算注册码的关键变量。

3.注册判断的程序流程。具体又分为两部分:
  A.注册正确的程序流程。
  B.注册正确的程序流程所要求的一些条件。这里算法分析的难点就是程序小模块的具体功
能的研判。
  这是算法分析最关键和最难掌握、最难理解的部分,我在入门篇中再三强调。本篇中依然
对此进行重点而具体的阐述。

  上述的三个基本问题就是破解软件的系统性的破解思路。剩下的就是运用自己掌握的各种
破解知识对这三个问题进行解答的具体而耐心的过程。你可以看看各种破文,其实都是解答
这三个问题的具体过程,不同的只是解答的侧重点不一样。有经验的老手看了破文后就能
将心得迅速运用破解实战,就是因为他早就具有了这种系统的破解思路。他需要的只是从
破文中学习破解具体且高效率的技巧和相关破解经验。高手的破文往往对这三个问题的具
体的难点进行提示,不具备系统性的破解思路的初学者往往看了后印象不深,更谈不上运用
于实战了。

   娱乐花絮二:
   泡妞秘籍2:泡妞成功的三个基本要素
   第一   绝对信心。
        自信心是做每一样事情的基本条件,泡妞也不例外。
   第二   女性喜欢有才(或财)的男人   破解是我泡妞中利用最多的武器。
   第三   真诚,永远是俘虏女性芳心的最强武器。耐心是赢得芳心的常规武器。而无赖属于
          非常规武器,偶尔运用得当,会有奇效。

   我相信,看了我的这篇文章,你会领略到看雪论坛上许多关于算法分析破文的精彩和珍贵。
你也没有理由不对他们的辛勤劳动和无私奉献作出回应。如果你是美女,就给他们一个嫣然一
笑百魅生,破文不精死不休。

                    
              第二章   IDA的优缺点

   我的文章拖了这么久,就是没有一个合适的CRACK ME例子。反正我浏览了整个CRACK ME论
坛的文章,就是没看到我满意的。另一个原因就是我要在网上上万篇的破文中筛选出我
需要的文章,这个工作量无疑是巨大而枯燥的。在为MM的系列服务中,我破解到了这个软件,
才有了这篇文章的完成。

下面我就以这个简单的软件Pic2Ico 2.1为例,对算法分析的三个基本问题进行具体的阐述。

  一个系统的逆向工程应该是动态调试和静态汇编的完美结合。本文就以OD和IDA两个代表工具
来进行解说。随着OD的横空出世,静态汇编软件已经被业余破解爱好者忽略了。IDA却因使用
的复杂和对计算机系统性能的高要求,而令业余破解爱好者望而生畏。

  IDA的字符串查找不受区块的限制。IDA对系统的配置越来越高,但它强大的分析能力又吸
引着众多破解爱好者。其中最常用的就是流程图功能。去年底又公开了一种伪代码的插件,
吸引了众多破解高手转学C语言。这么多的优点,铸就了IDA的破解霸主地位。

  IDA一出,谁与争锋?

  我也是只知道点常识性的IDA知识。满瓶的不说,我这半调子就献丑了。希望仙剑奇侠们
对IDA的插件编写等关键功能多多指教,增加我的感性认识。

                  第三章  脱壳的感性认识

   首先,用PEID得知有壳:ASPack 2.001 -> Alexey Solodovnikov。这是个很简单的壳。
脱壳不是本文的重点,因此只进行简要的说明。脱壳其实是对关键的执行代码的解密过程,脱壳
要具备的基本知识有:
1.程序的流程结构。
2.PE文件结构。
3.脱壳的基本常识。F7和F8的运用、花指令、SEH知识等。

   确定OEP入口点的常规标准是:虚拟地址的数值突变。即通常说的一个大的跨段跳转。学
过脱壳的人都知道这个标准。但这个标准的理论依据是什么?相信有不少人会被初学者问住了。
绝大多数PE加壳程序在被加密的程序中加上一个或多个块(段),因此根据跨段的转移指
令(JMP)就能找到入口点。现在这常规标准在许多猛壳中并不适用。根据上述的原理,我
们可以大致猜想出猛壳是如何弱化OEP入口点的常规标准的。

   详细的叙述见《加密和解密II》P370。

   在OD中脱壳的简要步骤:
00656001 >  60              pushad
00656002    E8 72050000     call    00656579
00656007    EB 4C           jmp     short 00656055

单步F8到00656055,命令行中输入:hr esp。运行F9,停在:
006564F4   /75 08           jnz     short 006564FE
006564F6   |B8 01000000     mov     eax, 1
006564FB   |C2 0C00         retn    0C
006564FE   \68 18164000     push    00401618
00656503    C3              retn

命令行中输入:hd。删除硬件断点。单步运行过00656503,就来到入口点处:
00401618   /EB 10           jmp     short 0040162A
运用ollydump插件,选方式一,很容易脱掉。

                  第四章  静态脱壳--IDA操作入门

   接下来,我们要换用IDA来静态脱壳。文件->新建:
[ ATTACH ] http://bbs.pediy.com/attachment.php?attachmentid=13758&stc=1&d=1209685245 [ /ATTACH ]
选择要静态分析的文件:

注意右上角的红圆点,有三种颜色的变化,含义(根据英文翻译):
绿色:预备。
黄色:思考。
红色:关键。

圆点变黄了。

圆点又变红了。

红线内的数值不断变化,说明IDA正在分析,耐心等待。许多初学者想使用IDA的流程图
功能,却发现迟迟不见流程图的出现,最常见的原因就是IDA没有分析完毕。较大或复杂
的软件往往要分析一天以上,具体时间由程序的复杂度和你计算机的性能决定。耐心等吧,
喜欢它就要包容它的缺点。与同事、朋友共处或谈恋爱一样,既要追求完美,又要承认、
包容缺陷。

分析完毕的圆点颜色:

IDA程序代码显示全景:

放大流程图:

很直观的流程,两个程序大分支,其中一个又有两个小分支。

右键,反汇编代码视图和图形视图切换:

按G,跳转到指定地址(6564FE):

.xtzy:006564FE
.xtzy:006564FE loc_6564FE:                             ; CODE XREF: start+4F3_j
.xtzy:006564FE                 push    0
.xtzy:00656503                 retn
.xtzy:00656503 start           endp

直接OD设断:
xtzy:00656503                 retn
哈哈,一步就到了入口点。IDA是脱猛壳的利器。

娱乐花絮三:
泡妞秘籍3:一份优厚的工作是泡妞的催化剂。

                      第五章  一段简单壳代码的动态分析

IDA中按G,跳转到指定地址(6564FE):

.xtzy:006564FE
.xtzy:006564FE loc_6564FE:                             ; CODE XREF: start+4F3_j
.xtzy:006564FE                 push    0
.xtzy:00656503                 retn
.xtzy:00656503 start           endp

与OD动态跟踪运行至此的对比:
006564FE   \68 18164000     push    00401618
00656503    C3              retn

发现了吗?push 后的数值是不一样的。这是为什么呢?IDA的静态分析不容易回答
这个问题。用OD动态调试很容易来解答。高手就不要凑热闹了。

    OD,CTRL+F2->CTRL+Sà输入:

   push 0
    retn

CTRL+F2,设内存写入断点:
006564FE    68 00000000     push    0

F9,停在:
006564ED    8985 7B2E4400   mov     dword ptr [ebp+442E7B], eax      ; Pic2Ico.00401618
006564F3    61              popad
006564F4    75 08           jnz     short 006564FE
006564F6    B8 01000000     mov     eax, 1
006564FB    C2 0C00         retn    0C
006564FE    68 00000000     push    0
00656503    C3              retn
看到了吗?数值没变呢。
006564FE    68 00000000     push    0

F8单步一下,
006564F3    61              popad
006564F4    75 08           jnz     short 006564FE
006564F6    B8 01000000     mov     eax, 1
006564FB    C2 0C00         retn    0C
006564FE    68 18164000     push    00401618
00656503    C3              retn

明白了吗?eax的值怎么来的,向上看:
006564DD    8B85 4E2A4400   mov     eax, dword ptr [ebp+442A4E]
006564E3    50              push    eax
006564E4    0385 E0374400   add     eax, dword ptr [ebp+4437E0]
006564EA    59              pop     ecx
006564EB    0BC9            or      ecx, ecx
006564ED    8985 7B2E4400   mov     dword ptr [ebp+442E7B], eax
006564F3    61              popad
006564F4    75 08           jnz     short 006564FE
006564F6    B8 01000000     mov     eax, 1
006564FB    C2 0C00         retn    0C
006564FE    68 18164000     push    00401618
00656503    C3              retn
    《加密和解密II》P391处就有详细的注释。

               第六章  OD和IDA追踪源头的小技巧

006564D8  ^\E9 EBFEFFFF     jmp     006563C8
006564DD    8B85 4E2A4400   mov     eax, dword ptr [ebp+442A4E]

006564DD    8B85 4E2A4400   mov     eax, dword ptr [ebp+442A4E]
这一句的源头在哪?IDA很直观:

PageUp向上翻页:

什么?OD的CTRL+R键?

难道没招了?minus,即小键盘减号键:
00656001 >  60              pushad
00656002    E8 72050000     call    00656579
00656007    EB 4C           jmp     short 00656055

00656055    BB 7C294400     mov     ebx, 0044297C
0065605A    03DD            add     ebx, ebp
0065605C    2B9D AD294400   sub     ebx, dword ptr [ebp+4429AD]
00656062    83BD E0374400 0>cmp     dword ptr [ebp+4437E0], 0
00656069    899D E0374400   mov     dword ptr [ebp+4437E0], ebx
0065606F    0F85 68040000   jnz     006564DD

这里介绍了OD中追踪源头的两种常用方法。与IDA相比较,感觉还是IDA直观、容易理解。但OD的小巧和快速,则占有使用上的方便。

   以后,遇到这个弱壳,快捷的脱壳方法:
    OD, CTRL+S:

   push 0
    retn

    高手的破文中,这种形式屡见不怪。

                   第七章  OD快捷键的个人心得总结
                                                                                                                     
   既然是提高篇,就要对OD的使用高要求了。所以快捷键多了。

自己的OD总结心得:

常用反汇编快捷键:
F2     设断点或取消断点。
F3     打开新文件
F4     运行到当前行。
F5     最大化\恢复活动窗口,使多个窗口切换。如不必重复查找字符串,在查找字符串窗口和CPU窗口切换。
F7     进入CALL
F8     通过CALL
F9     运行
F12    暂停
ALT+F9 返回程序领空。
CTRL+F2重新运行程序
ALT+X  程序退出。
*     程序执行位置 即EIP。或命令行:AT 数据。
空格    汇编修改(使用NOP填充要打勾) 选定目标行或多行 ALT+退格键 撤消修改(注:选定行可不连续)
冒号:  添加标签
分号;  加注释
回车键在修改寄存器的值和看十六和十进制的转换经常用到(等同鼠标双击)(信息窗口无效,只能用鼠标右键,鼠标双击也无效)。

查找    CTRL+F     查找命令  同  CTRL+L  重复上一次查找
        CTRL+S     查找命令序列
        CTRL+B     二进制字符串
        CTRL+N     当前模块中的名称
        CTRL+R     查找参考-->选定命令  即查找指定范围全部参考。{  ALT+F7  前一参考
        CTRL+O     分析-->扫描目标文件                           ALT+F8  后一参考

        CTRL+G     转到地址

频率较高的快捷键:F5、*、ALT+退格键、?表达式---->计算表达式的值及十六和十进制的转换。

RUN跟踪
+        下一地址
-        上一地址
+和CTRL  下一进程
-和CTRL  上一进程
CTRL+F11 追踪进入 等同F7和F8
CTRL+F12
CTRL+T   设置条件RUN跟踪

条件断点
SHIFT+F2 条件
SHIFT+F4 条件记录

特殊操作技巧:

选取多行:鼠标拖动拉下。或SHIFT+鼠标左键点开始和结束位置。
撤消多处修改:选定目标行或多行 ALT+退格键 撤消修改(注:选定行的修改可散在分布,但必须全部用鼠标选取在内)
窗口切换:窗口里选择或窗口选层叠+F5结合鼠标选点。窗口选层叠第一次设置就行,只要不改,以后就不需要操作了。
十进制和十六进制转换:鼠标右键选修改或命令行? 表达式OR数据
返回程序领空:
1。ALT+F9。
2。或者点击菜单查看->内存,或者点击工具栏上那个“M”按钮(也可以按组合键 ALT+M),选CODE按F2,运行。
3。查找标签或注释:查找->用户定义的标签或注释。
4。在堆栈中的第一行“选反汇编中跟踪”就可以返回到上一层的调用这里的地方。
出现一个对话框必然是程序调用一个子程序来完成,在汇编状态下也就是必须要调用一个“CALL”来完成程序的调用,当程序出现错误对话框时,此时用OD的暂停键,会暂停在调用这个子程序代码里面,但在汇编代码里面这个完成绘制对话框的CALL里面也会调用很多的CALL,而且会一层一层地调用,最终还会调用系统,这一点可以暂停后我们会在堆栈中发现。那怎么才能一步步从最后面的一层一层的CALL慢慢返回到我们要找的最原始的调用子程序的CALL呢?这个是关键,如果找到了,这个CALL所在的段也就是最关键的了,能跳过它的跳转也是最关键的跳转了。这一点并不难。
我们再来说一下CALL的调用,调用一个子程序的时候:1、向堆栈中压入下一行程序的地址;2.JMP到call的子程序地址处
关键是1、在堆栈中压入了下一行程序的地址,其目的是为了调用子程序结束后返回用的,如果走到一个CALL的时候我们F7一次跟进后会停在所调用的子程序的开头第一个代码处,这时看堆栈的第一行压入了调用时的下一行地址。这个也是我们要利用的:我们只要在程序某段的开头第一行代码下断(下面也行,这样可以避免不必要的干扰)中断后在堆栈中的第一行“选反汇编中跟踪”就可以返回到上一层的调用这里的地方了,回到上一层后,如果发现关键段不是这段,再在此段的开头第一行下断,向上找。这样可以一层一层向上找,直到找到最初的调用的CALL,这里就是关键段了!
当然暂停后用AIT+K也可以看的到(但觉得有时不能准确定位)。
5。显示内存数据:数据窗口CTRL+G输入内存数据或右键操作。命令行:D 内存数据。
6。tracing tips
大凡找到字符串后就开始trace了,包括f8, f7。如果需要跟踪的代码很长或者不熟悉跟踪的技巧,就会花费很多的时间。这时,可以使用ctl+f8,这是olly的animate功能,将程序预演一次,然后可以f12,再 alt+f9,将程序交给用户。比如说,在可疑的代码处设置breakpoint,然后clt+f8,让程序预演,再在认为可能是关键的地方f12,这样就可以对需要trace代码有一个大概的影响,并且可以帮助修正不必要的bp。这种方法是不是根高效呢?
7。searching tips
olly默认只在code段搜索字符串,所以,要想找到藏得更深的字符串,就要动脑子了。工具条上的那个m按钮是用来查看module的。点它,然后clt+b,就可以搜索code段以外的ascii, unicode, binary字符串了。
找到了字符串就要好好利用,记下它的地址,再再 command bar里输入
d targetaddress,就可以看到了,然后在字符串上点右键,选search for reference,就可以看到有哪些指令在调用这个字符串了。也可以用set breakpoint on each reference. 这样迅速跟踪到相关的指令。
8。tailing strings
软件中的大部分字符串一般是contant,所以可以修改他们。比如说,unregisterd version,这样的字符串,就可以将它修改成registered to **,注意了,在修改时,要选keep size,否则容易出错。 (这里我用lena的原文,挺幽默的:
this won't cause other nags) 。采用相同的方法,可以修改字符串,直到自己满意为止。
9。finding cmps
对于那些简单的在启动时就通过常量来判断注册状态的软件来说,我们很容易找到where to patch。找到与unregisted,registered相关的字符串,然后检查他们附近的哪些jmp是跳过,跳入registered状态的,跟踪条件跳转前的比较或者返回值就可以看到程序判断注册与否的常量了。强制执行跳入到registered状态的跳转就是plain, stupid, but effective的破解 , 或者将比较用得常量改成与跳出registered状态相同的比较常量就可以。也可以将条出registered状态的跳转nop掉。 还可以试试mov al, 1 :)

最左边三个绿底色:打开新文件  返回汇编窗口 关闭当前进程或窗口
中间的七个粉红底的调试:运行  暂停  F7 F8单步跟踪  CTRL+F7 F8自动单步跟踪 ALT+F9执行到用户代码
中间的绿底工具栏  输入要跟随的表达式
蓝底色查看工具栏 :L E M T W H C / K B R ... S

            ALT+L      打开LOG窗口
        ALT+E      打开MODULES窗口
        ALT+M      打开内存窗口
        ALT+T          打开THREAD窗口
        ALT+W      打开WIN窗口
        ALT+H          打开HELP窗口
        ALT+C      打开CPU窗口
        /          PATCHES
            ALT+K      调用堆栈
        ALT+B      打开断点窗口
        ALT+R      OLLYmachine recent files
           ...       RUN TRACE
           S          SOURCE
           ALT+F5     使OLLYDBG界面位于其他WIN窗口之上。

       最右边的三个绿底:调试选项  界面选项  帮助

              第八章   NAG窗口的位置确定---OD的独特魅力

这个软件老是跳出一个时间限制的注册(NAG)窗口。个人的理解:这方面是OD的
拿手好戏。

方法1:

  OD载入脱壳后的执行文件,CTRL+F8,出现注册窗口时停在:
005057EC  |.  FF56 18       call    dword ptr [esi+18]

设断此CALL,单步一过此CALL,NAG窗口就出现了。
设断此CALL,单步F7进此CALL,CTRL+F8:
004018D6   .  E8 FDA90C00   call    004CC2D8
004018DB   .  A1 00E65200   mov     eax, dword ptr [52E600]

重复设断子CALL,CTRL+F2,F7进入,CTRL+F8:
004CC309   .  FF57 2C       call    dword ptr [edi+2C]
004CC30C   .  33C0          xor     eax, eax

重复以上步骤:
004029F1  |.  E8 63741000   call    00509E59
004029F6  |>  8BE5          mov     esp, ebp

重复以上步骤:
0040887A  |.  FF92 E8000000 call    dword ptr [edx+E8]               ;  001.004C8F04
00408880  |>  8B4D DC       mov     ecx, dword ptr [ebp-24]
  
命令解释:Ctrl+F8 → 自动步进扫描,按F12可停止 。

方法2:

F12暂停和Ctrl+F9的组合寻NAG窗口位置:
004C90DA   .  33C0          xor     eax, eax

Ctrl+F9几次,直到一个CALL下一行:
0040887A  |.  FF92 E8000000 call    dword ptr [edx+E8]
00408880  |>  8B4D DC       mov     ecx, dword ptr [ebp-24]

设断CALL,发现此CALL一单步过就出NAG窗口。

总结:OD有两个确定NAG窗口的组合。

                  第九章   提示杀手---F12暂停和Ctrl+F9的组合

算法分析的三个基本问题:
1.注册判断的关键位置在哪?具体又分为两部分:
  A.注册成功与失败的关键位置。
  B.注册判断的关键CALL。
2.注册判断的关键变量是谁?
3.注册判断的程序流程。具体又分为两部分:
  A.注册正确的程序流程。
  B.注册正确的程序流程所要求的一些条件。

下面开始采用脱壳后的执行文件进行分析。

第一个问题很简单,我的上篇<我的常用断点系统>都能搞定(似乎XP万能断点无效)。

我用OD来个针对这个软件的下断法,利用了对用户名的限制提示:

什么都不输入,点register,出现错误提示:
please input your full name!

F12暂停和Ctrl+F9的组合断下:
004C90DA   .  33C0          xor     eax, eax
跟踪来到:
00427F40  |.  FF4D C4       dec     dword ptr [ebp-3C]

00427F29  |.  BA DE3B5200   mov     edx, 00523BDE              ;  ASCII "Please input your Full Name!"
00427F2E  |.  8D45 F8       lea     eax, dword ptr [ebp-8]
00427F31  |.  E8 CE150E00   call    00509504
00427F36  |.  FF45 C4       inc     dword ptr [ebp-3C]
00427F39  |.  8B00          mov     eax, dword ptr [eax]
00427F3B  |.  E8 D0A80A00   call    004D2810
00427F40  |.  FF4D C4       dec     dword ptr [ebp-3C]

向上到段首:
00427EB0  /.  55            push    ebp
00427EB1  |.  8BEC          mov     ebp, esp

粗粗浏览这部分整个段,向下看到了关键信息:
004281B5  |.  BA 1>mov     edx, 00523C19              ;  ASCII "Register successfully!",LF,"Thank you."
004281BA  |.  8D45>lea     eax, dword ptr [ebp-30]
004281BD  |.  E8 4>call    00509504
004281C2  |.  FF45>inc     dword ptr [ebp-3C]
004281C5  |.  8B00 mov     eax, dword ptr [eax]
004281C7  |.  E8 4>call    004D2810
004281CC  |.  FF4D>dec     dword ptr [ebp-3C]
004281CF  |.  8D45>lea     eax, dword ptr [ebp-30]
004281D2  |.  BA 0>mov     edx, 2
004281D7  |.  E8 8>call    00509664
004281DC  |.  8B45>mov     eax, dword ptr [ebp-5C]
004281DF  |.  E8 C>call    004C8CAC
004281E4  |.  EB 3>jmp     short 0042821D
004281E6  |>  66:C>mov     word ptr [ebp-48], 80
004281EC  |.  BA 3>mov     edx, 00523C3B            
;  ASCII "Your registration code is invalid.",
LF,"If you have purchased this software and get
the wrong code, maybe you have not downloaded
and installed the latest version. Or please send
email to: support@exeicon.com ",LF

现在我们完全确定了这个大段就是注册判断的关键位置所在。

                第十章   IDA的字符串查找

好,看我IDA的了。载入执行文件-->SHIFT+F12-->点strings
-->ALT+T,输入错误提示register-->CTRL+T-->看到:
register successfully!\nThank you.-->双击之-->来到
data.00523c19处,提示大聚会啊。怎么来到相应的代码处?
这是初学IDA的菜鸟问题,菜鸟应笑我,营养太不良。大侠们,
可怜可怜吧,给点破解营养吧。鼠标放在提示后面有个向上的
小箭头处,双击此。

泡妞秘籍4:好的形象是成功的一半。健硕的体魄、高雅的谈吐
和渊博的知识,最少具备其一。

                  第十一章  注册判断的关键变量

2.注册判断的关键变量是谁?
004281E6  |> \66:C>mov     word ptr [ebp-48], 80
信息窗口:
跳转来自 00427FC1
004281EC  |.  BA 3>mov     edx, 00523C3B            
;  ASCII "Your registration code is invalid.",LF,
"If you have purchased this software and get the
wrong code, maybe you have not downloaded and
installed the latest version. Or please send
email to: support@exeicon.com ",LF
004281F1  |.  8D45>lea     eax, dword ptr [ebp-34]

来到:
00427FBA  |.  80B9>cmp     byte ptr [ecx+3E4], 0
00427FC1  |.  0F84>je      004281E6

注册判断的关键变量,为零错,为1注册成功:
byte ptr [ecx+3E4]

查找所有命令:
找到的命令
地址       反汇编                                    注释
00407AAF   cmp     byte ptr [ecx+3E4], 0
00407B6A   cmp     byte ptr [ecx+3E4], 0
00407EF8   cmp     byte ptr [ecx+3E4], 0
004083F1   cmp     byte ptr [ecx+3E4], 0
00408868   cmp     byte ptr [ecx+3E4], 0
00408B44   cmp     byte ptr [ecx+3E4], 0
00427ECE   cmp     byte ptr [ecx+3E4], 0
00427FBA   cmp     byte ptr [ecx+3E4], 0             (初始 CPU 选择)
00428067   cmp     byte ptr [ecx+3E4], 0

                 第十二章  关键CALL的研判方法

此软件关键CALL的研判是许多人的难点,这是初学破解的
必经历程。判断方法:确定关键变量,按照就近原则顺藤
摸瓜。

向上看,发现关键CALL:

00427F8F  |.  E8 6>call    004262FC                           ; \001.004262FC

00427F94  |.  59   pop     ecx
00427F95  |.  8B0D>mov     ecx, dword ptr [52E328]            ;  001._IconConverter
00427F9B  |.  8B11 mov     edx, dword ptr [ecx]
00427F9D  |.  8882>mov     byte ptr [edx+3E4], al
00427FA3  |.  FF4D>dec     dword ptr [ebp-3C]
00427FA6  |.  8D45>lea     eax, dword ptr [ebp-C]
00427FA9  |.  BA 0>mov     edx, 2
00427FAE  |.  E8 B>call    00509664
00427FB3  |.  A1 2>mov     eax, dword ptr [52E328]
00427FB8  |.  8B08 mov     ecx, dword ptr [eax]
00427FBA  |.  80B9>cmp     byte ptr [ecx+3E4], 0
00427FC1  |.  0F84>je      004281E6

                第十三章   明明白白CALL的含义---给基本CALL自动加注释

IDA的流程图很直观地显示上述关键变量处的程序流程分歧点。
但对关键CALL的判断不如OD好理解。但IDA可以省却不少猜CALL的
工作量。

OD中:
00427F85  |.  E8 F>call    004D8188

IDA中:
call    @TControl@GetText$qqrv ; TControl::GetText(void)
这又说明了IDA的一大优势:大部分的基本的CALL不用猜具体含义。前提是
要有该软件的签名文件。

我们可以通过IDA创建MAP文件,再通过OD中的GODUP插件载入此MAP,
从而使OD获得IDA在这方面的功能。

最近几年开始受到老手欢迎的Windbg专业级的动态调试器在这方面同样具有
巨大的优势。但它同样具有软件体积大,symbol文件巨大的笨重的缺点。
Windbg可以用于Kernel模式调试是受欢迎的主要原因。

               第十四章   程序流程把握能力的三种培养方法

3.注册判断的程序流程。具体又分为两部分:
  A.注册正确的程序流程。
  B.注册正确的程序流程所要求的一些条件。

  我说过:程序流程的把握能力是算法分析的核心。怎样培养
程序流程的把握能力?个人的经验认为有三种方法可行:
one:  阅读程序段,手工画出流程图。初学者推荐此法。
two:  学会编程。                  老手建议用此法。
three:使用IDA。                  逆向大工程和密码学推荐。

   平时练习时,建议前两种方法。IDA可以做为答案帮助自己理解
程序流程。从上可以看出,科班生学破解在此处很轻松。我自己是
深有体会,一位同时学破解的科班朋友在此处的提高让我羡慕了好
一阵子。

               第十五章  OD的MAP文件

   破解到一定的水平和层次,要求多看多想少调试。即要求提高自己的
静态汇编破解的能力。IDA的流程图功能在程序流程的把握上具有巨大的优势。
提高静态汇编理解能力有助于提高IDA的使用效率。

载入IDA转换的MAP文件后的OD,许多CALL 地址的地方变成了有注释含义的语句,
注册判断主程序段:

00427EB0 >/.  5>push    ebp
00427EB1  |.  8>mov     ebp, esp
00427EB3  |.  8>add     esp, -64
00427EB6  |.  8>mov     dword ptr [ebp-60], edx
00427EB9  |.  8>mov     dword ptr [ebp-5C], eax
00427EBC  |.  B>mov     eax, 0052462C
00427EC1  |.  E>call    <@__InitExceptBlockLDTC>
00427EC6  |.  8>mov     edx, dword ptr [52E328]          ;  001._IconConverter
00427ECC  |.  8>mov     ecx, dword ptr [edx]
00427ECE  |.  8>cmp     byte ptr [ecx+3E4], 0
00427ED5  |.  0>jnz     <loc_428215>
00427EDB  |.  6>mov     word ptr [ebp-48], 8
00427EE1  |.  8>lea     eax, dword ptr [ebp-4]
00427EE4  |.  E>call    <unknown_libname_44>
00427EE9  |.  8>mov     edx, eax
00427EEB  |.  F>inc     dword ptr [ebp-3C]
00427EEE  |.  8>mov     ecx, dword ptr [ebp-5C]
00427EF1  |.  8>mov     eax, dword ptr [ecx+300]
00427EF7  |.  E>call    <TControl::GetText(void)>
00427EFC  |.  8>lea     eax, dword ptr [ebp-4]
00427EFF  |.  E>call    <System::AnsiString::Length(void>
00427F04  |.  8>cmp     eax, 3
00427F07  |.  0>setl    dl
00427F0A  |.  8>and     edx, 1
00427F0D  |.  5>push    edx                              ; /Arg1
00427F0E  |.  F>dec     dword ptr [ebp-3C]               ; |
00427F11  |.  8>lea     eax, dword ptr [ebp-4]           ; |
00427F14  |.  B>mov     edx, 2                           ; |
00427F19  |.  E>call    <sub_509664>                     ; \001.00509664
00427F1E  |.  5>pop     ecx
00427F1F  |.  8>test    cl, cl
00427F21  |.  7>je      short <loc_427F5F>
00427F23  |.  6>mov     word ptr [ebp-48], 14
00427F29  |.  B>mov     edx, 00523BDE                    ;  ASCII "Please input your Full Name!"
00427F2E  |.  8>lea     eax, dword ptr [ebp-8]
00427F31  |.  E>call    <sub_509504>
00427F36  |.  F>inc     dword ptr [ebp-3C]
00427F39  |.  8>mov     eax, dword ptr [eax]
00427F3B  |.  E>call    <Dialogs::ShowMessage(System::An>
00427F40  |.  F>dec     dword ptr [ebp-3C]
00427F43  |.  8>lea     eax, dword ptr [ebp-8]
00427F46  |.  B>mov     edx, 2
00427F4B  |.  E>call    <sub_509664>
00427F50  |.  8>mov     ecx, dword ptr [ebp-58]
00427F53  |.  6>mov     dword ptr fs:[0], ecx
00427F5A  |.  E>jmp     <loc_428227>
00427F5F >|>  6>push    1F4                              ; /Timeout = 500. ms
00427F64  |.  E>call    <Sleep>                          ; \Sleep
00427F69  |.  6>mov     word ptr [ebp-48], 20
00427F6F  |.  8>lea     eax, dword ptr [ebp-C]
00427F72  |.  E>call    <unknown_libname_44>
00427F77  |.  8>mov     edx, eax
00427F79  |.  F>inc     dword ptr [ebp-3C]
00427F7C  |.  8>mov     ecx, dword ptr [ebp-5C]
00427F7F  |.  8>mov     eax, dword ptr [ecx+304]
00427F85  |.  E>call    <TControl::GetText(void)>
00427F8A  |.  8>lea     edx, dword ptr [ebp-C]
00427F8D  |.  F>push    dword ptr [edx]                  ; /Arg1
00427F8F  |.  E>call    <sub_4262FC>                     ; \001.004262FC
00427F94  |.  5>pop     ecx
00427F95  |.  8>mov     ecx, dword ptr [52E328]          ;  001._IconConverter
00427F9B  |.  8>mov     edx, dword ptr [ecx]
00427F9D  |.  8>mov     byte ptr [edx+3E4], al
00427FA3  |.  F>dec     dword ptr [ebp-3C]
00427FA6  |.  8>lea     eax, dword ptr [ebp-C]
00427FA9  |.  B>mov     edx, 2
00427FAE  |.  E>call    <sub_509664>
00427FB3  |.  A>mov     eax, dword ptr [52E328]
00427FB8  |.  8>mov     ecx, dword ptr [eax]
00427FBA  |.  8>cmp     byte ptr [ecx+3E4], 0
00427FC1  |.  0>je      <loc_4281E6>
00427FC7  |.  6>mov     word ptr [ebp-48], 2C
00427FCD  |.  8>lea     eax, dword ptr [ebp-10]
00427FD0  |.  E>call    <unknown_libname_44>
00427FD5  |.  8>mov     edx, eax
00427FD7  |.  F>inc     dword ptr [ebp-3C]
00427FDA  |.  8>mov     ecx, dword ptr [ebp-5C]
00427FDD  |.  8>mov     eax, dword ptr [ecx+304]
00427FE3  |.  E>call    <TControl::GetText(void)>
00427FE8  |.  8>lea     edx, dword ptr [ebp-10]
00427FEB  |.  8>mov     eax, dword ptr [ebp-5C]
00427FEE  |.  0>add     eax, 320
00427FF3  |.  E>call    <sub_509694>
00427FF8  |.  F>dec     dword ptr [ebp-3C]
00427FFB  |.  8>lea     eax, dword ptr [ebp-10]
00427FFE  |.  B>mov     edx, 2
00428003  |.  E>call    <sub_509664>
00428008  |.  8>mov     eax, dword ptr [ebp-5C]
0042800B  |.  0>add     eax, 320
00428010  |.  E>call    <System::AnsiString::c_str(void)>
00428015  |.  0>movsx   edx, byte ptr [eax+17]
00428019  |.  8>cmp     edx, 30
0042801C  |.  7>jl      short <loc_428034>
0042801E  |.  8>mov     eax, dword ptr [ebp-5C]
00428021  |.  0>add     eax, 320
00428026  |.  E>call    <System::AnsiString::c_str(void)>
0042802B  |.  0>movsx   edx, byte ptr [eax+17]
0042802F  |.  8>cmp     edx, 39
00428032  |.  7>jle     short <loc_428043>
00428034 >|>  8>mov     ecx, dword ptr [52E328]          ;  001._IconConverter
0042803A  |.  8>mov     eax, dword ptr [ecx]
0042803C  |.  C>mov     byte ptr [eax+3E4], 0
00428043 >|>  B>mov     dl, 1
00428045  |.  A>mov     eax, dword ptr [<off_47E484>]
0042804A  |.  E>call    <Registry::TRegistry::TRegistry(>
0042804F  |.  8>mov     dword ptr [ebp-64], eax
00428052  |.  B>mov     edx, 80000001
00428057  |.  8>mov     eax, dword ptr [ebp-64]
0042805A  |.  E>call    <Registry::TRegistry::SetRootKey>
0042805F  |.  8>mov     edx, dword ptr [52E328]          ;  001._IconConverter
00428065  |.  8>mov     ecx, dword ptr [edx]
00428067  |.  8>cmp     byte ptr [ecx+3E4], 0
0042806E  |.  0>je      <loc_42817A>
00428074  |.  6>mov     word ptr [ebp-48], 38
0042807A  |.  B>mov     edx, 00523BFB                    ;  ASCII "Software\XTZY\Pic2Ico"
0042807F  |.  8>lea     eax, dword ptr [ebp-14]
00428082  |.  E>call    <sub_509504>
00428087  |.  F>inc     dword ptr [ebp-3C]
0042808A  |.  8>mov     edx, dword ptr [eax]
0042808C  |.  B>mov     cl, 1
0042808E  |.  8>mov     eax, dword ptr [ebp-64]
00428091  |.  E>call    <Registry::TRegistry::OpenKey(Sy>
00428096  |.  8>test    al, al
00428098  |.  0>setne   al
0042809B  |.  8>and     eax, 1
0042809E  |.  5>push    eax                              ; /Arg1
0042809F  |.  F>dec     dword ptr [ebp-3C]               ; |
004280A2  |.  8>lea     eax, dword ptr [ebp-14]          ; |
004280A5  |.  B>mov     edx, 2                           ; |
004280AA  |.  E>call    <sub_509664>                     ; \001.00509664
004280AF  |.  5>pop     ecx
004280B0  |.  8>test    ecx, ecx
004280B2  |.  0>je      <loc_42817A>
004280B8  |.  8>lea     eax, dword ptr [ebp-1C]
004280BB  |.  E>call    <unknown_libname_44>
004280C0  |.  8>mov     edx, eax
004280C2  |.  F>inc     dword ptr [ebp-3C]
004280C5  |.  8>mov     ecx, dword ptr [ebp-5C]
004280C8  |.  8>mov     eax, dword ptr [ecx+304]
004280CE  |.  E>call    <TControl::GetText(void)>
004280D3  |.  8>lea     edx, dword ptr [ebp-1C]
004280D6  |.  F>push    dword ptr [edx]
004280D8  |.  6>mov     word ptr [ebp-48], 44
004280DE  |.  B>mov     edx, 00523C11                    ;  ASCII "NO"
004280E3  |.  8>lea     eax, dword ptr [ebp-18]
004280E6  |.  E>call    <sub_509504>
004280EB  |.  F>inc     dword ptr [ebp-3C]
004280EE  |.  8>mov     edx, dword ptr [eax]
004280F0  |.  8>mov     eax, dword ptr [ebp-64]
004280F3  |.  5>pop     ecx
004280F4  |.  E>call    <sub_47E824>
004280F9  |.  F>dec     dword ptr [ebp-3C]
004280FC  |.  8>lea     eax, dword ptr [ebp-1C]
004280FF  |.  B>mov     edx, 2
00428104  |.  E>call    <sub_509664>
00428109  |.  F>dec     dword ptr [ebp-3C]
0042810C  |.  8>lea     eax, dword ptr [ebp-18]
0042810F  |.  B>mov     edx, 2
00428114  |.  E>call    <sub_509664>
00428119  |.  8>lea     eax, dword ptr [ebp-24]
0042811C  |.  E>call    <unknown_libname_44>
00428121  |.  8>mov     edx, eax
00428123  |.  F>inc     dword ptr [ebp-3C]
00428126  |.  8>mov     ecx, dword ptr [ebp-5C]
00428129  |.  8>mov     eax, dword ptr [ecx+300]
0042812F  |.  E>call    <TControl::GetText(void)>
00428134  |.  8>lea     edx, dword ptr [ebp-24]
00428137  |.  F>push    dword ptr [edx]
00428139  |.  6>mov     word ptr [ebp-48], 50
0042813F  |.  B>mov     edx, 00523C14                    ;  ASCII "Name"
00428144  |.  8>lea     eax, dword ptr [ebp-20]
00428147  |.  E>call    <sub_509504>
0042814C  |.  F>inc     dword ptr [ebp-3C]
0042814F  |.  8>mov     edx, dword ptr [eax]
00428151  |.  8>mov     eax, dword ptr [ebp-64]
00428154  |.  5>pop     ecx
00428155  |.  E>call    <sub_47E824>
0042815A  |.  F>dec     dword ptr [ebp-3C]
0042815D  |.  8>lea     eax, dword ptr [ebp-24]
00428160  |.  B>mov     edx, 2
00428165  |.  E>call    <sub_509664>
0042816A  |.  F>dec     dword ptr [ebp-3C]
0042816D  |.  8>lea     eax, dword ptr [ebp-20]
00428170  |.  B>mov     edx, 2
00428175  |.  E>call    <sub_509664>
0042817A >|>  8>mov     eax, dword ptr [ebp-64]
0042817D  |.  E>call    <sub_47E5F4>
00428182  |.  8>mov     edx, dword ptr [ebp-64]
00428185  |.  8>mov     dword ptr [ebp-2C], edx
00428188  |.  8>cmp     dword ptr [ebp-2C], 0
0042818C  |.  7>je      short <loc_4281AF>
0042818E  |.  8>mov     ecx, dword ptr [ebp-2C]
00428191  |.  8>mov     eax, dword ptr [ecx]
00428193  |.  8>mov     dword ptr [ebp-28], eax
00428196  |.  6>mov     word ptr [ebp-48], 68
0042819C  |.  B>mov     edx, 3
004281A1  |.  8>mov     eax, dword ptr [ebp-2C]
004281A4  |.  8>mov     ecx, dword ptr [eax]
004281A6  |.  F>call    dword ptr [ecx-4]
004281A9  |.  6>mov     word ptr [ebp-48], 5C
004281AF >|>  6>mov     word ptr [ebp-48], 74
004281B5  |.  B>mov     edx, 00523C19                    ;  ASCII "Register successfully!",LF,"Thank you."
004281BA  |.  8>lea     eax, dword ptr [ebp-30]
004281BD  |.  E>call    <sub_509504>
004281C2  |.  F>inc     dword ptr [ebp-3C]
004281C5  |.  8>mov     eax, dword ptr [eax]
004281C7  |.  E>call    <Dialogs::ShowMessage(System::An>
004281CC  |.  F>dec     dword ptr [ebp-3C]
004281CF  |.  8>lea     eax, dword ptr [ebp-30]
004281D2  |.  B>mov     edx, 2
004281D7  |.  E>call    <sub_509664>
004281DC  |.  8>mov     eax, dword ptr [ebp-5C]
004281DF  |.  E>call    <Forms::TCustomForm::Close(void)>
004281E4  |.  E>jmp     short <loc_42821D>
004281E6 >|>  6>mov     word ptr [ebp-48], 80
004281EC  |.  B>mov     edx, 00523C3B                    ;  ASCII "Your registration code is invalid.",LF,"If you have purchased this software and get the wrong code, maybe you have not downloaded and installed the latest version. Or please send email to: support@exeicon.com ",LF
004281F1  |.  8>lea     eax, dword ptr [ebp-34]
004281F4  |.  E>call    <sub_509504>
004281F9  |.  F>inc     dword ptr [ebp-3C]
004281FC  |.  8>mov     eax, dword ptr [eax]
004281FE  |.  E>call    <Dialogs::ShowMessage(System::An>
00428203  |.  F>dec     dword ptr [ebp-3C]
00428206  |.  8>lea     eax, dword ptr [ebp-34]
00428209  |.  B>mov     edx, 2
0042820E  |.  E>call    <sub_509664>
00428213  |.  E>jmp     short <loc_42821D>
00428215 >|>  8>mov     eax, dword ptr [ebp-5C]
00428218  |.  E>call    <Forms::TCustomForm::Close(void)>
0042821D >|>  8>mov     edx, dword ptr [ebp-58]
00428220  |.  6>mov     dword ptr fs:[0], edx
00428227 >|>  8>mov     esp, ebp
00428229  |.  5>pop     ebp
0042822A  \.  C>retn

                第十六章   Pic2Ico 2.1注册主程序的功能模块简要理解

粗粗的阅读后,我们大致了解了此段的大致含义和重要程序功能块:
1.判断用户名是否为空。
00427F19  |.  E>call    <sub_509664>                     ; \001.00509664
00427F1E  |.  5>pop     ecx
00427F1F  |.  8>test    cl, cl
00427F21  |.  7>je      short <loc_427F5F>
00427F23  |.  6>mov     word ptr [ebp-48], 14
00427F29  |.  B>mov     edx, 00523BDE                    ;  ASCII "Please input your Full Name!"
00427F2E  |.  8>lea     eax, dword ptr [ebp-8]
00427F31  |.  E>call    <sub_509504>

2.注册成功的关键判断:
00427F8F  |.  E>call    <sub_4262FC>                     ; \001.004262FC
00427F94  |.  5>pop     ecx
00427F95  |.  8>mov     ecx, dword ptr [52E328]          ;  001._IconConverter
00427F9B  |.  8>mov     edx, dword ptr [ecx]
00427F9D  |.  8>mov     byte ptr [edx+3E4], al
00427FA3  |.  F>dec     dword ptr [ebp-3C]
00427FA6  |.  8>lea     eax, dword ptr [ebp-C]
00427FA9  |.  B>mov     edx, 2
00427FAE  |.  E>call    <sub_509664>
00427FB3  |.  A>mov     eax, dword ptr [52E328]
00427FB8  |.  8>mov     ecx, dword ptr [eax]
00427FBA  |.  8>cmp     byte ptr [ecx+3E4], 0
00427FC1  |.  0>je      <loc_4281E6>

3.经典的语句,判断是否为数字。后来调试才证实是注册码的20-24位必须为数字。

关键call    <sub_4262FC>里对20-24位没有交代。这个软件的巧妙就在于:在程序的
两处分别进行判断,迷惑了一些人。那些以注册码的获得为目的的人可能会蒙对,
虽然错误地理解为20-24位为任意字符,却没有输入字母,而是运气地输入数字。
但写注册机时,这种理解的粗心是致命的。因此将注册机的编写作为比算法分析(并追出
注册码)层次更高的境界是有理由的。

00428010  |.  E>call    <System::AnsiString::c_str(void)>
00428015  |.  0>movsx   edx, byte ptr [eax+17]
00428019  |.  8>cmp     edx, 30
0042801C  |.  7>jl      short <loc_428034>
0042801E  |.  8>mov     eax, dword ptr [ebp-5C]
00428021  |.  0>add     eax, 320
00428026  |.  E>call    <System::AnsiString::c_str(void)>
0042802B  |.  0>movsx   edx, byte ptr [eax+17]
0042802F  |.  8>cmp     edx, 39
00428032  |.  7>jle     short <loc_428043>
00428034 >|>  8>mov     ecx, dword ptr [52E328]          ;  001._IconConverter
0042803A  |.  8>mov     eax, dword ptr [ecx]
0042803C  |.  C>mov     byte ptr [eax+3E4], 0
00428043 >|>  B>mov     dl, 1

4.将注册信息写入注册表,形式:

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\XTZY\Pic2Ico]
"NO"="520NBA2005YH*QH*UK*12345C*AN*PD*MO*OAD*RP2I3"
"Name"="NBA2005"

其中NO就是注册码。

0042804A  |.  E>call    <Registry::TRegistry::TRegistry(>
0042804F  |.  8>mov     dword ptr [ebp-64], eax
00428052  |.  B>mov     edx, 80000001
00428057  |.  8>mov     eax, dword ptr [ebp-64]
0042805A  |.  E>call    <Registry::TRegistry::SetRootKey>
0042805F  |.  8>mov     edx, dword ptr [52E328]          ;  001._IconConverter
00428065  |.  8>mov     ecx, dword ptr [edx]
00428067  |.  8>cmp     byte ptr [ecx+3E4], 0
0042806E  |.  0>je      <loc_42817A>
00428074  |.  6>mov     word ptr [ebp-48], 38
0042807A  |.  B>mov     edx, 00523BFB                    ;  ASCII "Software\XTZY\Pic2Ico"
0042807F  |.  8>lea     eax, dword ptr [ebp-14]
00428082  |.  E>call    <sub_509504>
00428087  |.  F>inc     dword ptr [ebp-3C]
0042808A  |.  8>mov     edx, dword ptr [eax]
0042808C  |.  B>mov     cl, 1
0042808E  |.  8>mov     eax, dword ptr [ebp-64]
00428091  |.  E>call    <Registry::TRegistry::OpenKey(Sy>
00428096  |.  8>test    al, al
00428098  |.  0>setne   al
0042809B  |.  8>and     eax, 1
0042809E  |.  5>push    eax                              ; /Arg1
0042809F  |.  F>dec     dword ptr [ebp-3C]               ; |
004280A2  |.  8>lea     eax, dword ptr [ebp-14]          ; |
004280A5  |.  B>mov     edx, 2                           ; |
004280AA  |.  E>call    <sub_509664>                     ; \001.00509664
004280AF  |.  5>pop     ecx
004280B0  |.  8>test    ecx, ecx
004280B2  |.  0>je      <loc_42817A>
004280B8  |.  8>lea     eax, dword ptr [ebp-1C]
004280BB  |.  E>call    <unknown_libname_44>
004280C0  |.  8>mov     edx, eax
004280C2  |.  F>inc     dword ptr [ebp-3C]
004280C5  |.  8>mov     ecx, dword ptr [ebp-5C]
004280C8  |.  8>mov     eax, dword ptr [ecx+304]
004280CE  |.  E>call    <TControl::GetText(void)>
004280D3  |.  8>lea     edx, dword ptr [ebp-1C]
004280D6  |.  F>push    dword ptr [edx]
004280D8  |.  6>mov     word ptr [ebp-48], 44
004280DE  |.  B>mov     edx, 00523C11                    ;  ASCII "NO"
004280E3  |.  8>lea     eax, dword ptr [ebp-18]
004280E6  |.  E>call    <sub_509504>
004280EB  |.  F>inc     dword ptr [ebp-3C]
004280EE  |.  8>mov     edx, dword ptr [eax]
004280F0  |.  8>mov     eax, dword ptr [ebp-64]
004280F3  |.  5>pop     ecx
004280F4  |.  E>call    <sub_47E824>
004280F9  |.  F>dec     dword ptr [ebp-3C]
004280FC  |.  8>lea     eax, dword ptr [ebp-1C]
004280FF  |.  B>mov     edx, 2
00428104  |.  E>call    <sub_509664>
00428109  |.  F>dec     dword ptr [ebp-3C]
0042810C  |.  8>lea     eax, dword ptr [ebp-18]
0042810F  |.  B>mov     edx, 2
00428114  |.  E>call    <sub_509664>
00428119  |.  8>lea     eax, dword ptr [ebp-24]
0042811C  |.  E>call    <unknown_libname_44>
00428121  |.  8>mov     edx, eax
00428123  |.  F>inc     dword ptr [ebp-3C]
00428126  |.  8>mov     ecx, dword ptr [ebp-5C]
00428129  |.  8>mov     eax, dword ptr [ecx+300]
0042812F  |.  E>call    <TControl::GetText(void)>
00428134  |.  8>lea     edx, dword ptr [ebp-24]
00428137  |.  F>push    dword ptr [edx]
00428139  |.  6>mov     word ptr [ebp-48], 50
0042813F  |.  B>mov     edx, 00523C14                    ;  ASCII "Name"
00428144  |.  8>lea     eax, dword ptr [ebp-20]
00428147  |.  E>call    <sub_509504>
0042814C  |.  F>inc     dword ptr [ebp-3C]
0042814F  |.  8>mov     edx, dword ptr [eax]
00428151  |.  8>mov     eax, dword ptr [ebp-64]
00428154  |.  5>pop     ecx
00428155  |.  E>call    <sub_47E824>
0042815A  |.  F>dec     dword ptr [ebp-3C]
0042815D  |.  8>lea     eax, dword ptr [ebp-24]
00428160  |.  B>mov     edx, 2
00428165  |.  E>call    <sub_509664>

              第十七章   程序功能段的功能理解和提高方法

这里详细说明的原因,是因为对程序功能段的功能理解是破解
水平和效率的表现,是初学算法分析的难点,也是众多破文根本
不重视的地方。对程序功能段的功能的研判能力如何进行提高?

我个人的建议:
1.初学者注意记忆和积累一些经典的功能段。如上述的判断是否为
数字和写入注册信息的功能段,都是最常用和最基本的。在高手的
破文中,有许多这方面的精彩,可以借鉴记忆。《加密和解密II》
中有较全面而系统的基本和常用的汇编功能段的阐述,熟读并理解
记忆后,你再多做练习和总结,相信士别三日当刮目相看。

举例

小写转大写的程序段:
00401126  |.  0FBE8C05 44FF>movsx   ecx, byte ptr [ebp+eax-BC]       ;  用户名
0040112E  |.  83F9 61       cmp     ecx, 61
00401131  |.  7C 07         jl      short 0040113A                   ;  不是大写就转换成大写
00401133  |.  90            nop
00401134  |.  90            nop
00401135  |.  90            nop
00401136  |.  90            nop
00401137  |.  83E9 20       sub     ecx, 20
0040113A  |>  8BF1          mov     esi, ecx

2.人门者最好学一门编程语言。自己编程一段单一的功能,自己反汇编研究,
不断的总结、记忆和积累。

推荐一位破解模范的痴情之作:
{

【原创】菜鸟看懂算法以后之一:头痛的64次左移   

--------------------------------------------------------------------------------
标 题: 【原创】菜鸟看懂算法以后之一:头痛的64次左移
作 者: jney2
时 间: 2005-04-22,13:07
链 接: http://bbs.pediy.com/showthread.php?t=13072

菜鸟看懂算法以后之一:头痛的64次左移

}

好了,关于算法分析的要点和难点、相应的学习提高方法基本介绍差不多了。

        第十八章   关键CALL的被调用情况分析方法

对于这个软件,我再进入关键CALL,进行简要的分析。

首先,我们要了解此关键CALL的调用情况。

OD的方法:

004262FC >/$  5>push    ebp
信息窗口:
本地调用来自 00426B07, _TForm3_suiButton2Click+0DF
001.sub_4262FC

004262FD  |.  8>mov     ebp, esp
004262FF  |.  8>add     esp, -90
00426305  |.  5>push    esi
00426306  |.  5>push    edi
00426307  |.  B>mov     eax, 00523D88
0042630C  |.  E>call    <@__InitExceptBlockLDTC>

发现有两处调用:

IDA的方法:

或者直接快捷键X:

原来这个软件是注册验证和重新启动程序两次验证。

     第十九章  加MAP后的OD 关键CALL代码

注册码的符合条件判断段,也是算法分析的关键处:
004262FC >/$  5>push    ebp
004262FD  |.  8>mov     ebp, esp
004262FF  |.  8>add     esp, -90
00426305  |.  5>push    esi
00426306  |.  5>push    edi
00426307  |.  B>mov     eax, 00523D88
0042630C  |.  E>call    <@__InitExceptBlockLDTC>
00426311  |.  C>mov     dword ptr [ebp-C], 1
00426318  |.  8>lea     edx, dword ptr [ebp+8]
0042631B  |.  8>lea     eax, dword ptr [ebp+8]
0042631E  |.  E>call    <System::AnsiString::AnsiString(>
00426323  |.  F>inc     dword ptr [ebp-C]
00426326  |.  6>mov     word ptr [ebp-18], 8
0042632C  |.  C>mov     byte ptr [ebp-29], 0
00426330  |.  6>mov     word ptr [ebp-18], 14
00426336  |.  8>lea     eax, dword ptr [ebp-4]
00426339  |.  E>call    <unknown_libname_44>
0042633E  |.  8>mov     edx, eax
00426340  |.  F>inc     dword ptr [ebp-C]
00426343  |.  8>lea     eax, dword ptr [ebp+8]
00426346  |.  E>call    <sub_5099AC>
0042634B  |.  8>lea     edx, dword ptr [ebp-4]
0042634E  |.  8>lea     eax, dword ptr [ebp+8]
00426351  |.  E>call    <sub_509694>
00426356  |.  F>dec     dword ptr [ebp-C]
00426359  |.  8>lea     eax, dword ptr [ebp-4]
0042635C  |.  B>mov     edx, 2
00426361  |.  E>call    <sub_509664>
00426366  |.  8>lea     eax, dword ptr [ebp+8]
00426369  |.  E>call    <System::AnsiString::Length(void>
0042636E  |.  8>cmp     eax, 2C
00426371  |.  0>jnz     <loc_4265BB>
00426377  |.  B>mov     esi, 005237CA                    ;  ASCII "1z1h+2a0n-0g8y*9a1n|"
0042637C  |.  8>lea     edi, dword ptr [ebp-7C]
0042637F  |.  B>mov     ecx, 5
00426384  |.  F>rep     movs dword ptr es:[edi], dword p>
00426386  |.  A>movs    byte ptr es:[edi], byte ptr [esi>
00426387  |.  6>mov     word ptr [ebp-18], 8
0042638D  |.  8>lea     eax, dword ptr [ebp+8]
00426390  |.  E>call    <System::AnsiString::c_str(void)>
00426395  |.  0>movsx   edx, byte ptr [eax+28]
00426399  |.  8>cmp     edx, 50
0042639C  |.  7>je      short <loc_4263C1>
0042639E  |.  3>xor     eax, eax
004263A0  |.  5>push    eax
004263A1  |.  F>dec     dword ptr [ebp-C]
004263A4  |.  8>lea     eax, dword ptr [ebp+8]
004263A7  |.  B>mov     edx, 2
004263AC  |.  E>call    <sub_509664>
004263B1  |.  5>pop     eax
004263B2  |.  8>mov     edx, dword ptr [ebp-28]
004263B5  |.  6>mov     dword ptr fs:[0], edx
004263BC  |.  E>jmp     <loc_4265DA>
004263C1 >|>  8>lea     eax, dword ptr [ebp+8]
004263C4  |.  E>call    <System::AnsiString::c_str(void)>
004263C9  |.  0>movsx   edx, byte ptr [eax+29]
004263CD  |.  8>cmp     edx, 32
004263D0  |.  7>je      short <loc_4263F5>
004263D2  |.  3>xor     eax, eax
004263D4  |.  5>push    eax
004263D5  |.  F>dec     dword ptr [ebp-C]
004263D8  |.  8>lea     eax, dword ptr [ebp+8]
004263DB  |.  B>mov     edx, 2
004263E0  |.  E>call    <sub_509664>
004263E5  |.  5>pop     eax
004263E6  |.  8>mov     edx, dword ptr [ebp-28]
004263E9  |.  6>mov     dword ptr fs:[0], edx
004263F0  |.  E>jmp     <loc_4265DA>
004263F5 >|>  8>lea     eax, dword ptr [ebp+8]
004263F8  |.  E>call    <System::AnsiString::c_str(void)>
004263FD  |.  0>movsx   edx, byte ptr [eax+2A]
00426401  |.  8>cmp     edx, 49
00426404  |.  7>je      short <loc_426429>
00426406  |.  3>xor     eax, eax
00426408  |.  5>push    eax
00426409  |.  F>dec     dword ptr [ebp-C]
0042640C  |.  8>lea     eax, dword ptr [ebp+8]
0042640F  |.  B>mov     edx, 2
00426414  |.  E>call    <sub_509664>
00426419  |.  5>pop     eax
0042641A  |.  8>mov     edx, dword ptr [ebp-28]
0042641D  |.  6>mov     dword ptr fs:[0], edx
00426424  |.  E>jmp     <loc_4265DA>
00426429 >|>  8>lea     eax, dword ptr [ebp+8]
0042642C  |.  E>call    <System::AnsiString::c_str(void)>
00426431  |.  0>movsx   edx, byte ptr [eax+2B]
00426435  |.  8>cmp     edx, 33
00426438  |.  7>je      short <loc_42645D>
0042643A  |.  3>xor     eax, eax
0042643C  |.  5>push    eax
0042643D  |.  F>dec     dword ptr [ebp-C]
00426440  |.  8>lea     eax, dword ptr [ebp+8]
00426443  |.  B>mov     edx, 2
00426448  |.  E>call    <sub_509664>
0042644D  |.  5>pop     eax
0042644E  |.  8>mov     edx, dword ptr [ebp-28]
00426451  |.  6>mov     dword ptr fs:[0], edx
00426458  |.  E>jmp     <loc_4265DA>
0042645D >|>  8>lea     eax, dword ptr [ebp+8]
00426460  |.  E>call    <System::AnsiString::c_str(void)>
00426465  |.  5>push    eax                              ; /Arg2
00426466  |.  8>lea     edx, dword ptr [ebp-64]          ; |
00426469  |.  5>push    edx                              ; |Arg1
0042646A  |.  E>call    <_strcpy>                        ; \001.004FE1B4
0042646F  |.  8>add     esp, 8
00426472  |.  0>movsx   ecx, byte ptr [ebp-63]
00426476  |.  8>cmp     ecx, 32
00426479  |.  0>jnz     <loc_4265BB>
0042647F  |.  C>mov     byte ptr [ebp-63], 23
00426483  |.  C>mov     byte ptr [ebp-29], 1
00426487  |.  C>mov     dword ptr [ebp-30], 2
0042648E >|>  8>/mov     eax, dword ptr [ebp-30]
00426491  |.  0>|movsx   edx, byte ptr [ebp+eax-7C]
00426496  |.  8>|mov     ecx, dword ptr [ebp-30]
00426499  |.  0>|movsx   eax, byte ptr [ebp+ecx-65]
0042649E  |.  0>|add     edx, eax
004264A0  |.  8>|mov     ecx, dword ptr [ebp-30]
004264A3  |.  0>|movsx   eax, byte ptr [ebp+ecx-64]
004264A8  |.  3>|xor     edx, eax
004264AA  |.  8>|mov     ecx, dword ptr [ebp-30]
004264AD  |.  0>|movsx   eax, byte ptr [ebp+ecx-7C]
004264B2  |.  3>|xor     edx, eax
004264B4  |.  5>|push    edx                             ; /Arg1
004264B5  |.  E>|call    <sub_40E1E4>                    ; \001.0040E1E4
004264BA  |.  5>|pop     ecx
004264BB  |.  B>|mov     ecx, 1A
004264C0  |.  9>|cdq
004264C1  |.  F>|idiv    ecx
004264C3  |.  8>|add     edx, 41
004264C6  |.  8>|mov     eax, dword ptr [ebp-30]
004264C9  |.  0>|movsx   ecx, byte ptr [ebp+eax-5B]
004264CE  |.  3>|cmp     edx, ecx
004264D0  |.  7>|je      short <loc_4264D8>
004264D2  |.  C>|mov     byte ptr [ebp-29], 0
004264D6  |.  E>|jmp     short <loc_4264E1>
004264D8 >|>  F>|inc     dword ptr [ebp-30]
004264DB  |.  8>|cmp     dword ptr [ebp-30], 0A
004264DF  |.^ 7>\jl      short <loc_42648E>
004264E1 >|>  8>cmp     byte ptr [ebp-29], 0
004264E5  |.  0>je      <loc_4265AE>
004264EB  |.  C>mov     dword ptr [ebp-34], 18
004264F2  |.  6>mov     word ptr [ebp-18], 8
004264F8  |.  8>cmp     dword ptr [ebp-34], 28
004264FC  |.  7>jge     short <loc_426549>
004264FE >|>  8>/mov     edx, dword ptr [ebp-34]
00426501  |.  0>|movsx   eax, byte ptr [ebp+edx-7B]
00426506  |.  B>|mov     ecx, 6
0042650B  |.  9>|cdq
0042650C  |.  F>|idiv    ecx
0042650E  |.  8>|mov     ecx, edx
00426510  |.  8>|mov     eax, dword ptr [ebp-34]
00426513  |.  0>|movsx   edx, byte ptr [ebp+eax-7A]
00426518  |.  D>|shl     edx, cl
0042651A  |.  8>|mov     eax, dword ptr [ebp-34]
0042651D  |.  0>|movsx   ecx, byte ptr [ebp+eax-79]
00426522  |.  0>|or      edx, ecx
00426524  |.  5>|push    edx                             ; /Arg1
00426525  |.  E>|call    <sub_40E1E4>                    ; \001.0040E1E4
0042652A  |.  5>|pop     ecx
0042652B  |.  B>|mov     ecx, 1A
00426530  |.  9>|cdq
00426531  |.  F>|idiv    ecx
00426533  |.  8>|add     dl, 61
00426536  |.  8>|mov     eax, dword ptr [ebp-34]
00426539  |.  8>|mov     byte ptr [ebp+eax-A8], dl
00426540  |.  F>|inc     dword ptr [ebp-34]
00426543  |.  8>|cmp     dword ptr [ebp-34], 28
00426547  |.^ 7>\jl      short <loc_4264FE>
00426549 >|>  C>mov     byte ptr [ebp-80], 5A
0042654D  |.  C>mov     byte ptr [ebp-7F], 59
00426551  |.  C>mov     dword ptr [ebp-38], 18
00426558  |.  6>mov     word ptr [ebp-18], 8
0042655E  |.  8>cmp     dword ptr [ebp-38], 28
00426562  |.  7>jge     short <loc_4265AE>
00426564 >|>  8>/mov     edx, dword ptr [ebp-38]
00426567  |.  0>|movsx   eax, byte ptr [ebp+edx-A8]
0042656F  |.  C>|shl     eax, 4
00426572  |.  8>|mov     edx, dword ptr [ebp-38]
00426575  |.  0>|movsx   ecx, byte ptr [ebp+edx-A7]
0042657D  |.  D>|sar     ecx, 1
0042657F  |.  3>|xor     eax, ecx
00426581  |.  5>|push    eax                             ; /Arg1
00426582  |.  E>|call    <sub_40E1E4>                    ; \001.0040E1E4
00426587  |.  5>|pop     ecx
00426588  |.  B>|mov     ecx, 1A
0042658D  |.  9>|cdq
0042658E  |.  F>|idiv    ecx
00426590  |.  8>|add     edx, 41
00426593  |.  8>|mov     eax, dword ptr [ebp-38]
00426596  |.  0>|movsx   eax, byte ptr [ebp+eax-64]
0042659B  |.  3>|cmp     edx, eax
0042659D  |.  7>|je      short <loc_4265A5>
0042659F  |.  C>|mov     byte ptr [ebp-29], 0
004265A3  |.  E>|jmp     short <loc_4265AE>
004265A5 >|>  F>|inc     dword ptr [ebp-38]
004265A8  |.  8>|cmp     dword ptr [ebp-38], 28
004265AC  |.^ 7>\jl      short <loc_426564>
004265AE >|>  0>movsx   edx, byte ptr [ebp-5A]
004265B2  |.  8>cmp     edx, 59
004265B5  |.  7>je      short <loc_4265BB>
004265B7  |.  C>mov     byte ptr [ebp-29], 0
004265BB >|>  8>mov     al, byte ptr [ebp-29]
004265BE  |.  5>push    eax
004265BF  |.  F>dec     dword ptr [ebp-C]
004265C2  |.  8>lea     eax, dword ptr [ebp+8]
004265C5  |.  B>mov     edx, 2
004265CA  |.  E>call    <sub_509664>
004265CF  |.  5>pop     eax
004265D0  |.  8>mov     edx, dword ptr [ebp-28]
004265D3  |.  6>mov     dword ptr fs:[0], edx
004265DA >|>  5>pop     edi
004265DB  |.  5>pop     esi
004265DC  |.  8>mov     esp, ebp
004265DE  |.  5>pop     ebp
004265DF  \.  C>retn

               第二十章  关键CALL的功能模块简要分析

静态汇编后,粗粗看一遍,大致的理解是单线程、顺序判断结构,
程序的流程很简单,明码比较和暗码比较相交错:

1.注册码的长度限制条件:
00426369  |.  E>call    <System::AnsiString::Length(void>
0042636E  |.  8>cmp     eax, 2C
00426371  |.  0>jnz     <loc_4265BB>

2.参与算法分析的关键常量的赋值处:
00426377  |.  B>mov     esi, 005237CA                    ;  ASCII "1z1h+2a0n-0g8y*9a1n|"

判断常量的依据:

3.四位相连的明码比较。后来经过动态调试证实是最后四位。

00426390  |.  E>call    <System::AnsiString::c_str(void)>
00426395  |.  0>movsx   edx, byte ptr [eax+28]
00426399  |.  8>cmp     edx, 50
0042639C  |.  7>je      short <loc_4263C1>
0042639E  |.  3>xor     eax, eax
004263A0  |.  5>push    eax
004263A1  |.  F>dec     dword ptr [ebp-C]
004263A4  |.  8>lea     eax, dword ptr [ebp+8]
004263A7  |.  B>mov     edx, 2
004263AC  |.  E>call    <sub_509664>
004263B1  |.  5>pop     eax
004263B2  |.  8>mov     edx, dword ptr [ebp-28]
004263B5  |.  6>mov     dword ptr fs:[0], edx
004263BC  |.  E>jmp     <loc_4265DA>
004263C1 >|>  8>lea     eax, dword ptr [ebp+8]
004263C4  |.  E>call    <System::AnsiString::c_str(void)>
004263C9  |.  0>movsx   edx, byte ptr [eax+29]
004263CD  |.  8>cmp     edx, 32
004263D0  |.  7>je      short <loc_4263F5>
004263D2  |.  3>xor     eax, eax
004263D4  |.  5>push    eax
004263D5  |.  F>dec     dword ptr [ebp-C]
004263D8  |.  8>lea     eax, dword ptr [ebp+8]
004263DB  |.  B>mov     edx, 2
004263E0  |.  E>call    <sub_509664>
004263E5  |.  5>pop     eax
004263E6  |.  8>mov     edx, dword ptr [ebp-28]
004263E9  |.  6>mov     dword ptr fs:[0], edx
004263F0  |.  E>jmp     <loc_4265DA>
004263F5 >|>  8>lea     eax, dword ptr [ebp+8]
004263F8  |.  E>call    <System::AnsiString::c_str(void)>
004263FD  |.  0>movsx   edx, byte ptr [eax+2A]
00426401  |.  8>cmp     edx, 49
00426404  |.  7>je      short <loc_426429>
00426406  |.  3>xor     eax, eax
00426408  |.  5>push    eax
00426409  |.  F>dec     dword ptr [ebp-C]
0042640C  |.  8>lea     eax, dword ptr [ebp+8]
0042640F  |.  B>mov     edx, 2
00426414  |.  E>call    <sub_509664>
00426419  |.  5>pop     eax
0042641A  |.  8>mov     edx, dword ptr [ebp-28]
0042641D  |.  6>mov     dword ptr fs:[0], edx
00426424  |.  E>jmp     <loc_4265DA>
00426429 >|>  8>lea     eax, dword ptr [ebp+8]
0042642C  |.  E>call    <System::AnsiString::c_str(void)>
00426431  |.  0>movsx   edx, byte ptr [eax+2B]
00426435  |.  8>cmp     edx, 33
00426438  |.  7>je      short <loc_42645D>

4.另外两处的字符明码比较:
第二位判断:
00426472  |.  0FBE>movsx   ecx, byte ptr [ebp-63]
00426476  |.  83F9>cmp     ecx, 32                       ;  第二位为32=2
00426479  |.  0F85>jnz     004265BB     

第十一位的判断:
004265AE  |> \0FBE>movsx   edx, byte ptr [ebp-5A]
004265B2  |.  83FA>cmp     edx, 59
004265B5      74 0>je      short 004265BB

5.,推断第1、3-10为任意,可自己指定。

  循环块(一)根据注册码3-10位和“1z1h+2a0n-0g8y*9a1n|”的
3-10位计算出12-19位:

00426377  |.  B>mov     esi, 005237CA                               ;  ASCII "1z1h+2a0n-0g8y*9a1n|"
0042637C  |.  8>lea     edi, dword ptr [ebp-7C]
0042637F  |.  B>mov     ecx, 5
00426384  |.  F>rep     movs dword ptr es:[edi], dword ptr [esi]
00426386  |.  A>movs    byte ptr es:[edi], byte ptr [esi]
00426387  |.  6>mov     word ptr [ebp-18], 8
0042638D  |.  8>lea     eax, dword ptr [ebp+8]
00426390  |.  E>call    <System::AnsiString::c_str(void)>
00426395  |.  0>movsx   edx, byte ptr [eax+28]
00426399  |.  8>cmp     edx, 50
0042639C  |.  7>je      short <loc_4263C1>
0042639E  |.  3>xor     eax, eax
004263A0  |.  5>push    eax
004263A1  |.  F>dec     dword ptr [ebp-C]
004263A4  |.  8>lea     eax, dword ptr [ebp+8]
004263A7  |.  B>mov     edx, 2
004263AC  |.  E>call    <sub_509664>
004263B1  |.  5>pop     eax
004263B2  |.  8>mov     edx, dword ptr [ebp-28]
004263B5  |.  6>mov     dword ptr fs:[0], edx
004263BC  |.  E>jmp     <loc_4265DA>
004263C1 >|>  8>lea     eax, dword ptr [ebp+8]
004263C4  |.  E>call    <System::AnsiString::c_str(void)>
004263C9  |.  0>movsx   edx, byte ptr [eax+29]
004263CD  |.  8>cmp     edx, 32
004263D0  |.  7>je      short <loc_4263F5>
004263D2  |.  3>xor     eax, eax
004263D4  |.  5>push    eax
004263D5  |.  F>dec     dword ptr [ebp-C]
004263D8  |.  8>lea     eax, dword ptr [ebp+8]
004263DB  |.  B>mov     edx, 2
004263E0  |.  E>call    <sub_509664>
004263E5  |.  5>pop     eax
004263E6  |.  8>mov     edx, dword ptr [ebp-28]
004263E9  |.  6>mov     dword ptr fs:[0], edx
004263F0  |.  E>jmp     <loc_4265DA>
004263F5 >|>  8>lea     eax, dword ptr [ebp+8]
004263F8  |.  E>call    <System::AnsiString::c_str(void)>
004263FD  |.  0>movsx   edx, byte ptr [eax+2A]
00426401  |.  8>cmp     edx, 49
00426404  |.  7>je      short <loc_426429>
00426406  |.  3>xor     eax, eax
00426408  |.  5>push    eax
00426409  |.  F>dec     dword ptr [ebp-C]
0042640C  |.  8>lea     eax, dword ptr [ebp+8]
0042640F  |.  B>mov     edx, 2
00426414  |.  E>call    <sub_509664>
00426419  |.  5>pop     eax
0042641A  |.  8>mov     edx, dword ptr [ebp-28]
0042641D  |.  6>mov     dword ptr fs:[0], edx
00426424  |.  E>jmp     <loc_4265DA>
00426429 >|>  8>lea     eax, dword ptr [ebp+8]
0042642C  |.  E>call    <System::AnsiString::c_str(void)>
00426431  |.  0>movsx   edx, byte ptr [eax+2B]
00426435  |.  8>cmp     edx, 33
00426438  |.  7>je      short <loc_42645D>
0042643A  |.  3>xor     eax, eax
0042643C  |.  5>push    eax
0042643D  |.  F>dec     dword ptr [ebp-C]
00426440  |.  8>lea     eax, dword ptr [ebp+8]
00426443  |.  B>mov     edx, 2
00426448  |.  E>call    <sub_509664>
0042644D  |.  5>pop     eax
0042644E  |.  8>mov     edx, dword ptr [ebp-28]
00426451  |.  6>mov     dword ptr fs:[0], edx
00426458  |.  E>jmp     <loc_4265DA>
0042645D >|>  8>lea     eax, dword ptr [ebp+8]
00426460  |.  E>call    <System::AnsiString::c_str(void)>
00426465  |.  5>push    eax                                         ; /Arg2
00426466  |.  8>lea     edx, dword ptr [ebp-64]                     ; |
00426469  |.  5>push    edx                                         ; |Arg1
0042646A  |.  E>call    <_strcpy>                                   ; \001.004FE1B4
0042646F  |.  8>add     esp, 8
00426472  |.  0>movsx   ecx, byte ptr [ebp-63]
00426476  |.  8>cmp     ecx, 32
00426479  |.  0>jnz     <loc_4265BB>
0042647F  |.  C>mov     byte ptr [ebp-63], 23
00426483  |.  C>mov     byte ptr [ebp-29], 1
00426487  |.  C>mov     dword ptr [ebp-30], 2
0042648E >|>  8>/mov     eax, dword ptr [ebp-30]
00426491  |.  0>|movsx   edx, byte ptr [ebp+eax-7C]
00426496  |.  8>|mov     ecx, dword ptr [ebp-30]
00426499  |.  0>|movsx   eax, byte ptr [ebp+ecx-65]
0042649E  |.  0>|add     edx, eax
004264A0  |.  8>|mov     ecx, dword ptr [ebp-30]
004264A3  |.  0>|movsx   eax, byte ptr [ebp+ecx-64]
004264A8  |.  3>|xor     edx, eax
004264AA  |.  8>|mov     ecx, dword ptr [ebp-30]
004264AD  |.  0>|movsx   eax, byte ptr [ebp+ecx-7C]
004264B2  |.  3>|xor     edx, eax
004264B4  |.  5>|push    edx                                        ; /Arg1
004264B5  |.  E>|call    <sub_40E1E4>                               ; \001.0040E1E4
004264BA  |.  5>|pop     ecx
004264BB  |.  B>|mov     ecx, 1A
004264C0  |.  9>|cdq
004264C1  |.  F>|idiv    ecx
004264C3  |.  8>|add     edx, 41
004264C6  |.  8>|mov     eax, dword ptr [ebp-30]
004264C9  |.  0>|movsx   ecx, byte ptr [ebp+eax-5B]
004264CE  |.  3>|cmp     edx, ecx
004264D0  |.  7>|je      short <loc_4264D8>
004264D2  |.  C>|mov     byte ptr [ebp-29], 0
004264D6  |.  E>|jmp     short <loc_4264E1>
004264D8 >|>  F>|inc     dword ptr [ebp-30]
004264DB  |.  8>|cmp     dword ptr [ebp-30], 0A
004264DF  |.^ 7>\jl      short <loc_42648E>

6.  循环块(二)
004264FE >|> /8>/mov     edx, dword ptr [ebp-34]
00426501  |. |0>|movsx   eax, byte ptr [ebp+edx-7B]
00426506  |. |B>|mov     ecx, 6
0042650B  |. |9>|cdq
0042650C  |. |F>|idiv    ecx
0042650E  |. |8>|mov     ecx, edx
00426510  |. |8>|mov     eax, dword ptr [ebp-34]
00426513  |. |0>|movsx   edx, byte ptr [ebp+eax-7A]
00426518  |. |D>|shl     edx, cl
0042651A  |. |8>|mov     eax, dword ptr [ebp-34]
0042651D  |. |0>|movsx   ecx, byte ptr [ebp+eax-79]
00426522  |. |0>|or      edx, ecx
00426524  |. |5>|push    edx                                        ; /Arg1
00426525  |. |E>|call    <sub_40E1E4>                               ; \001.0040E1E4
0042652A  |. |5>|pop     ecx
0042652B  |. |B>|mov     ecx, 1A
00426530  |. |9>|cdq
00426531  |. |F>|idiv    ecx
00426533  |. |8>|add     dl, 61
00426536  |. |8>|mov     eax, dword ptr [ebp-34]
00426539  |. |8>|mov     byte ptr [ebp+eax-A8], dl
00426540  |. |F>|inc     dword ptr [ebp-34]
00426543  |. |8>|cmp     dword ptr [ebp-34], 28
00426547  |.^\7>\jl      short <loc_4264FE>

   循环块(三)
00426564 >|> /8>/mov     edx, dword ptr [ebp-38]
00426567  |. |0>|movsx   eax, byte ptr [ebp+edx-A8]
0042656F  |. |C>|shl     eax, 4
00426572  |. |8>|mov     edx, dword ptr [ebp-38]
00426575  |. |0>|movsx   ecx, byte ptr [ebp+edx-A7]
0042657D  |. |D>|sar     ecx, 1
0042657F  |. |3>|xor     eax, ecx
00426581  |. |5>|push    eax                                        ; /Arg1
00426582  |. |E>|call    <sub_40E1E4>                               ; \001.0040E1E4
00426587  |. |5>|pop     ecx
00426588  |. |B>|mov     ecx, 1A
0042658D  |. |9>|cdq
0042658E  |. |F>|idiv    ecx
00426590  |. |8>|add     edx, 41
00426593  |. |8>|mov     eax, dword ptr [ebp-38]
00426596  |. |0>|movsx   eax, byte ptr [ebp+eax-64]
0042659B  |. |3>|cmp     edx, eax
0042659D  |. |7>|je      short <loc_4265A5>
0042659F  |. |C>|mov     byte ptr [ebp-29], 0
004265A3  |. |E>|jmp     short <loc_4265AE>
004265A5 >|> |F>|inc     dword ptr [ebp-38]
004265A8  |. |8>|cmp     dword ptr [ebp-38], 28
004265AC  |.^\7>\jl      short <loc_426564>

   循环块(二)和循环块(三)里,根据2-17位注册码计算出25-40位的注册码。
循环结构的理解,是初学算法分析的难点。参见《加密和解密II》P37。
这方面科班生应该没有问题。
在循环结构的直观理解上,个人认为OD比IDA有优势。

由于这是提高篇,我没有逐句地给出注释,也算给软件作者面子了。

7.局部的注册标志,关键变量:
004264E1  |> \807D>cmp     byte ptr [ebp-29], 0          ;  注册标志
004264E5      0F84>je      004265AE

找到的命令
地址       反汇编                                    注释
0042632C   mov     byte ptr [ebp-29], 0
004264D2   mov     byte ptr [ebp-29], 0              (初始 CPU 选择)
0042659F   mov     byte ptr [ebp-29], 0
004265B7   mov     byte ptr [ebp-29], 0
0046758E   mov     byte ptr [ebp-29], 0

00426483  |.  C645>mov     byte ptr [ebp-29], 1          ;  12F96B=1  注册标志

找到的命令
地址       反汇编                                    注释
00426483   mov     byte ptr [ebp-29], 1              (初始 CPU 选择)
004675A2   mov     byte ptr [ebp-29], 1

8.全局注册标志:
00427F9D  |.  8882>mov     byte ptr [edx+3E4], al        ; 为注册标志

00427FBA  |.  80B9>cmp     byte ptr [ecx+3E4], 0         ;  为注册标志 1是注册成功
00427FC1  |.  0F84>je      004281E6                      ;  判断注册码的第一个条件 跳则出错

00428067  |.  80B9>cmp     byte ptr [ecx+3E4], 0         ;  注册标志
0042806E  |.  0F84>je      0042817A

               第二十一章   关键CALL伪代码

附关键CALL伪代码(类似C语言):
*************************************************
char *__cdecl sub_4262FC()
{
  char ST10_1_0; // ST10_1@0
  char *v1; // eax@1
  const char *v3; // eax@10
  int v4; // edx@12
  int v5; // edx@19
  char *v6; // ST0C_4@24
  char v7; // [sp+7Fh] [bp-29h]@1
  __int16 v8; // [sp+90h] [bp-18h]@1
  signed int v9; // [sp+9Ch] [bp-Ch]@1
  char v10; // [sp+2Ch] [bp-7Ch]@2
  _BYTE v11[20]; // [sp+2Fh] [bp-79h]@2
  char dest; // [sp+44h] [bp-64h]@10
  char v13; // [sp+45h] [bp-63h]@10
  signed int v14; // [sp+78h] [bp-30h]@11
  char v15; // [sp+43h] [bp-65h]@12
  char v16; // [sp+4Dh] [bp-5Bh]@12
  signed int v17; // [sp+74h] [bp-34h]@16
  char v18; // [sp+2Eh] [bp-7Ah]@17
  char v19; // [sp+2Dh] [bp-7Bh]@17
  char v20; // [sp+0h] [bp-A8h]@17
  char v21; // [sp+28h] [bp-80h]@18
  char v22; // [sp+29h] [bp-7Fh]@18
  signed int v23; // [sp+70h] [bp-38h]@18
  _BYTE v24[39]; // [sp+1h] [bp-A7h]@19
  char v25; // [sp+4Eh] [bp-5Ah]@22

  __InitExceptBlockLDTC(ST10_1_0);
  System__AnsiString__AnsiString();
  v7 = 0;
  v8 = 20;
  unknown_libname_44();
  sub_5099AC();
  sub_509694();
  v9 = 2;
  sub_509664();
  v1 = (char *)System__AnsiString__Length();
  if ( v1 == (char *)44 )
  {
    memcpy(&v10, "1z1h+2a0n-0g8y*9a1n|", 0x14u);
    v11[17] = a1z1h2a0n0g8y9a[20];
    v8 = 8;
    if ( *(_BYTE *)(System__AnsiString__c_str() + 40) != 80 )
    {
      --v9;
      sub_509664();
      return 0;
    }
    if ( *(_BYTE *)(System__AnsiString__c_str() + 41) != 50 )
    {
      --v9;
      sub_509664();
      return 0;
    }
    if ( *(_BYTE *)(System__AnsiString__c_str() + 42) != 73 )
    {
      --v9;
      sub_509664();
      return 0;
    }
    if ( *(_BYTE *)(System__AnsiString__c_str() + 43) != 51 )
    {
      --v9;
      sub_509664();
      return 0;
    }
    v3 = (const char *)System__AnsiString__c_str();
    v1 = strcpy(&dest, v3);
    if ( v13 == 50 )
    {
      v13 = 35;
      v7 = 1;
      v14 = 2;
      while ( 1 )
      {
        v4 = sub_40E1E4(*(&v10 + v14) ^ *(&dest + v14) ^ (*(&v15 + v14) + *(&v10 + v14))) % 26 + 65;
        v1 = (char *)v14;
        if ( v4 != *(&v16 + v14) )
          break;
        ++v14;
        if ( v14 >= 10 )
          goto LABEL_15;
      }
      v7 = 0;
LABEL_15:
      if ( v7 )
      {
        v17 = 24;
        v8 = 8;
        do
        {
          *(&v20 + v17) = sub_40E1E4(v11[v17] | (*(&v18 + v17) << *(&v19 + v17) % 6)) % 26 + 97;
          ++v17;
        }
        while ( v17 < 40 );
        v21 = 90;
        v22 = 89;
        v23 = 24;
        v8 = 8;
        while ( 1 )
        {
          v5 = sub_40E1E4(((signed int)v24[v23] >> 1) ^ 16 * *(&v20 + v23)) % 26 + 65;
          v1 = (char *)*(&dest + v23);
          if ( v5 != (_DWORD)v1 )
            break;
          ++v23;
          if ( v23 >= 40 )
            goto LABEL_22;
        }
        v7 = 0;
      }
LABEL_22:
      if ( v25 != 89 )
        v7 = 0;
    }
  }
  LOBYTE(v1) = v7;
  v6 = v1;
  --v9;
  sub_509664();
  return v6;
}
***************************************************

                 第二十二章   注册补丁的制作方法

我尊重该软件作者的辛勤劳动,因此给出不完整的注册码:

NAME:NBA2005
NO:520NBA2005YH*QH*UK*12345C*AN*PD*MO*OAD*RP2I3

9.该软件制作破解补丁的方法:

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\XTZY\Pic2Ico]
"NO"="520NBA2005YH*QH*UK*12345C*AN*PD*MO*OAD*RP2I3"
"Name"="NBA2005"

              第二十三章    掩耳盗铃地善意提醒

在网上一搜,许多论坛对此软件都有破解版,但仅限于自己
论坛内传播。相信作者不会怪我的,因为看我这篇文章的人,要
破解这个软件是迟早的事。在此我掩耳盗铃地善意提醒:
看我文章者不要制造、转播此软件的破解补丁。

在看雪论坛上搜到一篇此软件1.9版的破文,更减轻了我的罪过。
不过说实话,这篇文章我看不明白,有误人子弟之嫌。这验证了我
在文章开头的观点:

{
坚持破文是学习破解的相当有效率的方法。了解是一回事,完全让别
人看明白则需要更深入的理解和透彻的钻研。
}

不过,作为刚有成功喜悦的同道,还是值得庆贺的。写注册机似乎
有些吃力不讨好,说明对注册机制的理解深度上功力欠火候。

{

Pic2Ico 1.9

【原创】菜鸟死追注册码(详细版,求精华,补上算法)
http://bbs.pediy.com/showthread.php?threadid=27300

}

            第二十四章   后记

认真看了一本书,书名叫《雷峰的故事》,感动之余,写下此文作为读书心得,
感谢看雪论坛及网上的雷峰们的辛勤汗水和劳动成果。据说,那位电教系主任
就是看到了这感人的一幕,心弦暗动......

老夫聊发教学文
A B C D君莫笑
抛砖引玉共进步
破解技术节节高

初学破解三道坎
爆破算法注册机
提高破解三种心
耐心恒心和虚心


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 7
支持
分享
最新回复 (63)
雪    币: 423
活跃值: (11)
能力值: ( LV9,RANK:230 )
在线值:
发帖
回帖
粉丝
2
图片上传不了啊,怎么回事啊?

晕,要一个一个的上传啊
2008-4-30 15:36
0
雪    币: 1844
活跃值: (35)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
估计楼主打字速度很快
2008-4-30 18:07
0
雪    币: 107
活跃值: (1693)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
4
我也会破解 前几天把学校一考试系统搞定  怎么还没泡到妞
2008-4-30 18:24
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
LZ的文章好是好,挺适合我等菜鸟的,但就是太委琐了,说的不好听叫又臭又长,看了一会头晕眼花,楼主能多分成几个贴子发嘛?
2008-4-30 23:35
0
雪    币: 47147
活跃值: (20465)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
6
图片是需要一张张的传。
2008-5-1 09:52
0
雪    币: 212
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
看完的话会吐血的
2008-5-1 18:06
0
雪    币: 423
活跃值: (11)
能力值: ( LV9,RANK:230 )
在线值:
发帖
回帖
粉丝
8
没有你附件管理器上说的按钮确定键,也没看到左右选择键:

{

将光标定位到文章中合适位置处,在编辑器中的单击按钮,选择刚上传的图片,如下图:

}

是没有权限?
2008-5-2 08:05
0
雪    币: 423
活跃值: (11)
能力值: ( LV9,RANK:230 )
在线值:
发帖
回帖
粉丝
9
其实很简单:
破解的基础知识也掌握得八九
不离十了。但拿到了具体的软件,为什么还是不知如何下手呢?最根本的原因是:初学
者的脑中没有系统的破解思路。我们要对软件进行算法分析,就必须解答算法分析的三个
基本问题:
1.注册判断的关键位置在哪?具体又分为两部分:
  A.注册成功与失败的关键位置。
  B.注册判断的关键CALL。
        判断方法:确定关键变量,按照就近原则顺藤摸瓜。

2.注册判断的关键变量是谁?
3.注册判断的程序流程。具体又分为两部分:
  A.注册正确的程序流程。
  B.注册正确的程序流程所要求的一些条件。

  我说过:程序流程的把握能力是算法分析的核心。怎样培养
程序流程的把握能力?个人的经验认为有三种方法可行:
one:  阅读程序段,手工画出流程图。初学者推荐此法。
two:  学会编程。                 老手建议用此法。
three:使用IDA。                 逆向大工程和密码学推荐。

   平时练习时,建议前两种方法。IDA可以做为答案帮助自己理解
程序流程。从上可以看出,科班生学破解在此处很轻松。

   破解到一定的水平和层次,要求多看多想少调试。即要求提高自己的
静态汇编破解能力。IDA的流程图功能在程序流程的把握上具有巨大的优势。
提高静态汇编理解能力有助于提高IDA的使用效率。

这里详细说明的原因,是因为对程序功能段的功能理解是破解
水平和效率的表现,是初学算法分析的难点,也是众多破文根本
不重视的地方。对程序功能段的功能的研判能力如何进行提高?

我个人的建议:
1.初学者注意记忆和积累一些经典的功能段。如上述的判断是否为
数字和写入注册信息的功能段,都是最常用和最基本的。在高手的
破文中,有许多这方面的精彩,可以借鉴记忆。《加密和解密II》
中有较全面而系统的基本和常用的汇编功能段的阐述,熟读并理解
记忆后,你再多做练习和总结,相信士别三日当刮目相看。

小写转大写的程序段:
00401126  |.  0FBE8C05 44FF>movsx   ecx, byte ptr [ebp+eax-BC]       ;  用户名
0040112E  |.  83F9 61       cmp     ecx, 61
00401131  |.  7C 07         jl      short 0040113A                   ;  不是大写就转换成大写
00401133  |.  90            nop
00401134  |.  90            nop
00401135  |.  90            nop
00401136  |.  90            nop
00401137  |.  83E9 20       sub     ecx, 20
0040113A  |>  8BF1          mov     esi, ecx

2.人门者最好学一门编程语言。自己编程一段单一的功能,自己反汇编研究,
不断的总结、记忆和积累。

推荐一位破解模范的痴情之作:
{

【原创】菜鸟看懂算法以后之一:头痛的64次左移   

--------------------------------------------------------------------------------
标 题: 【原创】菜鸟看懂算法以后之一:头痛的64次左移
作 者: jney2
时 间: 2005-04-22,13:07
链 接: http://bbs.pediy.com/showthread.php?t=13072

菜鸟看懂算法以后之一:头痛的64次左移

}

以上是核心。

下面三条辅线交替:
1.破解的一些实用小技巧汇总,穿插于破解过程中。
2.IDA的常用基本功能介绍。运用和OD的对比法进行介绍。
3.介绍相关知识点更高要求的好文章和OD的更高要求(快捷键和插件编写)。
A.脱壳。
B.IDA的使用
......

强调:
本文不是破文,只是对破解的算法分析进行系统的理论阐述。
文中的例子是说明、理解这个系统的理论的。
为了说明问题,而不想麻烦读者用OD,引用的代码多了。
扣除引用的代码,没多少内容。

接受你的建议,将“3.介绍相关知识点更高要求的好文章和OD的更高要求(快捷键和插件编写)。”的内容单列如下:

  我也是只知道点常识性的IDA知识。满瓶的不说,我这半调子就献丑了。希望仙剑奇侠们
对IDA的插件编写等关键功能多多指教,增加我的感性认识。

{
【翻译】编写IDA插件      

--------------------------------------------------------------------------------
标 题: 【翻译】编写IDA插件
作 者: 月中人
时 间: 2006-08-29,08:48
链 接: http://bbs.pediy.com/showthread.php?t=31185
}

{
两篇已翻译好的有关IDA插件开发的文章      

--------------------------------------------------------------------------------
标 题: 两篇已翻译好的有关IDA插件开发的文章
作 者: jhlqb
时 间: 2006-09-02,12:00
链 接: http://bbs.pediy.com/showthread.php?t=31384
}

有关IDA的手工脱壳,推荐一篇:

{

【翻译】用IDA的调试器来手工脱壳(PE格式文件)      

--------------------------------------------------------------------------------
标 题: 【翻译】用IDA的调试器来手工脱壳(PE格式文件)
作 者: 4nil
时 间: 2005-01-14,09:35
链 接: http://bbs.pediy.com/showthread.php?t=9811

【转帖】[翻译]IDA Plugin 编写基础
http://bbs.pediy.com/showthread.php?t=42209
}

介绍一篇IDA的ABC文章:
{

IDA简易教程:
http://www.pediy.com/practise/IDA.htm

}

OD的脚本编写:
{

标 题: 调试好帮手ODbgScript 入门系列(一)-认识ODbgScript【原创】
作 者: hnhuqiong
时 间: 2006-05-21,21:16
链 接: http://bbs.pediy.com/showthread.php?t=26029

}   

附Ollydbg常用快捷键:
Alt+E → Modules窗口,查找输入函数
Ctrl+N → 查找名称标志,选择你要下断的内容
Shift+F9 → 强制继续执行跟踪或称拦截信息步进跟踪
F12 → 暂时停止
F10 → 打开反汇编选项菜单
F9 → 运行键
F8 → 单步跟踪结束
F7 → 单步跟踪
F3 → 打开快捷键
F2 → 下断点快捷键
Ctrl+F9 → 返回到跟踪
Ctrl+F8 → 自动步进扫描,按F12可停止
Ctrl+F7 → 同上,功能略有不同
Ctrl+F6 → 回到OL主窗口
Ctrl+F2 → 重新开始
Art+F2 → 结束跟踪
Enter → 进制转换计算
Art+L → 打开日志窗口
Art+C → 快速回到程序入口
Ctrl+S → 打开查找命令次序窗口
Shift+F2 → 打开附加选项窗口
Shift+F4 → 打开条件对话窗
Ctrl+E → 编辑机器码
Ctrl+G → 输入跟随地址
Space → 填充或修改汇编内容(NOP修改)
-----------------------------------------------------------------------------------

OD的支持的命令

表达式

CALC 表达式 -------------计算表达式的值
? 表达式  --------------同上
表达式 ---------------(第一个字符不能是字母) 同上
WATCH表达式------------- 添加监视
W 表达式 ---------------同上

反汇编器

AT 表达式------------- 在反汇编中跟随
FOLLOW--------------- 表达式 同上
ORIG ----------------前往实际的 EIP
* ------------------同上

转存和堆栈

D 表达式----------- ---在转存中跟随
DUMP 表达式 -------------同上
DA [表达式]------- ------转存为汇编格式
DB [表达式] -------------转存为十六进制(hex)字节格式
DC [表达式] -------------作为ASCII 文本转存
DD [表达式] -------------作为地址(堆栈格式)转存
DU [表达式] -------------作为 UNICODE 文本转存
DW [表达式]------------- 转存为十六进制(hex)字格式
STK 表达式-------------- 在堆栈中跟随

汇编

A 表达式 [,命令]----------- 在地址处汇编

标号和注释

L 表达式, 标号 ------------为地址指派符号标号
C 表达式, 注释 ------------在地址处作注释

断点命令

BP 表达式 [,条件] -----------在地址处设置 INT3 断点
BPX 标号 ----------------在当前模块内部的每个调用外部'标号'处设置断点
BC 表达式 ---------------删除地址处的断点
MR 表达式1 [,表达式2] ---------设置访问范围的内存断点
MW 表达式1 [,表达式2] ---------设置写入范围的内存断点
MD -------------------移除内存断点
HR 表达式 ---------------在访问地址处设置一个字节的硬件断点
HW 表达式 ---------------在写入地址处设置一个字节的的硬件断点
HE 表达式 ---------------在执行地址处设置硬件断点
HD [表达式] --------------移除地址处的硬件断点

跟踪命令

STOP -----------------暂停执行
PAUSE -----------------同上
RUN ------------------运行程序
G [表达式] ---------------运行到地址处
GE [表达式] --------------跳过意外的句柄并运行到地址处
S -------------------单步进入
SI------------------- 同上
SO -------------------单步跳过
T [表达式] ---------------跟踪进入到地址处
TI [表达式] ---------------同上
TO [表达式] ---------------跟踪跳过到地址处
TC 条件 -----------------跟踪进入到条件处
TOC 条件 -----------------跟踪跳过到条件处
TR --------------------执行到返回
TU --------------------执行到用户代码

OllyDbg 窗口

LOG -------------------查看日志窗口
MOD -------------------查看可执行模块
MEM -------------------查看内存窗口
CPU -------------------查看 CPU 窗口
CS --------------------查看调用堆栈
BRK --------------------查看断点窗口
OPT --------------------编辑选项

杂项命令

EXIT -------------------关闭 OllyDbg
QUIT -------------------同上
OPEN [文件名] --------------打开待调试的可执行文件
CLOSE ------------------关闭调试的程序
RST -------------------重新载入当前程序
HELP -------------------显示本帮助
HELP OllyDbg ---------------显示 OllyDbg 帮助
HELP API函数帮助完整文件名 --------显示 API

WinDbg ABC知识  引用如下(以前的破解笔记上的,和现在网址可能有出入):
{

WinDbg配置和使用基础
    WinDbg是微软发布的一款相当优秀的源码级(source-level)调试工具,可以用于Kernel模式调试和用户模式调试,还可以调试Dump文件。

1. WinDbg介绍:
    Debugging Tools and Symbols: Getting Started
http://www.microsoft.com/whdc/devtools/debugging/debugstart.mspx                 
    A word for WinDbg
http://mtaulty.com/communityserver/blogs/mike_taultys_blog/archive/2004/08/03/4656.aspx

2. WinDbg下载:
  Install Debugging Tools for Windows 32-bit Version
http://www.microsoft.com/whdc/devtools/debugging/installx86.mspx
  Install Debugging Tools for Windows 64-bit Versions
http://www.microsoft.com/whdc/devtools/debugging/install64bit.mspx

3. 配置WinDbg:
     运行WinDbg->菜单->File->Symbol File Path->按照下面的方法设置_NT_SYMBOL_PATH变量:
在弹出的框中输入“C:\MyCodesSymbols; SRV*C:\MyLocalSymbols*http://msdl.microsoft.com/download/symbols”(按照这样设置,WinDbg将先从本地文件夹C:\MyCodesSymbols中查找Symbol,如果找不到,则自动从MS的Symbol Server上下载Symbols)。另一种做法是从这个Symbol下载地址中http://www.microsoft.com/whdc/devtools/debugging/symbolpkg.mspx,下载相应操作系统所需要的完整的Symbol安装包,并进行安装,例如我将其安装在D:\WINDOWS\Symbols,在该框中输入“D:\WINDOWS\Symbols”。(这里要注意下载的Symbols的版本一定要正确,在我的Win2003+Sp1上,我曾经以为安装Win2003+Sp2的Symbols可能会牛×点,但结果证明我错了,用WinDbg打开可执行文件时,提示“PDB symbol for mscorwks.dll not loaded;Defaulted to export symbols for ntdll.dll”的错误,我有重新装上Win2003+Sp1的Symbols, 现在一切运行正常^_^)

4. 使用WinDbg:
     WinDbg提供了图形界面和命令行两种运行方式。这里介绍使用图形界面的WinDbg来调试应用程序:
     File->OpenExecutable->可以选择一个可执行文件进行调试;
     File->Attache to a Process->可以选择一个运行中的进程,并对其进行调试;

{
【原创】从Ollydbg说起-----WinDbg用户态调试教程{看雪学院2006金秋读书季}      

--------------------------------------------------------------------------------
标 题: 【原创】从Ollydbg说起-----WinDbg用户态调试教程{看雪学院2006金秋读书季}
作 者: 笨笨雄
时 间: 2006-11-05,11:23
链 接: http://bbs.pediy.com/showthread.php?t=34379
}
{
翻译:通往WinDbg的捷径(一)      

--------------------------------------------------------------------------------
标 题: 翻译:通往WinDbg的捷径(一)
作 者: arhat
时 间: 2006-04-13,21:11
链 接: http://bbs.pediy.com/showthread.php?t=24077

翻译:通往WinDbg的捷径(二)      

--------------------------------------------------------------------------------
标 题: 翻译:通往WinDbg的捷径(二)
作 者: arhat
时 间: 2006-04-14,22:54
链 接: http://bbs.pediy.com/showthread.php?t=24119

}
{
Windbg基本调试技术      

--------------------------------------------------------------------------------
标 题: Windbg基本调试技术
作 者: 月中人
时 间: 2006-11-15,17:07
链 接: http://bbs.pediy.com/showthread.php?t=34958
}

5.Windows应用程序调试必备的--符号文件(Symbols):
http://www.oneedu.cn/xxyd/jzjs/aspnet/200703/15051.html

6.Windows调试器及不同平台符号包下载地址(收集) :
http://www.cnblogs.com/flying_bat/archive/2006/10/27/541665.html

7.WinDbg学习资料整理下载 :
http://www.cnblogs.com/end/archive/2007/04/12
/710951.html

8.WinDBG调试技巧:
http://www.shamuma.net/attachment/WinDBG调试技巧.ppt

9.WinDBG调试实例:
标 题: 【原创】WINDBG+IDA对某木马手脱nSPACK+LOADER部分分析
作 者: 笨笨雄
时 间: 2006-10-20,14:17
链 接: http://bbs.pediy.com/showthread.php?t=33577

}

{
【翻译】翻译的几篇IDA小教程      

--------------------------------------------------------------------------------
标 题: 【翻译】翻译的几篇IDA小教程
作 者: wangdell
时 间: 2007-09-28,00:11
链 接: http://bbs.pediy.com/showthread.php?t=52445
}
2008-5-2 08:20
0
雪    币: 423
活跃值: (11)
能力值: ( LV9,RANK:230 )
在线值:
发帖
回帖
粉丝
10
其实我说的都是常识性的东西。
结合具体的例子对需要掌握的知识点进行简要的介绍。类似于现场解说。

你有这种感觉,说明你的基础不扎实,要补课的太多。
2008-5-2 08:25
0
雪    币: 423
活跃值: (11)
能力值: ( LV9,RANK:230 )
在线值:
发帖
回帖
粉丝
11
几个朋友看了《虎胆龙威四》,对其中的情节的可行性发生了激烈的争议,进行了一天的对抗。
我做裁判,因此回帖迟了。
2008-5-2 08:30
0
雪    币: 423
活跃值: (11)
能力值: ( LV9,RANK:230 )
在线值:
发帖
回帖
粉丝
12
  恋爱宝典

  1、 与女子进餐时的注意事项:要主动请她吃饭,因为一般女孩子都不愿明说肚子饿了。先问她想吃什么,如果她不表示意见,你就自己决定菜单。别推来推去,那样你以为礼让对方,其实会令对方尴尬。点菜时要注意别要沾牙的食品,因为那会破坏气氛。进食时尽量不要发出声音,宜一面谈心一面进食。你尽可以放开胃口吃,女孩子通常都喜欢男孩子食欲旺盛。

  2、向她道别技巧:最好在适当的车站跟她说再见,陪她等车,直到车来,待她上车及车开出后自己再离去。这样女方便不会觉得你缠得不紧。如果她愿意让你送她回家,那表示她对你已有点心心相印了。这时必须分别时机,就是说,第一次约会应该在女孩子还想和你相处时结束。这是使她期待下一次约会的绝招。

  3、结识她的技巧:一般女子都不讨厌陌生男子的搭讪,因为她们的潜意识里会认为这是因为自己有足够的魁力来吸引男性,但如果你的词句说得不恰当,神态又不自然,那她们就不会停下来和你交谈,因而在搭讪前你应想好交谈的内容,根据不同的人说不同的话。但是记住,不要从背后去跟陌生女子搭讪,视线相对时要脸露自然的微笑,不要由上往下打量对方的全身,态度要自然,不要让对方感到你是在有意跟她搭讪,不要急着去碰触对方身上的任何地方。

  4、接吻技巧 :(主人公练习接吻技巧,把杯子都给吸爆,刚好被MM看到)

  正确方法:

  (1)螺旋式接吻:将舌头伸入女孩子口中,不断旋转的接吻。也许有人早已想到此法,只是却很难掌握这技巧。运用这种方法时,不能太随意旋转接吻对方,必须要能与女孩子的舌头互相配台,否则她再也不会答应你的接吻。即使她末罹患舌头拒绝症,同样也会拒绝你的接吻,因此必须以体贴、温和的方式接吻,这便是秘诀所在。

  (2)深吻:这是将舌头深入对方口中,甚至到达喉咙深处的吻法。在进行此种接吻时,男女双方都必须张大嘴巴才行。但必须注意的是,下巴不能分开。

  (3)吸吮式接吻:这是运用强有力的吸吮力,用力吮吸对方嘴唇的接吻方法。如果女孩子的嘴唇黏膜非常脆弱,便会产生像血豆般的瘀血,因此必须保持温柔。在此奉劝所有的男士们,当你看到对方表情变得痛苦时,就须立即停止,这才能博得女孩子的好感。

  (4)真空式接吻:不停吸吮对方的接吻方式。这种吻法必须考虑到男女双方的唇型。虽然男方拚命吸吮,却始终无法使女孩子口中呈真空状态,主要是由於唇型的问题所致。由物理学的观点来看,女孩子小口,男性大口的组合方式,最利於进行此种接吻法。它的原理如同在小孔上覆上大盖子一般,很容易造成真空状态,而使接吻的气氛高涨。但是如果相反时,女孩子为大口,情形会怎样呢?其实只要想一下就很令人爱不了,这就如小小的蒲公英盖在一朵大的向日葵花上一样,根本不可能达到真空境界。所以使用这种方式之前,必须先了解彼此嘴唇大小再决定是否采用,如此才不至於在进行中遭到困难。

  错误方法:

  以下10种男性是公认的‘杀手‘,让人亲完一次,就绝对不想再来一次。赶快检查自己有没有以下毛病,别不小心成了别人眼中的KISS终结者!

  1、真空吸尘器:这种人在亲吻时吸气的方式,简直好像扫扫卫生的吸尘器,轰轰烈烈的,动静很大。这种人最好少见为妙,谁愿意和吸尘器交往呢?

  2、吸血鬼:这种人不知道是缺血还是有病?表示爱意时会狠咬对方嘴唇,直到把对方嘴部咬出血来。这种人需要的不是情人,而是一个可以用来撕咬的玩具。

  3、狮子大开口:当他张大嘴时,你不得不想:他的目标是你的嘴,还是你的鼻子、额头以及内脏?

  4、清道夫:这种人接吻的方式就像清道夫一样,不过他的工具不是扫把,而是你的舌头!他会彻头彻尾地帮你清除嘴里的菜渣,如果你喜欢对方在你口中仔细搜索,那他就是你理想的情人。

  5、流口水的邋遢鬼:满脸都是对方的口水,想起来就会觉得恶心,如果你的情人属于这种类型,记得穿件长袖的衣服,或干脆带条毛巾,以随时擦掉沾上的口水。

  6、扎入的大胡子:满脸胡子,看起来是很有男人味,可是一扑到他怀里,可够你受的。

  7、大暴牙:如果你想象得出亲吻铁窗是什么滋味,就不难想象和暴牙的人接吻会是什么感觉。

  8、木头人:这种人完全没有反应,乏味,你会觉得镜子都比他热情可爱得多。

  9、滑溜如鳗鱼:他的舌头扫动得很快,你根本不知道接着它会移到哪里?不过,你会想它最好留在自己的嘴里,好让你喘口气。

  10、马拉松式接吻:这种人一接吻起来,就要耗上好一阵子,不吻几个小时,就不会罢‘嘴‘。不过,就连罗密欧与朱丽叶式的热情拥吻,也要停下来吃饭睡觉啊,你说是不是?

  5、应付情敌的艺术:1.保持礼貌与气质:假如你和女友约会时,正逢情敌也去约她,你可以温文尔雅地说:“嗨,真是太巧了,咱们来个三人一日游如何?”这既表示了你对这次约会的绝不放弃,又不咄咄逼人地给情敌下逐客令,不管结局如何,女友会因为你让她在这场面下不至于太尴尬而留下好印象。

  2.勿在女友面前批评情敌:女友若在你面前夸情敌的优点,你千万不要反驳,更不能嗤之以鼻。要察颜观色,“听话听音”,她可能希望你也具备这些优点。你可以委婉地表示赞同和肯定,并暗示你会接受和学习,让女友感受到你有着谦谦君子的美德。

  6、不论你的一瞥有多隐蔽及迅速,女人都会知道男人的目光何时扫过她的胸部。

  7、追求女孩的最佳时机

  一:当女孩子单独与男孩子接触时,最容易动心。男孩子应抓住这一时机表示出积极主动;如果有第三者在场,她们通常会断然拒绝男孩子,以掩饰自己的真实感情。

  二:男孩子对视觉的刺激比较敏感,而女孩子则对听觉的刺激比较敏感。在电话中男孩子亲切温柔,富有乐感的话语能更快地打动女孩子。男孩子应充分调动自己语言的魅力。

  三:刚同男孩子约会完毕的女孩子,身心极不安定,还会长久停留在对约会情调的陶醉和期待中。男孩子可以在约会结束时多利用一下这段时间,进一步打动对方。

  四:当女孩子处于一个清洁、舒适的环境时,容易动情,这种环境没有令她感到厌恶和不安的干扰,易使她全身心放松,从而感情活跃起来。

  五:女孩子在听到连续恭维时,会容易动心。即使明知男孩子是在故意奉承,吹捧她,时间一长她也会被迷惑。她们在感情上更容易接受恭维、奉承、吹捧等一类古老而笨拙的“求偶信号",也许这是一种动物本能的反应。

  六:女孩子在不熟悉的陌生环境中,情绪容易失控。男孩子经常改变约会的时间、地点、方式,使她不断有新奇感,新的乐趣。

  七:苦苦追求女孩子的男孩子,突然放弃进攻,此时最易调动女孩子的好奇和欲望,反而会使她动心。

  八:其实男孩子真正的爱情才是打动女孩子最有效的武器。当女孩子确信对方是真心实意地爱她时,很容易对男孩子产生爱心。

  8、8个最不浪漫的经典

  1: 经过漫长的等待,终于下雨了!虽然不大,他还是拿了一把小伞等在她下班的路上。

  “你没带伞?我送你回家吧!”

  “不要紧的,雨不大,我自己走好了。伞又这么小,你自己打吧!”

  2:请客吃饭,当然她也在。酒足饭饱,他喊了一声:这顿我请了!主动跑到总台去付帐,回来的时候后面跟了个小姐。 因为他没带钱。

  3:第一次见面,走了好久了。 他说:“我饿了,你呢?” “有一点” “该吃饭了,你回家去吧” “今天我家没人,我在外面吃好了” “哦,我知道有一家面还不错,我们一起去吧?” 然后一起走了两站路多一点,来到一家大排挡。 “老板,来两碗三鲜面。素三鲜。我不要鸡蛋,你呢?也不要吧?老板,两碗都不要加鸡蛋”“我有事,先走了” “嗳,不是说一起吃饭的么?怎么就走呀?我送你……等等,老板,只要一碗就好了!

  4:她用渴望的目光看着他:“今天风好大,我有点冷~”

  “哦,幸好我早上加了件衣服,还好!”他一边说一边拉紧领口的围巾。

  5:终于等到她上夜班了。他打电话过去。

  “喂,是你呀?有什么事啊?”

  “嘿嘿,没啥事……”

  “哦,我还有点事。以后没事就别打电话来了。”

  嘟——嘟——……

  6:车上人很多,他本来在里面,不怎么挤。但是突然发现门口上来一位靓女!于是费尽心思向车门口挤。终于挤到她身边了,还没来得及仔细瞧,她终于忍不住了,吐了他一身,然后说了句对不起就下车了。

  7:天赐良机:下雨,她又没带伞。于是他自告奋勇骑车送她回家,她坐在后坐上位他打伞。多浪漫!没走几步,一起跌到水坑里。于是她打车先走了,他自己抗着车子回家。

  8:她到男朋友家去玩,很喜欢那只据说会说话的鹦鹉。好不容易逗了半天才开口,却喊的是另外一个女孩子的名字。

  9、电话聊天:我们来聊聊电话中常遇到的几个难题,尤其是当你与对方并不熟的情况,有时候还真不知道如何开口,往往你就是会面临一种尴尬的情况,那就是对方突然静了下来,或者就是不搭腔,通常这时候的你只好被逼着说拜拜啰!当放下电话后,你心中又觉得压力更大、更是无措了,因为你开始担心下次对方仍然会出现这种情况,让你完全接不下话,而这样的结果似乎会让彼此的关系因为话不投机而渐行渐远。

  这时候的你该如何? 你可以开始谈及对方的兴趣或嗜好,当每个人谈及自己有兴趣或擅长的事物时,往往就会开始滔滔不绝,口若悬河,这是人之常情。如此一来,便会让对方开始对你有认同感,在潜意识中认为你是同一挂的,虽然不至于会像一个手机门号的电视广告一样,就连打错电话都还能与对方说两个小时,但是当说到会让对方感到有兴趣的话题时,相对之下除了会让对方有优越感之外,甚至还会引发对方的成就感。因此,第一步是如何聊出她的兴趣,而第二步就是要发掘出她的优越感了。 举例而言,当你知道她喜欢国际标准舞,不彷就可以从这个话题来谈,也许你并不懂,但是由于你的好学与好问,更会激发对方的优越感与成就感,也因此你可以更了解她的想法啰!往往你会发现,原来在学生时期她就修过国际标准舞,甚是还参加过比赛,这时,她对于参赛的优越感将是你们最好的话题。

  此外,你也可以多利用反问句来引导对方开口,例如,你的心情不太好喔?你对于爱情似乎不抱希望?也许你会听到一个制式的声音,那是就’不是’,而你也不需要因为如此就被打败,此时的你应该打铁趁热,紧接着问她为什么?你会发现,适时的引导之下,有时候一个反问句就会让对方将心中的满腹的辛酸,或是将她心中的故事娓娓道来,而她的心反而会更容易接近。

  10、恋爱学院恋爱专业招生

  应广大青年朋友要求,本校与M国蛤蝠大学合作,新开恋爱学专业,现面向全国招生,具体事宜如下: 专业名称:恋爱学

  专业概述:本专业以恋爱相关理论学习为基础,以实用技能的教授为主,注重理论联系实际,学生需掌握外语、计算机、汽车驾驶、唱歌跳舞、拱猪八十分,攀岩蹦极,诗词歌赋,琴棋书画、煎焖炒炸等等各项技能,同时接受系统的恋爱思想教育。做到:性格温顺言语温柔,态度和蔼脾气没有,骂不还口打不还手,用情专一注意Cao守。

  专业课程:主干课程:爱情经济学(研究女生这一稀缺资源的选择与分配),爱情政治学(经济是基础,爱情是上层建筑),木蠢脱仔恋爱兵法(恋爱者,人之大事,荣辱之地,存亡之道,不可不察也……),女性心理学,女性生理学,投资学,货币金融学,消费者行为学,公共关系学,家有资产管理,爱情应用文写作(情书悔过书保证书报告请示等),赞扬技巧,甜言蜜语法,文学欣赏(主要为三毛琼瑶刘墉席娟张小娴等),音乐欣赏(包括古典、流行、摇滚及其他)

  外语类:英语,法语(高贵典雅,情人的语言),日语(欣赏动漫日剧及日本流行乐,掌握流行资讯),意大利语(欣赏歌剧),以上语种英语为必修,毕业前需达到专业八级程度,日语或法语为第二外语,需熟练掌握,其余语种必须熟记“我爱你”的说法以及“是”的说法,此外不作要求。

  计算机类:计算机应用初级,要求能够独立回答一些软硬件方面的常见问题,比如熟练使用扫雷程序,熟悉仙剑奇侠传、美少女梦工场、少女魔法师、心跳回忆、帝国时代等游戏,会上网聊天收发EMAIL。

  杂类:八十分,拱猪,大怪路子,争上游,麻将,跳棋,飞行棋,中国象棋,国际象棋,五子棋,斗兽棋等,并且具有迅速掌握新的棋牌玩法的能力,吉他演奏(其他乐器亦可,手风琴及唢呐除外),声乐(练习曲:依靠或月亮代表我的心),各种舞步,钢笔字,抽象绘画,厨艺,汽车驾驶(尤其需要能熟练驾驶卡丁车),溜冰,攀岩蹦极,游泳潜水,空手道(跆拳道或散打亦可,相扑除外)。

  其他选修课程:地缘政治学,德国古典哲学,岩土力学,遗传学,天体物理学等,以上课目供学有余力者选修,目的是提高谈吐层次。

  实践:本专业本着理论联系实际的原则,在学习过程中会不断安排优秀学员参加实习,毕业生可推荐恋爱,但不包结婚。

  学时:学时灵活,修满学分即可毕业,毕业者授予M国蛤蝠大学妈死脱学位(MASTER),可推荐继续攻读打狗脱(DOCTOR)。

  上课方式:以EMAIL函授为主,集中授课为辅,定期举办学习心得交流活动。

  11、疼爱女朋友的三十六计

  第一计:不论吃什么好吃的,都会让她先吃第一口

  第二计:永远站在她的左边牵着她的手,就算吃饭时也是坐在她的左边用左手握着她的左手

  第三计:她的身体不好,陪着她去锻炼身体,陪她去游泳

  第四计:不论有多忙,忙完了都会第一个打电话给她

  第五计:爬山的时候她累了,要背着她,大汗淋淋也不说累

  第六计:她对紫外线过敏,夏天的时候为她打伞

  第七计:她不会用刀子,在吃皮萨的时候先把皮萨切成一小块一小块的然后再拿给她吃

  第八计:吃她剩下的饭菜

  第九计:在一个雨夹雪的夜晚,把鱼肉中的刺细心挑出来喂她吃晚饭

  第十计:让她擦过鼻涕的面巾纸直接放到你的口袋里,看到果皮箱以后你再掏出来扔掉

  第十一计:看电影的时候,让她可以舒服的*在你的右肩膀,抱着你的右胳膊

  第十二计:她和好朋友出去玩,要会惦记,手机开到很晚,一直等到她回家的电话才睡觉

  第十三计:知道她的一切爱好,尽量去适应她的口味

  第十四计:去外地出差,会想她打电话给她,如果有时间都会带礼物给她

  第十五计:不论什么时候打她的手机,都要坦然告诉她你在哪里在做什么

  第十六计:你所有的密码都要让她知道,也从来不改

  第十七计:尽量抽时间陪她,即使是很短的时间也会来看她

  第十八计:晚上睡前打电话给她,会陪我聊到很晚

  第十九计:她送你的东西都要用心保存

  第二十计:为她拒绝别的女孩子的示好

  第二十一计:看到她的脸色不好,会陪她去做美容,一直等在美容院门口

  第二十二计:在她遇到麻烦的事情时会为她想办法,安慰她

  第二十三计:约会过后要回家时,要在公车上一直看着她,一直到看不到为止

  第二十四计:知道她总看电脑眼睛疼为她买眼药水

  第二十五计:给她剪指甲,在她胃疼的时候用手捂着她的胃心疼的不得了

  第二十六计:会为她穿袜子穿鞋,走在路上看到她的鞋带松了会弯下腰为她系好

  第二十七计:从不让她提重的东西

  第二十八计:去寺院上香时为会她祈福

  第二十九计:上网查找她喜欢的故事和笑话,然后硬记下来见面时讲给她听

  第三十计:会为了陪她而放弃自己的爱好,几乎不再玩游戏

  第三十一计:知道有人追她会不安,会吃醋生气

  第三十二计:真诚对待她的朋友,在她们有困难的时候尽力去帮忙

  第三十三计:保留你们的合影,并告诉周围所有的人你们是情侣

  第三十四计:看到她流泪会着急,看到她高兴会开心

  第三十五计:会为她流泪,担心和失眠

  第三十六计:真心爱她,并对她说你会娶她(真心D哦~)

  12、談好戀愛的21條軍規

  1﹒談好戀愛的秘訣在於:不必嚴肅,但必須正經!

  2﹒選擇好男人需要方法,在尚未找到訣竅前隻要學會說“不”!

  3﹒就算已經達到嘴對嘴的關繫,也要保持手牽手的距離!

  4﹒別將愛情搞得太像服務業,做牛做馬隻會累死自己!

  5﹒情書大全在圖書的分類,應該屬於科幻類!

  6﹒不要以為男人喜歡瘦女人,他們要的是整體苗條,局部豐滿!

  7﹒男人的習慣是,說“我要你”時生猛有勁;講“我愛你”時有氣無力!

  8﹒多少要學會一些糟蹋男人的方法,否則這麼多的無聊男子該如何打發!

  9﹒結婚前要做健康檢查,戀愛時要做智力測驗!

  10﹒失戀的明顯癥狀就是失態!

  11﹒愛情老手,通常不會輕易將戀愛談出結果!

  12﹒從眼睛流露出來的愛情比較不容易造假!

  13﹒要善待愛情,因為它不會一輩子跟著你!

  14﹒男人心虛的反應常有兩種:獻殷勤和耍無賴!

  15﹒撒嬌,有時候是一種較高層次的耍賴!

  16﹒婚姻是難度最高的愛情,因為必須邊啃面包邊談它!

  17﹒別堅信,如果你嫁(娶)了另一個人會比現在更幸福!

  18﹒世界上沒有不會做家事的男人,隻有不願做家事的丈夫!

  19﹒做個智能的女人,要懂得如何去愛一個男人和他的錢!

  20﹒所謂羅曼蒂克就是幫老婆買回包心菜時會順手帶一枝玫瑰花!

  21﹒不用懷疑,順著紅地毯的方向就能輕易地走到廚房!

  13、恋爱二十诫条。

  记得每天打电话问安。

  她说笑话时你一定要笑。

  告诉她我想很快再见到你。

  和她说话时,眼睛一定要看着她。

  打电话给她时,只说:「我没事,只是很想听到你的声音。」

  她生病的时候记得买些小礼物送她。

  写篇短诗给她。

  邀她在家里客厅跳一支舞。

  没有理由地送她一束鲜花。

  每天送一张卡片告诉她:「我想念你。」

  在周年纪念日时送她小礼物。

  和她讲话讲到一半时突然亲她一下。

  带她到海边散步时,仰头望着星星(如果你平常不是这麽风雅的话,请不要过份做作,以免做成反效果。)

  告诉她有关你的小秘密。

  提醒她你认为她还是世界上前所未见的美女(当然如果客观来说,她实在不怎麽美,请想些别的赞美词。)

  不要停止给她一些惊喜。

  陪她看一些女性化的文艺片,千万不要批评她太多愁善感。

  晚上和她聊天时点支腊烛。

  每天说句「我爱你」。

  14、利用电话谈恋爱的方法

  一、气氛电话――女孩子在晚上时分,精神比较轻松,容易动情。因此,此时的效果比白天好,最好一边播放她喜欢听的音乐,一边谈有趣的事。

  二、旅行电话――你在外出旅行时,一定要打电话给她,表示“真希望能和你一起去旅行”,或“我会带礼物给你的,你想要什么?”等。

  三、慰问电话――对方生病时,要最早打电话给她,以开朗的语气安慰她,但不可让她太累,谈话时间不宜太长。

  四、倾诉电话――想念她的时候不妨直接告诉她,碰到自己高兴的或烦恼的事可与对方分享,对方会认为她是你第一个想到的。

  说出她最喜欢听的话

  一、生日快乐,希望你一天美似一天。

  二、你的声音真动听……

  三、我只是想听到你的声音,只有听到你的声音,我的心才能平静下来。

  四、我日日夜夜想着你,你是否也时时刻刻想着我?

  五、记否?多少个醉人的黄昏,我俩在温馨的月光下度过。

  六、天气越来越冷,你要小心,可别感冒了……

  七、你那甜甜的微笑,那深情的回眸,令我难以忘怀。

  八、思念好苦呦,何日是佳期。

  15、女人不喜欢的五十三种异性

  1。嘴巴光会说大话的男人2。和女人纠缠不清,像个橡皮糖的男人。3。贪恋杯中物的男人。4。朋友尽是洒肉之徒的男人。5。不孝敬父母的男人6。养不活自己的男人。7。一年换十个工作的男人。 8。吃、喝、嫖、赌样样都来的男人9。离不开妈妈、没有独立感的男人 10。挥金如土的男人11。长发披肩、雌雄不分的男人12。对马杀鸡(香港妓女)很内行的男人13。油头粉面、一派邪门的男人14。热衷于“蓬恰恰”的男人15。吃不了苦的男人16。说话尖刻像个啄木鸟的男人17。游手好闲、吊儿郎当的男人18。一身酸腐、像个老学究的男人19.唯“钱”是视,毫无情感的男人20。无人侍候就不肯吃饭、穿衣的男人21。每天打扮的花枝招展像只蝴蝶的男人22。沉迷于麻将桌上的男人。23。强烈的唯物主义的男人24。不择手段追求美女的男人25。一言不和就要动武的男人26。待人处世没有赤子之心的男人27。只在乎你的家世和聘金的男人28。骄矜自满、目空一切的男人29。窝窝囊囊、卑躬屈膝的男人30。对任何事情都抱理想主义、不重实际的男人31。一脚踏几条船的男人32。言行不符的男人33。每天早上要花一个钟头擦油吹头发的男人34。一回到家里就打赤膊的男人35。水电费多了几块钱便不停嘀咕的男人36。在拥挤不堪的公共汽车上还要抽烟的男人37。开不起玩笑的男人38。动不动就脸红脖子粗的男人39。借酒装疯的男人40。用复写纸写情书的男人41。看到漂亮的女人便两眼发直、馋涎欲滴的男人42。当着女孩子面说“荤笑话”的男人43。占了便宜还卖乖的男人44。疑神疑鬼醋劲奇大的男人45。好逸恶劳的男人46。爱打肿脸充胖子的男人47。耳朵软经不起诱惑的男人 48。自认是天才的男人49。交过数不清异性朋友的男人50。喜欢占小便宜的男人51。对朋友不忠诚的男人52。只爱听赞美话的男人53。生活萎靡不振的男人

  16、追求基本法

  第一课绝对信心

  自信心是做每一样事情的基本条件,追女仔也不例外,想成功地追女仔的话,便需要有绝对的自信心,你一定要本着:「一定要成功,再不可一个人」的信念。

  而你应采取「自力更生」的方法,凭自己的力量去 Pick up girl 才是,尽避免靠朋友、家人。朋友及家人不但不一等可帮助自己,太多人知道你的对象更可能弄巧反拙,而且女孩子也不会喜欢靠朋友来追女仔的人。

  但要完成志愿,首要的是自信,就算你不是「白马王子」,但也可以将自己打扮成王子一样,重要的是那份充满自信的气质和风度,令对方难以抗拒,总之那便是:自信、自信、自信。

  第二课迷惑女性的男人

  一般女性都不喜欢过份老实型的男性,太没情趣了!实际上,她们最欢迎的男性所具备的条件,是人绿好,开朗活泼,无法拒绝他人,没法守秘密,没有异性,容易妥协,有点过份自信又有些懒的轻率型。

  大情人模范

  温柔快乐有男子气概善於关怀他人聪明可靠滑稽运动家强壮的体格诚实健康正直光明有责任感可爱有包容力坚强有经济能力外型好

  而事实上,只要你拥有以上任何一点,可以说你已经拥有吸引女性的条件,只是拥有以上各点越多,在追求过程中便越觉有利,越小就较难冲出重围。

  但虽然如此,即使你拥有以上多项条件,也不能保证你必能取悦任何女性,因为,在你具有任何优点的同时,你也不能同时具有一些对方完全不能接受或容忍的缺点,如:

  差劲的男人

  自我中心意识强烈胆小懒惰罗嗦俗气缠人不乾净软弱爱说谎神经质势利过份认真迟钝粗暴没有判断力猥琐小家迂腐

  一般来说,吸引女性要运用眼神、声线和身体语言。初见面时,你可将视线自然地看着她耳朵一带,当二人四目交头时,再将目光转向耳朵,她便会对你自然产生深刻印象,而到有机会谈话时,你的声音要微微比她高一点,开朗而响亮的会吸引她和你继续谈话,聆听她的说话时,视线转移到她的嘴唇,使她觉得你很专心听她的说话;至於手可放在桌上,四指并排,令人感到你的整齐和有美感,自然对你产生好感。

  第三课邂逅

  你要经常警醒自己,眼缘两个字在爱情道路上几乎是最不能够解释的概念,它足以令两个人产生爱情,火速恋爱甚至步入教堂。

  故此,当你在任何地方和场合:巴士、地铁、街上、餐厅、宴会、工作地方等,遇见你期待已久,甚合眼缘的女性时,不要犹疑,机会可能一去不返。

  把握当前机会,把握当前佳人,你唯一的做法自然是上前攀谈,令她认识你,对你产生印象、好感、爱情、思念等等。总之,你要开始第一步。

  但毫无疑问,这是需要极大的勇气,而且须谨慎行事,况且,如说错一句话,以後的便可以省回暖肚,所以,在日常生活中,就必须经常学习,到有用的时候便可应付自如。

  以下,尝试举出一些开场白,给你参考:

  1.用被吸引或情不自禁的目光向她注视且不时回望。 (这个招数,即使对方一点也不被你吸引,也会以为自己魅力难当而沾沾自喜,也就不禁向你回望。)

  2.一个笑容。 (她们会相信,自己的样子一定讨人喜欢,令别人产生好感,然後也可能报以回嫣一笑。)

  3.用最自然的方法向她问时间,但你手上绝不能没有表,但可以先行调慢或调快。(她根本找不出理由拒绝回答你。)

  4.「Hello!」一笑 (若做得恰当,你潇的态度必然吸引她,但最重要的还是,她会深信你已被她吸引了。)

  以上各项,目的是在认识陌生女孩时,用以减低她们警觉性的较理想途径。由於彼此全不认识,假如以过於油腔滑调的说话和态度,可能会令对方产生反感,从而弄巧成拙。

  其实,任何女性都相信缘份、服从缘份,她们会相信每一个出现她眼前的男性都可能是她未来的丈夫,因此,只要你采用的方式用得恰当,她随时是准备放开怀抱,把你接受的。

  真诚,永远是俘虏女性芳心的最强武器,要夺得芳心,一定要她相信,你绝对是被她所吸引,甚至只有她能把你吸引;那麽,她便会逐渐解除心理警戒,向你展开笑容。

  不过,假如对方是经友人介绍,又或者你知道和对方之间有点关系[如学校、工作],那麽,事情便好易得多了。

  5.「他[某人],说你是XX书院的校花,那你每天一定忙於应付不同的男孩子追求了」。 (即使她本来不是甚麽真正校花,经你一说,她必定以为自己的美貌早已令很多人倾倒,但最重要的还是,她必定加以否认和解释。)

  6.「你的工作看来很有趣,究竟日常职务是甚麽?」。 (她这时绝对是不好意思拒绝回答,但逐渐便会被你认真而坦诚的眼神所吸引,用心去回答的了。)

  7.「你平时花在衣服上的心思和时间一定不少,你是否从小就培养这方面的心得。」 (这无疑是一句含蓄的赞美,既恭维又不着迹。)

  8.「街去你约想好的真我!」(她必定马上皱起眉头,不耐烦的问你,「你究竟说甚麽?」,你不妨把它倒转读出来,她必定会不禁失笑,喜上眉梢了。)

  当然,这样的开场白,再精警、再花巧也没用处。因为若论才智,女性绝不会比男性逊色,只是她们容易被甜言蜜语所蒙闭,不能保持高警觉性而已。

  可是,过份花巧的说话却只会令她们提高警戒,防范你而起围墙。因此,最简单、最直接的开场白,往往亦是最有效的开场白,因为她们根本不会想到到有人完全不经思考便向她示爱或其他,於是,唯一的结论就是:「对方必然是初哥,亦真是充满诚意的,这人也不错呢!」

  於是,顺理成章,她便会大开中门,欢迎你的加入,进入她的生命之中!

  第四课制造机会

  要追求一个女孩子无论如何也要有开场白,不论你用何种形象、产生何种效果,最重要的始终是她有反应。只要她一旦对你有所反应,一切就易办得多了。

  基本上,她都不认为你开始了话题之後便掉头就走,不再继续,这样她必定会大为愤怒,感到你在捉弄她,而且也未免过於轻挑。因此,你必须当机立断,为自己制造一个约会机会,即使她一口拒绝你,但至少也为你的礼貌和勇气留下良好印象。

  那麽,应该如何制造机会呢?由於处境、场地、人物和气氛的不同,故此也难一概而论,不过,总有些一原则可循:

  ※顺势在最短时间内提出约会。

  (这样,她来不及拒绝,只有默许。)

  ※选一些较为大众化的地点。

  (她才会有安全感,便会不妨一试。)

  ※带她去她熟悉的地方。

  (她便不会茫然不知所措,而且感到自然。)

  ※与她商议,然後由你作出决定稍後的节目。

  (女性既喜欢别人尊重,又喜欢别人专制。)

  ※为她安排妥当,如回家的方式及时间。

  (她会认为你是一个为人设想,成熟世故及体贴温柔的人。)

  如此这般的安排,她大都会欣然答应你的约会,同时亦乐於与一个像你一样的人共渡浪漫意外的一夜。不过,女性绝对是受感性所操纵的动物,就算你以为已充份掌握她的精神状态之时,其实她亦可能同时受到另一种外界冲击,故此,与她们相处必须随时小心奕奕,不要大意。

  第五课初次约会

  邂逅和攀谈可以说是最重要的一步,因为是一切的开端,不过,并不可以保证日後必定会有第二步、第叁步。因此,第一步之後,你仍然要花许多心思,绝对不能松懈。

  当然,你也要分清楚自己有没有和他继续交往的必要和冲动,如果只是勉勉强强,那就不要勉强了,免得日後为大家带来过度的麻烦和痛苦。

  当你们只是有初步的认识,而又发觉她是值得继续约会的话,那麽,你绝对有必要花点心思作点心思作一个周详的计划,考虑对方的感受和反应,以最真诚的态度对待,否则,不单是伤害别人,也侮辱你个人的品格,实在无谓。

  因此,第一次约会绝不能不小心行事,否则就必然无望,况且,要是你不能对那约会全情投入,那样追求也见不得是一个快乐和开心的事,所以,无论如何也得告诉自己,必须认真对待你的约会对象。

  既然她答应你的约会,她必定会作一番打扮,也会有一番期望,故此,你绝不能令她失望,尽可能要照顾她的心理需要。譬如以整齐美观的衣着告诉她你对她的重视,以愉快的心情和她见面,足够的准备和她共渡一个晚上,及安排节目的结束和送她回家。

  经过一个良好的印象建立,她将毫无疑问地答应你第二次提出的约会。同时,她假如真的欣赏你整晚安排的话,自然也希望你能继续约会她,这时,你可私下盘算,究竟她是否值得你继续约会,若绝对值得的话,请不要犹豫,在第一次约会还未结束前,就得开口,否则你可能错失了所有机会。

  因为,你表现着紧会令她更为开心。

  首次约会实用手册

  你要根据对方的具体情况决定下一步的活动方式。 不同场合下运用不同的方式

  ①公园:游公园是青年伴侣谈恋爱最常见的方式之一。但你们不应呆呆地坐在公园的椅子上,而应该游逛或坐在秋千上,让身体活动,这样双方都可以消除紧张。

  ②散步:走马路洒月光也是一个好办法,但你重要是要让她走靠人行道的那边,并尽可能地与她步调一致。两人最初的间距以二十公分为宜。

  ③跳舞:我们在上面曾读过初次约会就去跳舞的弊病,但若对方热衷此道,你也得顺其心意,且在激烈的跳动中能消除彼此的隔阂。

  ④运动:可以在喊叫中增加热情,但你不能技不如她。

  ⑤电影:须知道剧情适合于初恋情侣,别对悲伤,否则他会认为是不良的预兆。也别纯是逗笑的闹刷,否则她会认为你的品味不高。而且在看电影时不能交谈,是其缺点。

  ⑥餐厅:要注意找一个角落的位置,这样可避开众人的目光,减少初恋女友的心理紧张,而且,你还要请她坐在背向门口的位置,如此她的视线便会以你为中心,同时你自己则可看到整个餐厅的情形,能够在平静的气氛中引导谈话内容。但如非特别有趣或必要,切忌在餐厅的人群中找话题。

  ⑦博物馆:如果你的女友文雅沉静,你可以考虑和她一起去逛逛博物馆,可能会意外地产生良好气氛。但你不可对博物馆里陈列的内容一无所知或知之甚少,由女友来说给你听,那对你就很不利了。

  ⑧比赛或表演:让女孩子看体育比赛或杂技表演,让她认识一下她并不十分熟悉的世界,同时你可以边看边发表自己的高见,这样可以加深她对你的印象。

  ⑨游乐场:容易使人处于兴奋状态,可制造一种坦率而开放的气氛,身体也会自然地靠近,但你不可有‘乘机搏乱‘的念头,否则女方一有戒心,你便自己把好事弄砸。

  ⑩餐厅的选择:女孩子会喜欢格调高雅而整洁的小餐厅、有异国情调的西餐厅,或者,也可以到高楼大厦的顶楼餐厅去,可一边进餐一边饱览都市夜色。

  第六课第二次约会

  何以要强调第二次约会呢?因为在初次见面是可能是初次接触,大家对对方完全毫不认识,也不认真,完全是依靠直觉和眼缘去判断对方是否可以继续栈往。

  而第一次约会就是表示我的确好想认识你,彼此不妨给对方一个机会,作一个开始,故此,严格来说,第一次单独约会是首次有意识地、有期望地约会对方,作一个初次深入接触。

  不过,第二次单独约会就更为重要,因为它是象徵彼此诚意的确定。第一次约会可以说是纯粹是一个试探,如彼此觉得不适合,绝对可以就此为止,不必再继续下去。当然,多见一次也不一定是山盟海誓、非卿不娶,但有一个更大的分别——更大的诚意。

  无论第一次约会如何,你都要承认,只要你再一次约会对方,则表示上一次约会令你难忘,而你亦希望可以再一次见到对方,与她共处,故此,你的态度就必须有更大的诚意。

  最少,你必须让她知道,你已作好心理准备,你和她将随时会演变成为一对,你已开始把她视作女朋友看待——一个你完全有意作进一步交往的人。

  第七课身体接触

  可能你和她已经单独约会了多次,亦可能视对方为男女朋友,两人一起有说有笑,但还觉大家之间有个空隙。其实,在大家相处了一段日子後,她都会允许作一些身体接触,但并不意味着你可以为所欲为,你还需要作小心处理,否则便前前功尽废,如果你放在她肩上的手过度用力和动作夸张,肯定会惹来反感和觉得你是过於放任。

  以下便是一些正确的方法,值得大家参考:

  ※手——当她是容许你拖着她的手时,你应该用一个把她的手完全包含的姿态来拖,令她有被保护的温暖感觉,切忌是只拖一只手指或只拖着她指尖的做法,因为言样子的话,会令她感到不被尊重和有一种「接触污秽」的感受,对你以後的进一步行动都会有所抗拒了。

  ※腕——这个手势其实是不值得提倡的,因为每个人被捉着腕部[或手臂]都会有种被命令和「押解」的感觉,就算是恋人也不例外,不过有时[例如急着过马路]也可用得着,值得留意的是捉的位置,只限手挣以下,力度也要柔和,否则,她便真的会有像罪犯被警察捕捉的感觉。

  ※肩——经过拖手阶段後,随着便是轻拥香肩了,话明「轻拥」,当然便是用手轻轻地拥着,把她的身体拉近,令她有种被保护的安全感,切忌是整只手臂的垂搭在她的肩上,否则你的手臂重量便令她感到负累和被轻视。

  ※背——用手轻抚其背部也是能令她有着被人宠爱的感觉,不过,当你进行此动作时,一定要把整只手掌轻按,而不是以两只手指来压着,或是四处游动,前者令她有被「笃背脊」的不安,後者更使她有被人玩弄和觉得你是轻薄的 。

  但要谨记一点,尽管身体语言是彼此沟通的一种途径,但也要有相当的言语沟通才行。

  两个人的相处绝对不能单靠身体接触来建立,亦即表示绝不应该把感情建基於性之上。反之,要是你能由精神交往开始,慢慢培养彼此的感情,增强双方的认识,认识清楚彼此之间的不协调之处,身体接触便完全可以有助感情增长,否则,两人随时意乱情迷,铸成大错。

  男生必须学会的40句话

  1、如果爱你是错,我宁愿永远不对……

  2、请你当我手心里的宝。

  3、不知道爱你算不算是一个贴心的理由?

  4、我只想要和你一起慢慢变老……

  5、身边没你,好惨,陪我一生一世好吗?

  6、和你在一起只是我不想给任何人机会 !!

  7、我想未来我一定会天天陪你上菜市场……

  8、自从你出现后,我才知道原来有人爱是那么的美好!

  9、迷惘过,孤独过,是你牵引我走出寂寞。

  10、我爱你的心直到世界末日也不变。

  11、想想和我一同看日升日落的喜悦吧!

  12、我愿意用一千万年等待你初春暖阳般的绽颜一笑。

  13、我的世界只有你懂……

  14、不知什么时候开始,我已离不开你。

  15、只有你知我的情绪,也只有你能带给我情绪

  16、如果一生都不够……

  17、因为知道不能没有你,所以我会更珍惜……

  18、地球仍然转着,世间依旧善变,而我永远爱你……

  19、在每一个有你相伴的夜,不再寂寥冷清

  20、我一个可以让你休息的港湾……

  21、每爱你多一些……

  22、人总是会老的,希望到时,你仍在我身边,

  23、不论天涯海角,只要你需要我,我会随时“飞”回你的身边。

  24、你使得我的生活有情有爱,还有泪……

  25、.我不会写情书,只有一颗爱你的“心”……

  26、如果你冷,我将你拥入怀中;如果你悲,我替你擦去泪痕……如果你爱我,我要向全世界广播;如果你离开我,我也会默默地承受……

  27、我的爱为你开启,像白色的闪电划破天际;我的爱为你奔驰,像红色的血液充满身体……

  28、不管今世也来世也好,我所要的只有你……

  29、虽然不能满足你最大的物质生活,但我可以用我的真心来满足你……

  30、我爱你用我的热情和孩童时代的忠诚……

  31、你的话已经锁在我的记忆里了,那钥匙你就替我保管一辈子吧 !

  32、没有一种服装比起你的爱更合身;没有一种装饰比你的爱更迷人!

  33、我想对你爱恋的极短诗篇升华为漫长的生活散文!

  34、对你,我已经无条件投降了,你就签下爱情合约吧!

  35、今生如果不能拥有你,我会……好恨自己!

  36、喝了你酿的爱情的酒,如果没有续杯,情愿渴一辈子!

  37、我发誓五十年后,我还是像现在一样爱你……

  38、我希望睡前最后看到的是你。

  39、如果没有你的爱……我的生活将失去方向!

  40、为你情愿不自由!
2008-5-2 08:51
0
雪    币: 111
活跃值: (211)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
太长了,没那么多耐心看下去
2008-5-3 01:00
0
雪    币: 254
活跃值: (126)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
14
搞马拉松啊?
2008-5-3 01:09
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
呵呵!搂主很强大啊! ,不但传授CRACK知识,还客串泡妞教授,
2008-5-3 01:12
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16

楼主能多分几贴出一个连载嘛?或者打包一份下载来看....这样看实在受不了...
2008-5-3 02:02
0
雪    币: 29249
活跃值: (7774)
能力值: ( LV15,RANK:3306 )
在线值:
发帖
回帖
粉丝
17
好长呀~~~
2008-5-3 03:39
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
太佩服楼主了
雷锋啊
2008-5-3 03:48
0
雪    币: 423
活跃值: (11)
能力值: ( LV9,RANK:230 )
在线值:
发帖
回帖
粉丝
19
真的长吗?

我不喜欢吊人胃口,何况五一后也不一定有时间写续篇,因此一气呵成。

自己感觉都是很简单的东西,一看就知道。取的例子也是很简单的,但要分析、掌握详细的注册细节不容易。我自己写的时候都觉得心虚,这么简单的东西拿不出手啊。最近在看softworm大侠的VM虚拟机系列,那才是看的头晕眼花的,看的进度很慢,也不容易理解。许多高手的破文比我的长得多,涉及的知识点也深而复杂。

这样吧,如果再有三位朋友认为太长,我会考虑分几个系列或进行一些处理的。

幸好我没有对函数和循环这些简单的东西自己写,不然我就是杀人凶手了。

老是有人冤枉我是偷心贼,现在又有人指证我对现在流行的吐血症负责。我招谁惹谁了我......

请教论坛上的朋友,如何将图片放在文章的任意位置?
2008-5-3 08:08
0
雪    币: 254
活跃值: (126)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
20
http://bbs.pediy.com/showpost.php?postid=292659
2008-5-3 13:35
0
雪    币: 423
活跃值: (11)
能力值: ( LV9,RANK:230 )
在线值:
发帖
回帖
粉丝
21
我早看到了。

没看到步骤3的图例,附件图形的单击按钮和左右方向图标都没有看到,是没有权限?
2008-5-3 14:09
0
雪    币: 254
活跃值: (126)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
22
进入高级模式
2008-5-3 16:38
0
雪    币: 423
活跃值: (11)
能力值: ( LV9,RANK:230 )
在线值:
发帖
回帖
粉丝
23
我一直在高级模式的,只有高级模式里有附件管理器。关键是附件管理器里没有步骤3的三个图标啊。

感觉还是没有权限可能性大。
2008-5-3 18:21
0
雪    币: 2256
活跃值: (941)
能力值: (RANK:2210 )
在线值:
发帖
回帖
粉丝
24
加精鼓励
呵呵
2008-5-4 14:58
0
雪    币: 472
活跃值: (20)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
25
好文,学习了。
2008-5-5 16:15
0
游客
登录 | 注册 方可回帖
返回
//