【文章作者】: Gall
【作者主页】: http://hi.baidu.com/8ohack
【使用工具】: Ollydbg
【操作平台】: WindowsXP
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
【加密解密 第三版】---调试片
TraceMe的分析是用【函数参考法】完成的,在这里我换一种思路,介绍一下【字符串参考法】的分析过程.
一般大家利用字符串参考法,是直接在Ollydbg[或其他工具]查找,然后分析出关键地址。
大家有没有想过,如果这个"错误字符串"在执行过程中写入内存的,那么你一开始查找这个提示字符,就无法分析出关键位置.
下面是我的分析过程
利用Ollydbg查找错误字符的十六进制数据D0F2C1D0BAC5B4EDCEF3A3ACD4D9C0B4D2BBB4CEA3,记住分别在节【.text】
【.data】【.rdata】查找,有时候数据在节【.data】中,在节【.text】中查找时找不到的.------很多人利用字符串无法分析出关键信息,问题就在这里.
TraceMe.exe的错误数据,我在节【.data】中找到的
00405038 D0F2 sal dl, 1
0040503A C1D0 BA rcl eax, 0BA
0040503D C5B4ED CEF3A3AC lds esi, fword ptr [ebp+ebp*8+ACA3F3CE]
00405044 D4 D9 aam 0D9
00405046 C0B4D2 BBB4CEA3 A1 sal byte ptr [edx+edx*8+A3CEB4BB], 0A1
右键查找Find references to >> Selected block
References in TraceMe:.text to block 00405038..0040504D
Address Disassembly Comment
0040110F mov esi, 00405038
00405038 sal dl, 1 (Initial CPU selection)
查看0040110F处的数据
0040110F . BE 38504000 mov esi, 00405038
00401114 . 8D7C24 30 lea edi, dword ptr [esp+30]
00401118 . F3:A5 rep movs dword ptr es:[edi], dword ptr [esi]
0040111A . 894424 08 mov dword ptr [esp+8], eax
0040111E . 66:A1 5C504000 mov ax, word ptr [40505C]
00401124 . 66:A5 movs word ptr es:[edi], word ptr [esi]
00401126 . 66:894424 14 mov word ptr [esp+14], ax
0040112B . 8B8424 04010000 mov eax, dword ptr [esp+104]
00401132 . 83E8 10 sub eax, 10 ; Switch (cases 10..111)
00401135 . 895424 10 mov dword ptr [esp+10], edx
估计这时候大家,还是不知道这个地方是否为关键地址,不要紧,在0040110F出下断点,然后F9运行程序,你会发现程序被断下来,主窗体没有出现。
一般要做的是在输入【注册名】与【注册码】后,按下注册按钮,然后在某处被断下来.这说明我们这里下的断点并非关键位置。
有人可能会说,保不准还有其他的位置呢?没错Ctrl+L继续查找,你就会发现错误字符就这一处.
现在换个思路,错误字符可能是在程序运行时,写在其他地址的,或者说错误字符的地址被复制到其他的位置,调用的时候用的是复制后的地址.
Ollydbg载入程序,F9运行,输入【注册名】与【注册码】后,按下注册按钮,然后在查找【错误提示字符】对应的十六进制数据D0F2C1D0BAC5B4EDCEF3A3ACD4D9C0B4D2BBB4CEA3。
你会找到下面的两处,
【第一处】
00405038 D0F2 sal dl, 1
0040503A C1D0 BA rcl eax, 0BA
0040503D C5B4ED CEF3A3AC lds esi, fword ptr [ebp+ebp*8+ACA3F3CE]
00405044 D4 D9 aam 0D9
00405046 C0B4D2 BBB4CEA3 A1 sal byte ptr [edx+edx*8+A3CEB4BB], 0A1
【第二处】
004054E3 00D0 add al, dl
004054E5 F2: prefix repne:
004054E6 C1D0 BA rcl eax, 0BA
004054E9 C5B4ED CEF3A3AC lds esi, fword ptr [ebp+ebp*8+ACA3F3CE]
004054F0 D4 D9 aam 0D9
004054F2 C0B4D2 BBB4CEA3 A1 sal byte ptr [edx+edx*8+A3CEB4BB], 0A1
看到没有,多了一处哦!这时候我们就可以用【第二处】分析.
References in TraceMe:.text to block 004054E3..004054F9
Address Disassembly Comment
004010A7 push 004054E4
004011FC push 004054E4
00401233 push 004054E4
0040124D push 004054E4 ; 我们利用这个地址查看哦
004054E3 add al, dl (Initial CPU selection)
有人肯定要问为什么要用最后面的,分析关键位置,我只能这么说,最后面的这个最接近错误提示的位置,也就是最靠近关键位置.
0040124D . 68 E4544000 push 004054E4 ; |String1 = TraceMe.004054E4
00401252 . FF15 60404000 call dword ptr [<&KERNEL32.lstrcpyA>] ; \lstrcpyA
00401258 . 6A 6E push 6E ; /ControlID = 6E (110.)
0040125A . 56 push esi ; |hWnd
0040125B . FF15 BC404000 call dword ptr [<&USER32.GetDlgItem>] ; \GetDlgItem
00401261 > 50 push eax ; /hWnd
接下来的分析由大家自己完成吧!
下面是关键信息
004011E4 . 50 push eax
004011E5 . E8 56010000 call 00401340 ; 关键位置
004011EA . 8B3D BC404000 mov edi, dword ptr [<&USER32.GetDlgItem>] ; USER32.GetDlgItem
004011F0 . 83C4 0C add esp, 0C
004011F3 . 85C0 test eax, eax
004011F5 . 74 37 je short 0040122E ; 关键跳转
004011F7 . 8D4C24 0C lea ecx, dword ptr [esp+C]
004011E5处的call调用就是算法过程.[有兴趣的自行分析一下]
--------------------------------------------------------------------------------
【经验总结】
找准字符串查找的时机
【错误框出现前】
【错误框出现后】
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
2010年08月05日 13:44:28
- 标 题:TraceMe--字符串查找【新思路】
- 作 者:Gall
- 时 间:2010-08-05 13:46:39
- 链 接:http://bbs.pediy.com/showthread.php?t=118011