首页
社区
课程
招聘
[分享]学习软件破解 (1)
发表于: 2007-3-14 14:28 96937

[分享]学习软件破解 (1)

2007-3-14 14:28
96937

我是莱鸟  :)
但写的东西一定队莱鸟有帮助,因为这些是我看了ARTeam和Lena的教程后的心得。

1。懂一些基本的汇编和程序运行的知识
2。Let's do it

2.1 拿到一个程序用Olly载入后,很多newbie直接搜索字符串,现在这样的方法可能效果不明显了,因为可能strings是加密的。而且即使发现了string,其看考指令也可能在很远的地方,或者根本就找不到referenced command。
所以,lena说:run the program and study its behavor before starting to crack

2.2 lena: 要把一个routine看完,并注意retn和jmp(包括条件跳转)指令及push指令的搭配,他们很可能形成关键条件和关键跳转。

2.3  lena:获取消息框断点的简单方法: f12暂停程序,再alt+f9,再点错误信息按钮,程序就会段在消息框调用处。比如输入code,点ok/register后,如果不对,一般就会弹出消息让用户操作。此时f12暂停程序,再alt+f9,再点按钮,olly就会断下。

2.4 能够简单化的问题,就不要把它复杂化。比如,功力还不到serial fishing时,就可以尝试解除部分功能限制,这样有利于了解代码和增强信心  :)

呵呵
就写这么多,有空继续写
版权归lena所有,我仅仅翻译出他的话和我的心得。


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 7
支持
分享
最新回复 (222)
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
2
支持一下~~
2007-3-14 16:56
0
雪    币: 189
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
关注你,继续写呀!
2007-3-14 19:59
0
雪    币: 697
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
继续,期待中
2007-3-14 20:01
0
雪    币: 209
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
2.5 关于注册码的破解

有些程序让输入reg info,并无条件让用户点register/activate按钮而弹出错误信息,这个是最容易找到字符串的了。但有些软件不一样,输入格式不正确就不让点。还有一些在输入code后需要重启程序或者重启机器,这些后者一般就不属于newbie的能力范围了,因为这些将完成比较并清除堆栈。

如果可以,就直接搜索 thanks, serial, invalid, congratulation,..等字符串,往往可以得到想要的信息。在我们找到成功的注册消息后,就要往上搜索到最近的一个call,这个是最常见的方法,并且找到这个routine的起始,然后再往前后看看,寻找有没有跳过,跳入这个routine的jmp/j**m, 然后开始 crack。
如果前后都没有这样的跳转,那么这个最近的call就可以帮助brutal force cracking

在往前后跟踪的过程中,往往会找到错误信息,这样就可以找与输入code比较相关的代码或者是调用。在进一步跟踪时,就需要了解密码学的知识了,否则即使到了算法代码段,也可能由于了解不够而错过或者无法读懂。

有些程序是一运行就弹出nag的那种,这样的程序往往在启动是就做了注册或激活检查,因此,对nag的跟踪可能直接导致对程序关键判断的发现或破解。有些程序用常量来标识是否注册。所以可以试试search for constants来帮助自己发现控制程序注册或激活状态的代码和常量。这样可能一击则破。

要学会使用f12,让程序停在适当的阶段。有些程序是解除dll文件来实现限制的。所以要细心的观察和学习,能够从dll中破解程序是一个比较高级的阶段,需要长期的训练

--
ok, just this much

版权归lena和arteam的thunderpower所有
2007-3-14 20:28
0
雪    币: 209
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
大家如果需要教程,直接google搜索
cracking tutorials
就可以找到了
2007-3-14 20:30
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
好好关注啊,慢慢学习
2007-3-14 20:42
0
雪    币: 209
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
3.1 tracing tips
大凡找到字符串后就开始trace了,包括f8, f7。如果需要跟踪的代码很长或者不熟悉跟踪的技巧,就会花费很多的时间。这时,可以使用ctl+f8,这是olly的animate功能,将程序预演一次,然后可以f12,再 alt+f9,将程序交给用户。比如说,在可疑的代码处设置breakpoint,然后clt+f8,让程序预演,再在认为可能是关键的地方f12,这样就可以对需要trace代码有一个大概的影响,并且可以帮助修正不必要的bp。这种方法是不是根高效呢?

