首页
社区
课程
招聘
[求助]字节与字符问题
发表于: 2009-5-22 14:35 4445

[求助]字节与字符问题

2009-5-22 14:35
4445
在一处破解文章看到

movzx eax,byte ptr ss:[ebp-4] ;提取第一个字符
cmp eax,35 ;与5比较                 
movzx eax,byte ptr ss:[ebp-3];提取第二个字符
cmp ecx,35
movzx eax,byte ptr ss:[ebp-A];提取第三个字符

cmp ecx,38
movzx eax,byte ptr ss:[ebp-B];提取第四个字符

cmp ecx,35
movzx eax,byte ptr ss:[ebp-7];提取第五个字符

cmp ecx,36
movzx eax,byte ptr ss:[ebp-9]   ;提取第六个字符
   
cmp ecx,37

为什么:[ebp-4] 是第一个字符,:[ebp-3]是第二个:[ebp-A]是第三个...

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

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 217
活跃值: (22)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
这个问题,应该具体到代码..你看看对应的字符编码,不同的字符编码可能回出现这种情况..

当然,也有可能这段代码只是为了说明问题.并不是严格准确的可执行代码..
2009-5-22 14:45
0
雪    币: 72
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
http://bbs.pediy.com/showthread.php?s=&threadid=7505&highlight=riijj
这里也有类似的问题:
00401230  /$ 8B0D BC564000  MOV ECX,DWORD PTR DS:[4056BC]
00401236  |. 83EC 30        SUB ESP,30                        // 在 stack 划出空间,作为变量
00401239  |. 8D4424 00      LEA EAX,DWORD PTR SS:[ESP]
0040123D  |. 53             PUSH EBX
0040123E  |. 56             PUSH ESI
0040123F  |. 8B35 94404000  MOV ESI,DWORD PTR DS:[<&USER32.GetDlgIte>;  USER32.GetDlgItemTextA
00401245  |. 6A 10          PUSH 10                                  ; /Count = 10 (16.)
00401247  |. 50             PUSH EAX                                 ; |Buffer                   //  <---- 注意这里,
00401248  |. 68 E8030000    PUSH 3E8                                 ; |ControlID = 3E8 (1000.)  //  可以看出存放字符串的地方
0040124D  |. 51             PUSH ECX                                 ; |hWnd => NULL            
0040124E  |. 33DB           XOR EBX,EBX                              ; |
00401250  |. FFD6           CALL ESI                                 ; \GetDlgItemTextA
00401252  |. 83F8 03        CMP EAX,3                         // 找到注册名字,如果字名的长度不小于 3,便跳,否则便完结
00401255  |. 73 0B          JNB SHORT ncrackme.00401262
00401257  |. 5E             POP ESI
00401258  |. B8 01000000    MOV EAX,1
0040125D  |. 5B             POP EBX
0040125E  |. 83C4 30        ADD ESP,30
00401261  |. C3             RETN                              // 如果来了这里,便完结了
00401262  |> A1 BC564000    MOV EAX,DWORD PTR DS:[4056BC]     // 从 JNB 来了这里
00401267  |. 8D5424 28      LEA EDX,DWORD PTR SS:[ESP+28]
0040126B  |. 6A 10          PUSH 10
0040126D  |. 52             PUSH EDX                          // <----- 注意这里,可以看出存放序号字符串的地方
0040126E  |. 68 E9030000    PUSH 3E9
00401273  |. 50             PUSH EAX
00401274  |. FFD6           CALL ESI                          // 再用 GetDlgItemTextA ,得到序号
00401276  |. 0FBE4424 08    MOVSX EAX,BYTE PTR SS:[ESP+8]     // 把名字的第一个位,放入 EAX
0040127B  |. 0FBE4C24 09    MOVSX ECX,BYTE PTR SS:[ESP+9]     // 把名字的第二个位,放入 ECX
00401280  |. 99             CDQ                               // 把 EAX 扩展,成为 EDX:EAX 的 QWORD(64 位长)
00401281  |. F7F9           IDIV ECX                          // 把 EDX:EAX 除以 ECX,余数放在 EDX
00401283  |. 8BCA           MOV ECX,EDX                       
00401285  |. 83C8 FF        OR EAX,FFFFFFFF                   // EAX = 0xffffffff
00401288  |. 0FBE5424 0A    MOVSX EDX,BYTE PTR SS:[ESP+A]     // 把名字的第一个位,放入 EDX
0040128D  |. 0FAFCA         IMUL ECX,EDX                      // 把刚才的余数乘以 EDX
00401290  |. 41             INC ECX                           // ECX 增加 1
00401291  |. 33D2           XOR EDX,EDX                       // EDX = 0
00401293  |. F7F1           DIV ECX                           // 以 0xffffffff 除以 ECX

为什么ESP+8是第一位?加1代表加一个字节还是其他的?

00401276  |. 0FBE4424 08    MOVSX EAX,BYTE PTR SS:[ESP+8]     // 把名字的第一个位,放入 EAX
0040127B  |. 0FBE4C24 09    MOVSX ECX,BYTE PTR SS:[ESP+9]     // 把名字的第二个位,放入 ECX
而这ESP+A又是第一位?
00401288  |. 0FBE5424 0A    MOVSX EDX,BYTE PTR SS:[ESP+A]     // 把名字的第一个位,放入 EDX
2009-5-22 15:17
0
雪    币: 217
活跃值: (22)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
00401276  |. 0FBE4424 08    MOVSX EAX,BYTE PTR SS:[ESP+8]     // 把名字的第一个位,放入 EAX
0040127B  |. 0FBE4C24 09    MOVSX ECX,BYTE PTR SS:[ESP+9]     // 把名字的第二个位,放入 ECX
而这ESP+A又是第一位?
00401288  |. 0FBE5424 0A    MOVSX EDX,BYTE PTR SS:[ESP+A]     // 把名字的第一个位,放入 EDX

---------------------------------------------------------------
堆栈对于局部变量来说,堆栈是共用的.任何push 或者 pop 都可能改变局部变量相对于ESP的偏移.
你注意看看代码中间的push 和pop,一个函数里面应该有很多这样的语句,用来保存寄存器的内容.最好
自己手动画个图.逐步分析ESP的变化..
2009-5-22 15:23
0
雪    币: 217
活跃值: (22)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
IDA是个不错的工具,一般可以帮你给局部变量命名,并自动跟踪ESP的变化..你可以试试看看能不能帮助你理解堆栈.
2009-5-22 15:26
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
谢谢 学习一下...
2009-5-22 15:54
0
雪    币: 1596
活跃值: (30)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
7
[QUOTE=人族;628979]在一处破解文章看到

movzx eax,byte ptr ss:[ebp-4] ;提取第一个字符
cmp eax,35 ;与5比较                 
movzx eax,byte ptr ss:[ebp-3];提取第二个字符
cmp ecx,35
movzx eax,b...[/QUOTE]

应该向上找
movzx  ss:[ebp-4],byte ptr [???]或mov dword ptr ss:[ebp-4],???
下断后看看是什么数据是知道了.
2009-5-23 19:59
0
游客
登录 | 注册 方可回帖
返回
//