能力值:
( LV2,RANK:10 )
|
-
-
2 楼
这个问题,应该具体到代码..你看看对应的字符编码,不同的字符编码可能回出现这种情况..
当然,也有可能这段代码只是为了说明问题.并不是严格准确的可执行代码..
|
能力值:
( 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
|
能力值:
( 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的变化..
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
IDA是个不错的工具,一般可以帮你给局部变量命名,并自动跟踪ESP的变化..你可以试试看看能不能帮助你理解堆栈.
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
谢谢 学习一下...
|
能力值:
( 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],???
下断后看看是什么数据是知道了.
|
|
|