3.2  searching tips
olly默认只在code段搜索字符串,所以,要想找到藏得更深的字符串,就要动脑子了。工具条上的那个m按钮是用来查看module的。点它,然后clt+b,就可以搜索code段以外的ascii, unicode, binary字符串了。
找到了字符串就要好好利用,记下它的地址,再再 command bar里输入
d targetaddress,就可以看到了,然后在字符串上点右键,选search for reference,就可以看到有哪些指令在调用这个字符串了。也可以用set breakpoint on each reference. 这样迅速跟踪到相关的指令。

3.3 tailing strings
软件中的大部分字符串一般是contant,所以可以修改他们。比如说,unregisterd version,这样的字符串,就可以将它修改成registered to **,注意了,在修改时,要选keep size,否则容易出错。 (这里我用lena的原文,挺幽默的:
this won't cause other nags) 。采用相同的方法,可以修改字符串,直到自己满意为止。

3.4 finding cmps
对于那些简单的在启动时就通过常量来判断注册状态的软件来说,我们很容易找到where to patch。找到与unregisted,registered相关的字符串,然后检查他们附近的哪些jmp是跳过,跳入registered状态的,跟踪条件跳转前的比较或者返回值就可以看到程序判断注册与否的常量了。强制执行跳入到registered状态的跳转就是plain, stupid, but effective的破解 , 或者将比较用得常量改成与跳出registered状态相同的比较常量就可以。也可以将条出registered状态的跳转nop掉。 还可以试试mov al, 1 :)

对于将注册状态存放在堆栈中的程序,我们将来以后的crackme中给出。

**
to be continued
all rights reserved @ lena
2007-3-15 09:31
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
新手学习,慢慢来
2007-3-15 16:46
0
雪    币: 209
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
10
今天成功将flashdigger的ativate按钮永远激活,同时让它的在线验证永远返回:
congratulations!
Flashdigger plus is activated. you must reload flashdigger plus to let activation take effect.

呵呵。 庆祝一下。
顺便写出lena的核心思想:
study the behaviour of the application first and guide the application to the goodboy

lena用goodboy表示成功的消息。为了这个软件我连续工作了进15天,每天都至少花了3小时来学习它的代码和跟踪。呵呵,代码的大致结构已经比较了解了。今天终于有收获了。
我将那个跳出注册成功的子段的(也就是调用消息框来显示congratulations!
Flashdigger plus is activated. you must reload flashdigger plus to let activation take effect.
的子程序)条件跳转nop了。程序直接返回成功的注册信息。
最讨厌的是那个原来一输入错误激活码就变灰的activate按钮,原来它是用用条件
sete    byte ptr ss:[ebp-5]
来控制的,激活码错误,它就变灰。我把它改成了nop。明天再改进一下,将它改成
mov byte ptr ss:[ebp-5], 1,这样它就可能认为我输入了正确的激活码。

这样输入任意激活码,这个activate按钮都是可用的。原来的灰色按钮是用exescope修改的。将enabled=false改成了enabled=true.但是一输入错误激活码就变灰。这下好了。呵呵

还有那个藏在stack中的验证返回值,估计还要一段时间才弄的到,可能离关键跳转很近了。
2007-3-15 22:50
0
雪    币: 209
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
我将patch上传了,提供了patch list。
FlashDigger Plus
http://www.live-share.com/files/178972/FlashDigger_4.0.exe.html

Patcher
http://www.live-share.com/files/178974/FlashDigger_Plus_4.0.0.109_Patcher.exe.html

***
enjoy patches from us newbies
:)
2007-3-15 23:24
0
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
12
感谢楼主对本版的支持以及翻译
2007-3-15 23:26
0
雪    币: 209
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
13
谢谢版主褒奖。
我争取在边破解flashdigger的过程中,边将我从ARTeam和lena那学来的东西分享出来。我打印了+ORC在Friva上的教程,有时间就将其中的精华贴出来。

过几个月我可能去美国读博士,呵呵,已经收到录取通知了,在等给$的offer

:)
2007-3-15 23:32
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
楼主一定是一位高人...
我只是一位刚学破解的菜鸟..
但也能看懂一些你的文章....

请问高人可否把你现在的文章用程序转成实例教程..

从文章里我看得出我就是要找这些来学习....

