Armboy2010 发表于 2015-1-27 11:06:44

OD如何定位CTime::GetCurrentTime()?

本帖最后由 Armboy2010 于 2015-1-27 11:09 编辑

我用MFC写了简单的demo


代码如下:

// 按钮单击事件
void CTestBtnClickDlg::OnBnClickedBtnClick()
{
    CTime curTime = CTime::GetCurrentTime();
    CString strTime = curTime.Format("%Y-%m-%d %H:%M:%S");
    SetDlgItemText(IDC_EDIT_MSG, strTime);
}

编译选项选择静态链接到MFC,编译Release版本,OD载入,
设置断点SetDlgItemTextA,断下后反汇编代码如下:
00A5220C/$8BFF          MOV EDI,EDI
00A5220E|.55            PUSH EBP
00A5220F|.8BEC          MOV EBP,ESP
00A52211|.8379 68 00    CMP DWORD PTR DS:,0
00A52215|.75 15         JNZ SHORT TestBtnC.00A5222C
00A52217|.FF75 08       PUSH DWORD PTR SS:                ; /ControlID
00A5221A|.FF71 20       PUSH DWORD PTR DS:               ; |hWnd
00A5221D|.FF15 0468B600 CALL DWORD PTR DS:[<&USER32.GetDlgItem>] ; \GetDlgItem
00A52223|.8B4D 0C       MOV ECX,DWORD PTR SS:
00A52226|.8901          MOV DWORD PTR DS:,EAX
00A52228|.5D            POP EBP
00A52229|.C2 0800       RETN 8
00A5222C|>8B49 68       MOV ECX,DWORD PTR DS:
00A5222F|.8B01          MOV EAX,DWORD PTR DS:
00A52231|.5D            POP EBP
00A52232\.FF60 70       JMP DWORD PTR DS:
00A52235      8BFF          MOV EDI,EDI
00A52237/.55            PUSH EBP                                 ;断在这里
00A52238|.8BEC          MOV EBP,ESP
00A5223A|.8379 68 00    CMP DWORD PTR DS:,0
00A5223E|.75 13         JNZ SHORT TestBtnC.00A52253
00A52240|.FF75 0C       PUSH DWORD PTR SS:                ; /Text
00A52243|.FF75 08       PUSH DWORD PTR SS:                ; |ControlID
00A52246|.FF71 20       PUSH DWORD PTR DS:               ; |hWnd
00A52249|.FF15 3466B600 CALL DWORD PTR DS:[<&USER32.SetDlgItemTe>; \SetDlgItemTextA
00A5224F|.5D            POP EBP
00A52250|.C2 0800       RETN 8
00A52253|>8B49 68       MOV ECX,DWORD PTR DS:
00A52256|.8B01          MOV EAX,DWORD PTR DS:
00A52258|.5D            POP EBP
00A52259\.FFA0 88000000 JMP DWORD PTR DS:

此时的栈内存如下:
0044F368   00A41FDCTestBtnC.00A41FDC
0044F36C   000003E9
0044F370   022C5A10ASCII "2015-01-27 10:52:07"
0044F374   74B9B92B
0044F378   00000111
0044F37C   00B8EDB0TestBtnC.00B8EDB0
0044F380   54C6FD57
0044F384   00000000
0044F388   022C5A10ASCII "2015-01-27 10:52:07"
0044F38C   0044F50C指向下一个 SEH 记录的指针
0044F390   00B63C08SE处理程序
0044F394   00000000
0044F398/0044F3A8
0044F39C|00A49117返回到 TestBtnC.00A49117
0044F3A0|00B8EDB0TestBtnC.00B8EDB0
0044F3A4|0044FA64

通过栈内存,我在地址022C5A10处下了内存写入断点,继续跑程序点击按钮,程序断了几次,
我跟了好久,就是找不到以下两行代码对应的反汇编代码:
CTime curTime = CTime::GetCurrentTime();
CString strTime = curTime.Format("%Y-%m-%d %H:%M:%S");

知道的大神,忘能指点一二,感激不尽!该例子程序打包在附件中了。





wyqzm 发表于 2015-1-27 14:12:35

一,程序用的debug模式吧?
二,如果你看不到,往往还需要pdb调度符号的,

Armboy2010 发表于 2015-1-27 15:01:55

wyqzm 发表于 2015-1-27 14:12
一,程序用的debug模式吧?
二,如果你看不到,往往还需要pdb调度符号的,

1. 程序是Release版本的
2. 如果是别人的程序,怎么可能拿到pdb文件?所有要彻底模拟!

goushibee 发表于 2015-1-27 16:43:14

本帖最后由 goushibee 于 2015-1-27 16:45 编辑

1.搜索字符串“%Y-%m-%d %H:%M:%S”
2.看导入表中 SetDlgItemText
3.api断点 和时间相关的都给下了4.还有N多方法

你都找到SetDlgItemTextA位置了,向上返回一层就到了

00401F9D|.50            push eax
00401F9E|.8D45 F4       lea eax,dword ptr ss:
00401FA1|.64:A3 0000000>mov dword ptr fs:,eax
00401FA7|.8BF9          mov edi,ecx
00401FA9|.6A 00         push 0x0
00401FAB|.E8 2AF00F00   call TestBtnC.00500FDA                   ;CTime curTime = CTime::GetCurrentTime();
00401FB0|.8945 E8       mov dword ptr ss:,eax
00401FB3|.83C4 04       add esp,0x4
00401FB6|.8D45 E8       lea eax,dword ptr ss:
00401FB9|.50            push eax
00401FBA|.8D75 F0       lea esi,dword ptr ss:
00401FBD|.8955 EC       mov dword ptr ss:,edx
00401FC0|.E8 9B000000   call TestBtnC.00402060                   ;CString strTime = curTime.Format("%Y-%m-%d %H:%M:%S");
00401FC5|.C745 FC 00000>mov dword ptr ss:,0x0
00401FCC|.8B4D F0       mov ecx,dword ptr ss:
00401FCF|.51            push ecx
00401FD0|.68 E9030000   push 0x3E9
00401FD5|.8BCF          mov ecx,edi
00401FD7|.E8 59020100   call TestBtnC.00412235                   ;SetDlgItemText(IDC_EDIT_MSG, strTime);


wyqzm 发表于 2015-1-27 17:23:23

Armboy2010 发表于 2015-1-27 15:01
1. 程序是Release版本的
2. 如果是别人的程序,怎么可能拿到pdb文件?所有要彻底模拟!

你这个应该不是Release版本的,因为我即使用VC10编译也不可能有这么大的exe。

如果你没有调试符号,或许只能去微软的网站下载相应的调试文件和库文件。

sndncel 发表于 2015-1-27 18:39:04

哈哈。谢谢分享呀。。。。学习了呀。

Armboy2010 发表于 2015-1-27 19:00:58

goushibee 发表于 2015-1-27 16:43
1.搜索字符串“%Y-%m-%d %H:%M:%S”
2.看导入表中 SetDlgItemText
3.api断点 和时间相关的都给下了4.还有 ...

太感谢你了,初学逆向,基础还不是很好!{:soso_e181:}

tonier.lu 发表于 2015-1-29 11:20:24

谢谢分享呀。。。。学习了呀。
页: [1]
查看完整版本: OD如何定位CTime::GetCurrentTime()?