首页
社区
课程
招聘
OllyDBG 入门系列三 部分没看明白~,请大侠指点……感谢!!
发表于: 2010-7-11 12:29 3684

OllyDBG 入门系列三 部分没看明白~,请大侠指点……感谢!!

2010-7-11 12:29
3684
这是原文:http://bbs.pediy.com/showthread.php?t=21330

其中的一段:

光标停在 00401328 地址处的那条指令上。现在我们按 F7 键跟进:

004013D2 /$ 56                PUSH ESI                                    ; ESI 入栈
004013D3 |. 33C0              XOR EAX,EAX                                 ; EAX 清零
004013D5 |. 8D35 C4334000     LEA ESI,DWORD PTR DS: [4033C4]               ; 把注册码框中的数值送到ESI
004013DB |. 33C9              XOR ECX,ECX                                 ; ECX 清零
004013DD |. 33D2              XOR EDX,EDX                                 ; EDX 清零
004013DF |. 8A06              MOV AL,BYTE PTR DS: [ESI]                    ; 把注册码中的每个字符送到AL
004013E1 |. 46                INC ESI                                     ; 指针加1,指向下一个字符
004013E2 |. 3C 2D             CMP AL,2D                                   ; 把取得的字符与16进制值为2D的字符(即“-”)比较,这里主要用于判断输入的是不是负数
004013E4 |. 75 08             JNZ SHORT CrackHea.004013EE                 ; 不等则跳
004013E6 |. BA FFFFFFFF       MOV EDX,-1                                  ; 如果输入的是负数,则把-1送到EDX,即16进制FFFFFFFF
004013EB |. 8A06              MOV AL,BYTE PTR DS: [ESI]                    ; 取“-”号后的第一个字符
004013ED |. 46                INC ESI                                     ; 指针加1,指向再下一个字符
004013EE |> EB 0B             JMP SHORT CrackHea.004013FB
004013F0 |> 2C 30             SUB AL,30                                   ; 每位字符减16进制的30,因为这里都是数字,如1的ASCII码是“31H”,减30H后为1,即我们平时看到的数值
004013F2 |. 8D0C89            LEA ECX,DWORD PTR DS: [ECX+ECX*4]            ; 把前面运算后保存在ECX中的结果乘5再送到ECX
004013F5 |. 8D0C48            LEA ECX,DWORD PTR DS: [EAX+ECX*2]            ; 每位字符运算后的值与2倍上一位字符运算后值相加后送ECX
004013F8 |. 8A06              MOV AL,BYTE PTR DS: [ESI]                    ; 取下一个字符
004013FA |. 46                INC ESI                                     ; 指针加1,指向再下一个字符
004013FB |> 0AC0              OR AL,AL
004013FD |.^ 75 F1            JNZ SHORT CrackHea.004013F0                 ; 上面一条和这一条指令主要是用来判断是否已把用户输入的注册码计算完
004013FF |. 8D040A            LEA EAX,DWORD PTR DS: [EDX+ECX]              ; 把EDX中的值与经过上面运算后的ECX中值相加送到EAX
00401402 |. 33C2              XOR EAX,EDX                                 ; 把 EAX与EDX异或。如果我们输入的是负数,则此处功能就是把EAX中的值取反
00401404 |. 5E                POP ESI                                     ; ESI 出栈。看到这条和下一条指令,我们要考虑一下这个ESI的值是哪里运算得出的呢?
00401405 |. 81F6 53757A79     XOR ESI,797A7553                            ; 把 ESI中的值与797A7553H异或
0040140B \. C3                RETN

问题 1:
004013F2 |. 8D0C89            LEA ECX,DWORD PTR DS: [ECX+ECX*4]
004013F5 |. 8D0C48            LEA ECX,DWORD PTR DS: [EAX+ECX*2]

这两句为什么不写成LEA ECX,DWORD PTR DS: [EAX+ECX*10]?有什么区别~~?

问题 2:
004013FF |. 8D040A            LEA EAX,DWORD PTR DS: [EDX+ECX]
00401402 |. 33C2              XOR EAX,EDX

这两句当没有“-”号的时候ECX保持不变,但是当有“-”号时,XOR EAX,EDX这句是取反,
LEA EAX,DWORD PTR DS: [EDX+ECX]这句是在做什么,两句和一起的功能是什么??

希望大侠指点……

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

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 195
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
大家帮忙吧……
2010-7-11 14:26
0
雪    币: 349
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
问题 1:
004013F2 |. 8D0C89            LEA ECX,DWORD PTR DS: [ECX+ECX*4]
004013F5 |. 8D0C48            LEA ECX,DWORD PTR DS: [EAX+ECX*2]

这两句为什么不写成LEA ECX,DWORD PTR DS: [EAX+ECX*10]?有什么区别~~?
虽然等同,但是只有*2,4,8的,CUP不支持*10的。《加解3》有说明。

问题 2:
不解。
2010-7-11 15:29
0
雪    币: 897
活跃值: (30)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
xor  是异或操作,,
2010-7-11 15:35
0
雪    币: 118
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
LZ没必要刻意去学习工具怎么用,还有你那些代码看不懂好好去看下X86汇编    关于工具跟着教程用两下基本就熟悉了
2010-7-11 16:06
0
雪    币: 195
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
我知道xor是异或~因为EDX里面都是1,所以XOR EAX,EDX就是把EAX取反了……

谢谢三楼~ 第一个问题解决了……
2010-7-11 16:16
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
7
004013FF |. 8D040A            LEA EAX,DWORD PTR DS: [EDX+ECX] ; 如果edx是有符号位的,则设置ecx的符号位。
00401402 |. 33C2              XOR EAX,EDX ; 将eax的值异或取反,如果edx是有符号位的,eax的值则从无符号整数转为有符号整数。
2010-7-11 17:47
0
雪    币: 195
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
我理解是这样了~:
当EDX=-1时LEA EAX,DWORD PTR DS: [EDX+ECX] ; 实际就是把ECX减1
再 XOR EAX,EDX取反,这样就用补码表示负数的源码了……
到时候用EAX里的数据,因为符号位是1所以再取反,再加1就又得到负数的源码了~
2010-7-11 18:34
0
游客
登录 | 注册 方可回帖
返回
//