感谢.....
2007-3-16 08:09
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
楼上的老兄说的好啊!
2007-3-16 08:25
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
恩  在这方面我们都比较菜 还请楼主 版主多多指教才好
2007-3-16 08:31
0
雪    币: 82
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
提示文件大小或版本不符。
2007-3-16 09:04
0
雪    币: 209
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
18
辛辛苦苦打好了,点回复主题时,却遇到bad request,只要从来了。
@ 星际
谢谢使用patcher
这个程序是用asprotec1.23打包的,所以不能直接修改原来的exe文件。olly会报告can't locate codes.所以这个patch用在拆包的exe上。用volx大侠的教本解压就是。再patch解压后的回复文件,解压后还要导入import table,成功后程序才能运行,然后再patch这个修复的解压文件。这个就当练习吧。  :)

@xinjing
关于实例:lena的教程是论坛上一个朋友贴的,我就是跟随这个连接下了lena的教程。连接是
http://jbfonline.net/sndtuts/
清晰的看到lena的教程放在seek and destroy team的网站上。

ArTeam的教程是bt种子,刚刚上传到liveshare上,贴好了连接,但论坛无法访问,连接丢失了,再上传一次:

http://www.live-share.com/files/179191/b-mininova.org-d__Cracking_Tutorials_and_Software.torrent.html
**********
这个flashdigger作的真不赖
1。与注册相关的字符串放在数据区。只有特定时间发生时,才将特定相关信息入栈,并且入栈后在程序区无法找到字符串,但是可以在堆栈中看到。这些字符串用unicode形式存储,入栈是采用ascii方式。专门有一个用来load strings的子程序来负责。

2。采用hardware id和acitvation code结合方式来合成注册码。两者任何一个不对就kill。幸好,hardware id是固定的。程序自己算好作为ascii存放,这个字符串可以自己改。activation code共18h,即,24位,后四位采用明码比较,可以是7464, 85b8的等,验证一次,算一次后四位,动态的。前20位一起比较,非明码形式,这个没搞懂。现作大小写转换,再减去10,等等。还没搞懂,估计要学学密码了。

3。activate按钮默认位灰色。这样如果activation code不正确就无法点acitavte按钮,也就无法得到错误的activation code提示信息。所以强制将activate button激活是第一步。不过这个button在输入任何步正确的注册码时就变灰这样就讨厌了,因为点一次 activate按钮却没输入任何activation code,我们根本看不到比较和算法的进行。所以,要让activate按钮对任何activation code的输入都保持可用,同时也不能使按钮可用影响到激活子程序的调用。好在,找到了:
005894DD     sete    byte ptr ss:[ebp-5]   > nop  //may control activate button
将它改成nop
这个sete指令用来实现更高级的条件,所谓程序在适当的时候的条件。查查assembly code就知道了  :)

4。在线验证的破解。调试时,这个程序到处是断点,因为我是新手,在线验证有7个swtich,分别给出在线验证的返回信息,比如no connection, host name unresolvalbe.呵呵,幸好看到了,case 3,好像是这个switch,congratulations!,.... ,心里那个激动啊。case switch从
59edf8        //case switch
开始。
于是继续跟踪就找到了jmp,其中这个是badboy:
005891F2     jnz     short 00589248    > nop           //!!!!!!! jump pass the good boy.
直接把它 nop了,它的上面就是比较代码cmp,但是返回值是放在堆栈中的,好像返回了2。
这样就把在线验证搞定了,但是终究需要将正确的返回值找到,否则,程序仍是未激活的。

***
我把comments和patch list贴出来,大伙实践一下,呵呵,其中patch list包括尝试性的patch。

