首页
社区
课程
招聘
[旧帖] [求助]OllyDBG 入门系列(二)-字串参考 字符串长度的疑惑 0.00雪花
发表于: 2007-11-24 15:25 4329

[旧帖] [求助]OllyDBG 入门系列(二)-字串参考 字符串长度的疑惑 0.00雪花

2007-11-24 15:25
4329
这个是置顶帖子 里面的一个OD学习帖子
由于课程需要 才学习汇编1个月  这个是我第一次接触的CRACKME(在附件里面 已脱壳)   对于下面的那个解释 我确实不知道是什么意思
下面看看人家的分析 :
用OD打开 然后查看字符串“ Wrong Serial,try again!” 跟着就进入到对应代码了 然后 看了看这个代码是从00440F39这个单元跳过来的 然后 就找到了如下面的代码:

00440F21 |.  8B83 C4020000 mov     eax, dword ptr [ebx+2C4]
00440F27 |.  E8 F4FEFDFF      call    00420E20
00440F2C |. 8B45 FC            MOV EAX,DWORD PTR SS:[EBP-4]          ; 把我们输入的内容送到EAX,我这里是“CCDebuger”
00440F2F |. BA 14104400     MOV EDX,CrackMe3.00441014             ; ASCII "Registered User"
00440F34 |. E8 F32BFCFF     CALL CrackMe3.00403B2C                ; 关键,要用F7跟进去
00440F39 |. 75 51                JNZ SHORT CrackMe3.00440F8C           ; 这里跳走就完蛋

他这里说00440F2C |. 8B45 FC            MOV EAX,DWORD PTR SS:[EBP-4]
很明显 说明输入的内容在 SS:[EBP-4]里面 然后传到AX里面     我如果把断点下在 00440F21  两次F8后 AX里面的内容就是我当前输入字符串的长度 可以看出来 计算字符串长度的函数就是 call    00420E20  此时 我不去理会他是怎么算出来的 再按一路到00440F34 |. E8 F32BFCFF     CALL CrackMe3.00403B2C     这个时候 用F7进入函数  :

00403B2C /$ 53               PUSH EBX
00403B2D |. 56                PUSH ESI
00403B2E |. 57                PUSH EDI
00403B2F |. 89C6            MOV ESI,EAX                         ; 把EAX内我们输入的用户名送到 ESI
00403B31 |. 89D7            MOV EDI,EDX                         ; 把EDX内的数据“Registered User”送到EDI
00403B33 |. 39D0            CMP EAX,EDX                         ; 用“Registered User”和我们输入的用户名作比较
00403B35 |. 0F84 8F000000   JE CrackMe3.00403BCA                ; 相同则跳
00403B3B |. 85F6            TEST ESI,ESI                        ; 看看ESI中是否有数据,主要是看看我们有没有输入用户名
00403B3D |. 74 68           JE SHORT CrackMe3.00403BA7          ; 用户名为空则跳
00403B3F |. 85FF            TEST EDI,EDI
00403B41 |. 74 6B           JE SHORT CrackMe3.00403BAE
00403B43 |. 8B46 FC         MOV EAX,DWORD PTR DS:[ESI-4]        ; 用户名长度送EAX
00403B46 |. 8B57 FC         MOV EDX,DWORD PTR DS:[EDI-4]        ; “Registered User”字串的长度送EDX

我要问的问题就在上面两行  这里的SI寄存器里面放的内容是我们输入的用户名  寄存器DI里面放的是数据Registered User的地址 为什么 他用DWORD PTR DS:[ESI-4]  就表示用户名长度 。 DWORD PTR DS:[EDI-4]就表示 “Registered User”字串的长度

前面我提到 在 call    00420E20  后 AX里面就是字符传长度了 这里他怎么调用确实没有看出为什么
我为了看清楚 在 call    00420E20时 用F7跟入了 但是 随后又必须再跟入20几个CALL后 AX里面的内容才发生变化  这个确实是我能力不及的  请问 他是怎么把这个字符串长度送进去的   

另外 在问下 如果我在OD里面对程序做了相应修改 怎么把这个修改保存下来  就像其他软件样 辈分一个新的修改好了的程序

[课程]Android-CTF解题方法汇总!

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
2
1、Delphi的String类型字符串有一个特点,那就是字符串首地址减去4的偏移就保存着该字符串的长度。所以[esi-4]和[edi-4]就是字符串的长度。
2、在OD里CPU代码窗口里右击鼠标,选择菜单[复制到可执行文件]/[选择部分或保存全部]命令即可。
2007-11-24 15:48
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
学习了,谢谢
2007-11-24 16:25
0
雪    币: 192
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
感谢 小虾 谢谢了
2007-11-24 20:52
0
雪    币: 466
活跃值: (165)
能力值: ( LV9,RANK:190 )
在线值:
发帖
回帖
粉丝
5
哎!严重佩服小虾。
2007-11-25 21:45
0
雪    币: 189
活跃值: (46)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
谢了,感觉对语言了解的还是太少,很多东西感觉迷茫啊。。。。。
2007-11-27 16:18
0
游客
登录 | 注册 方可回帖
返回
//