Comments list
4049c4        // delivery is available from
404ba0        //test whether code is inputed, test eax, eaxt>nop
404ba4        //move code_length-4 to eax
404cb0        !!!!!!!!!!! compare last 4 char
404cb9        // je> jmp
404d62        //return to code comparison routine
40720c        //load cong string
407254        // !!!! flashdigger is activated
434b4e        // to 434c9c
588dc8        //E_Code Control
588eb8        //btn_AClick
588f0f        //e-code
588f6a        //E_code controller
588f7f        //end of e_code control
588fa5        // codes catched
588fd2        //compare catched codes
588fe0        //http activation
5891ee        //!!!! cmp     dword ptr ss:[ebp-10], 0 > cmp *, 2
5891f2        //!!!!!!! jump pass the good boy. jnz     short 00589248> nop
589203        //!!!! mov "congratulations!" to eax
58922a        //!!! pop congratulations
589368        //move the 20 into stack
58937b        //???
589385        //jbe > jmp
5893ae        //again this statck
5893d3        //1st 20
5893d8        //!!!!!!!!! start comparing
5893e6        //code to stack
589402        //test whether input is null and then truncate at 18h
589407        //compare length
589412        //jmp past the 1st round of comparison, je>jmp
58941b        //extract char from ecode
589447        //ss:[ebp-c]=ecode
589453        //bit test comand
58945a        //setb    al> mov al, 1
589464        //je  short 0058946F > nop
589473        //je short 005894E1
58947f        //test the ist 20 char
58948c        //test again
5894a6        //move the 1st 20 chars onto stack
5894ca        //returned here after calculation
5894d8        //compare last 4
5894e1        //xor     eax, eax
589547        //ecode tedit control
589559        //back to activate routine
589571        //retn > nop
589572        //jmp     004041F0>nop
589577        //jmp     short 00589569> nop
58957c        //retn to 00434b4b, when activate button clicked, returns to 58932b
589580        //online activation routine
589774        //spd_btn
589f14        //e_code enter
59edf8        //case switch

***
Patches list
Patches
Address    Size   State     Old                               New                               Comment
00404BA0     2.   Removed   test    eax, eax                  nop                               //test whether code is inputed, test eax, eaxt>nop
00420408     3.   Removed   loopdne short 00420391            cwde
00466338     2.   Removed   test    al, al                    mov     al, 1
005890E4     2.   Removed   jnz     short 005890FF            nop                               //jnz     short 005890FF> nop
00589122     2.   Removed   jnz     short 0058913A            nop                               //jnz     short 0058913A > nop
005891F2     2.   Removed   jnz     short 00589248            nop                               //!!!!!!! jump pass the good boy. jnz     short 00589248> nop
00589385     2.   Removed   jbe     short 005893D3            jmp     short 005893D3            //jbe > jmp
00589412     2.   Removed   je      short 0058946F            jmp     short 0058946F            //jmp past the 1st round of comparison, je>jmp
0058945A     3.   Removed   setb    al                        nop                               //setb    al> mov al, 1
00589464     2.   Removed   je      short 0058946F            nop                               //je  short 0058946F > nop
00589473     2.   Removed   je      short 005894E1            jmp     short 005894E1            //je short 005894E1
005894DD     4.   Removed   sete    byte ptr ss:[ebp-5]       nop                               //may control activate button, sete    byte ptr ss:[ebp-5]
00589571     1.   Removed   retn                              nop                               //retn > nop
00589572     5.   Removed   jmp     004041F0                  nop                               //jmp     004041F0>nop
005895B4     6.   Removed   ja      005896F0                  jmp     005896F0                  // case switch. let's jump them.  ja>jmp

***********
至少通往破解flashdigger的门是畅通了,继续努力。
2007-3-16 10:34
0
雪    币: 209
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
19
Lena的课程中讲到了关于激活\注册状态的double check, 过几天我把内容整理出来。
这里顺便请教几个问题:
Flashdigger还没真正激活,执行高级编辑时就会弹出激活框,这个是由
43beec到43bf90这段代码来加载的,setproc。 整个程序的windows handle都是由它来控制的。

现在如何截取鼠标事件,用mouse event么?

我的功力还不到serial fishing,所以争取再破解不份功能。未激活版的其中3个限制已经破解了。
需要补丁的,我可以upload
谢谢
2007-3-17 13:00
0
雪    币: 144
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
好文啊 支持!!!
2007-3-17 14:39
0
雪    币: 16
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
观听楼猪说,没劲
我给个好地址吧:
支持多线程的,大家去下吧,看看国外的动画教程,在看看我们的动画教程~~

http://cgame.fixdown.com/reversingprojects/index.php?dir=Tutors/
2007-3-17 18:16
0
雪    币: 4419
活跃值: (894)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
楼主幸苦了哈``````````
2007-3-17 18:47
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
才学,简直摸不着头脑
苦闷
2007-3-18 04:06
0
雪    币: 209
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
24
过几天贴Flashdigger代码分析,着重讲讲罪恶的灰色按钮的控制。
lena称这叫guilty one

pls wait for a while
2007-3-18 09:07
0
雪    币: 209
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
25
我的imagebase为40000000,,大伙在自己的电脑上按照这里的relative offset来找对应的代码就 ok

****
Activate button控制代码:
1。
0058940E   807D FB 00 cmp byte ptr ss:[ebp-5], 0   ;
//!!! cmp byte ptr ss:[ebp-5], 0 , retn 1 to the stack and activate button active again

2。

0058946F  807D FB 00  cmp  byte ptr ss:[ebp-5],0
//cmp byte ptr ss:[ebp-5], 0 , retn 1 to stack and activate button active

输入正确的acitvation code时,ss:[ebp-5]返回0,但输入activation code不正确时,则返回1。如果要对任何输入的activation code来说,activate button可用,就要将他们改成:
mov byte ptr ss:[ebp-5],01
只要cmp的俩个操作数相等,activate button就激活
*****

第一轮activation code比较代码:

005893D8  /$  55            push    ebp                              ;  //!!!!!!!!! start comparing
005893D9  |.  8BEC          mov     ebp, esp
005893DB  |.  83C4 E8       add     esp, -18
005893DE  |.  33D2          xor     edx, edx
005893E0  |.  8955 E8       mov     dword ptr ss:[ebp-18], edx
005893E3  |.  8955 EC       mov     dword ptr ss:[ebp-14], edx
005893E6  |.  8945 FC       mov     dword ptr ss:[ebp-4], eax        ;  //code to stack
005893E9  |.  8B45 FC       mov     eax, dword ptr ss:[ebp-4]
005893EC  |.  E8 63B9E7FF   call    00404D54
005893F1  |.  33C0          xor     eax, eax                         ;  //clear a_code
005893F3  |.  55            push    ebp
005893F4  |.  68 04955800   push    00589504                         ;  // push : jmp     004041F0
005893F9  |.  64:FF30       push    dword ptr fs:[eax]               ;  //set up code seg
005893FC  |.  64:8920       mov     dword ptr fs:[eax], esp
005893FF  |.  8B45 FC       mov     eax, dword ptr ss:[ebp-4]
00589402  |.  E8 99B7E7FF   call    00404BA0                         ;  //test whether input is null and then truncate at 18h
00589407  |.  83F8 18       cmp     eax, 18                          ;  //compare length, cmp     eax, 18
0058940A  |.  0F9445 FB     sete    byte ptr ss:[ebp-5]              ;  //sete    byte ptr ss:[ebp-5]
0058940E      807D FB 00    cmp     byte ptr ss:[ebp-5], 0           ;  //!!! cmp byte ptr ss:[ebp-5], 0 , retn 1 to the stack and activate button active
00589412      74 5B         je      short 0058946F                   ;  //!!! key jmp past the 1st round of comparison to control acode button, je>jmp
00589414  |.  C745 F4 01000>mov     dword ptr ss:[ebp-C], 1
0058941B  |>  837D F4 05    /cmp     dword ptr ss:[ebp-C], 5         ;  //extract char from ecode
0058941F  |.  74 12         |je      short 00589433
00589421  |.  837D F4 0A    |cmp     dword ptr ss:[ebp-C], 0A
00589425  |.  74 0C         |je      short 00589433
00589427  |.  837D F4 0F    |cmp     dword ptr ss:[ebp-C], 0F
0058942B  |.  74 06         |je      short 00589433
0058942D  |.  837D F4 14    |cmp     dword ptr ss:[ebp-C], 14
00589431  |.  75 11         |jnz     short 00589444
00589433  |>  8B45 FC       |mov     eax, dword ptr ss:[ebp-4]
00589436  |.  8B55 F4       |mov     edx, dword ptr ss:[ebp-C]
00589439  |.  807C10 FF 2D  |cmp     byte ptr ds:[eax+edx-1], 2D
0058943E  |.  0F9445 FB     |sete    byte ptr ss:[ebp-5]
00589442  |.  EB 1C         |jmp     short 00589460
00589444  |>  8B45 FC       |mov     eax, dword ptr ss:[ebp-4]
00589447  |.  8B55 F4       |mov     edx, dword ptr ss:[ebp-C]       ;  //ss:[ebp-c]=ecode
0058944A  |.  8A4410 FF     |mov     al, byte ptr ds:[eax+edx-1]
0058944E  |.  25 FF000000   |and     eax, 0FF                        ;  // take only word al
00589453  |.  0FA305 9C8264>|bt      dword ptr ds:[64829C], eax      ;  //bit test comand
0058945A  |.  0F92C0        |setb    al                              ;  //setb    al> nop
0058945D  |.  8845 FB       |mov     byte ptr ss:[ebp-5], al
00589460  |>  807D FB 00    |cmp     byte ptr ss:[ebp-5], 0
00589464  |.  74 09         |je      short 0058946F                  ;  //je  short 0058946F > nop
00589466  |.  FF45 F4       |inc     dword ptr ss:[ebp-C]
00589469  |.  837D F4 19    |cmp     dword ptr ss:[ebp-C], 19
0058946D  |.^ 75 AC         \jnz     short 0058941B
0058946F      807D FB 00    cmp     byte ptr ss:[ebp-5], 0           ;  //cmp byte ptr ss:[ebp-5], 0 , retn 1 to stack and activate button active
00589473  |.  74 6C         je      short 005894E1                   ;  //je short 005894E1
00589475  |.  66:C745 F2 00>mov     word ptr ss:[ebp-E], 0
0058947B  |.  8D45 EC       lea     eax, dword ptr ss:[ebp-14]
0058947E  |.  50            push    eax
0058947F  |.  B9 14000000   mov     ecx, 14                          ;  //test the ist 20 char
00589484  |.  BA 01000000   mov     edx, 1
00589489  |.  8B45 FC       mov     eax, dword ptr ss:[ebp-4]
0058948C  |.  E8 17B9E7FF   call    00404DA8                         ;  //test again
00589491  |.  8B45 EC       mov     eax, dword ptr ss:[ebp-14]
00589494  |.  E8 07B7E7FF   call    00404BA0
00589499  |.  50            push    eax
0058949A  |.  8D45 EC       lea     eax, dword ptr ss:[ebp-14]
0058949D  |.  E8 CEB8E7FF   call    00404D70
005894A2  |.  8D4D F2       lea     ecx, dword ptr ss:[ebp-E]
005894A5  |.  5A            pop     edx                              ;  // pop up ecode
005894A6  |.  E8 BDFEFFFF   call    00589368                         ;  //move the 1st 20 chars onto stack
005894AB  |.  8D4D EC       lea     ecx, dword ptr ss:[ebp-14]
005894AE  |.  0FB745 F2     movzx   eax, word ptr ss:[ebp-E]
005894B2  |.  BA 04000000   mov     edx, 4
005894B7  |.  E8 8819E8FF   call    0040AE44
005894BC  |.  8D45 E8       lea     eax, dword ptr ss:[ebp-18]
005894BF  |.  50            push    eax
005894C0  |.  B9 04000000   mov     ecx, 4
005894C5  |.  BA 15000000   mov     edx, 15
005894CA  |.  8B45 FC       mov     eax, dword ptr ss:[ebp-4]        ;  //returned here after calculation
005894CD  |.  E8 D6B8E7FF   call    00404DA8
005894D2  |.  8B55 E8       mov     edx, dword ptr ss:[ebp-18]
005894D5  |.  8B45 EC       mov     eax, dword ptr ss:[ebp-14]
005894D8  |.  E8 D3B7E7FF   call    00404CB0                         ;  //compare last 4
005894DD      0F9445 FB     sete    byte ptr ss:[ebp-5]              ;  //may control activate button, sete    byte ptr ss:[ebp-5]
005894E1      33C0          xor     eax, eax                         ;  //xor     eax, eax, maybe a breakthroung
005894E3  |.  5A            pop     edx
005894E4  |.  59            pop     ecx
005894E5  |.  59            pop     ecx
005894E6  |.  64:8910       mov     dword ptr fs:[eax], edx
005894E9  |.  68 0B955800   push    0058950B
005894EE  |>  8D45 E8       lea     eax, dword ptr ss:[ebp-18]
005894F1  |.  BA 02000000   mov     edx, 2
005894F6  |.  E8 05B4E7FF   call    00404900
005894FB  |.  8D45 FC       lea     eax, dword ptr ss:[ebp-4]
005894FE  |.  E8 D9B3E7FF   call    004048DC                         ;  //compare to follow
00589503  \.  C3            retn
00589504   .^ E9 E7ACE7FF   jmp     004041F0
00589509   .^ EB E3         jmp     short 005894EE
0058950B   .  8A45 FB       mov     al, byte ptr ss:[ebp-5]
0058950E   .  8BE5          mov     esp, ebp
00589510   .  5D            pop     ebp
00589511   .  C3            retn

关键的地方加了详细注释
2007-3-18 09:16
0
游客
登录 | 注册 方可回帖
返回
//