吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 6179|回复: 2
收起左侧

[调试逆向] 尝试对LordPE中日期时间戳与日期时间的转换功能的逆向

[复制链接]
Snow 发表于 2012-6-16 17:38
在网上只能找到把时间转成时间戳的方法却找不到反向转换的方法,记得LordPE有这个功能便想看看ASM代码,但是恰好这个功能没有什么成功或者失败的提示,找字符串什么的都找不着,所以想到下面这个方法

自己写个对mktime函数的调用的小程序(mktime用于时间转时间戳),然后把OD调试自己的小程序,F7进到mktime的内部代码,把前面的一些机器码复制下来,再用OD打开LordPE,查找命令序列。

图为LordPE中时间日期戳和时间相互转换的一个窗口http://bbs.2cto.com/attachment/48_217886_77a4bca1adb898e.jpg?21
休息一下(未写完的)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
回家之后,继续了刚才的实验,发现根本无法找到LordPE中有mktime函数的调用踪迹,后来我用别的方法找到真正的日期时间戳转换的大概代码的时候又确实见到有mktime的调用,进入从LordPE中调用的mktime内部看一下
77C4AE8C >  8BFF            mov     edi, edi                                   
77C4AE8E    55              push    ebp
77C4AE8F    8BEC            mov     ebp, esp
77C4AE91    8B45 08         mov     eax, dword ptr [ebp+8]
77C4AE94    6A 01           push    1
77C4AE96    E8 29FEFFFF     call    77C4ACC4
77C4AE9B    59              pop     ecx
77C4AE9C    5D              pop     ebp
77C4AE9D    C3              retn


我又拿出我写的那个对mktime调用的程序看了一下

004011C0 >/$  55            push    ebp
004011C1  |.  8BEC          mov     ebp, esp
004011C3  |.  6A 01         push    1
004011C5  |.  8B45 08       mov     eax, dword ptr [ebp+8]
004011C8  |.  50            push    eax
004011C9  |.  E8 32000000   call    _make_time_t
004011CE  |.  83C4 08       add     esp, 8
004011D1  |.  5D            pop     ebp
004011D2  \.  C3            retn
其实大体还是差不多的,本质都是在内部再调用了函数 _make_time_t,只是头三个字节的代码和最后面的一些代码不同而已。






我说说我用的什么方法找到日期转换附近的代码的吧,其实也是跟刚才说的话有些矛盾了,因为用的字符串查找的方法。
刚开始我点来点去,发现只是编辑框内容变了,却没什么失败成功提示,后来把日期编辑框里的东西改成1970-01-01,LordPE就提示错误了
我循着错误信息来到日期转换附近的代码处,然后来到该事件的头部,代码如下(已经做了分析注释)
004144F0  /$  83EC 40       sub     esp, 40                                     ;  分配64个字节空间
004144F3  |.  53            push    ebx
004144F4  |.  55            push    ebp
004144F5  |.  8B6C24 4C     mov     ebp, dword ptr [esp+4C]
004144F9  |.  56            push    esi
004144FA  |.  57            push    edi                                         ;  保存寄存器
004144FB  |.  8B3D 64924100 mov     edi, dword ptr [<&USER32.GetDlgItem>]       ;  USER32.GetDlgItem
00414501  |.  68 79040000   push    479                                         ; /ControlID = 479 (1145.)
00414506  |.  55            push    ebp                                         ; |hWnd
00414507  |.  FFD7          call    edi                                         ; \GetDlgItem(获得"时分秒编辑框"的句柄)
00414509  |.  68 78040000   push    478                                         ; /ControlID = 478 (1144.)
0041450E  |.  55            push    ebp                                         ; |hWnd
0041450F  |.  8BF0          mov     esi, eax                                    ; |ebx="时分秒编辑框"的句柄              注意
00414511  |.  FFD7          call    edi                                         ; \GetDlgItem(获得"日期编辑框"的句柄)
00414513  |.  68 70040000   push    470                                         ; /ButtonID = 470 (1136.)
00414518  |.  55            push    ebp                                         ; |hWnd
00414519  |.  8BD8          mov     ebx, eax                                    ; |ebx="日期编辑框"的句柄                注意
0041451B  |.  FF15 6C924100 call    dword ptr [<&USER32.IsDlgButtonChecked>]    ; \看看第一个CheckBox是否被check
00414521  |.  85C0          test    eax, eax
00414523  |.  0F84 01010000 je      0041462A                                    ;  没选中则跳转(选中了的话就会将日期时间转换为戳)我们主要研究从戳到日期时间的转换,所以跟过去吧
00414529  |.  B9 09000000   mov     ecx, 9
0041452E  |.  33C0          xor     eax, eax
00414530  |.  8D7C24 2C     lea     edi, dword ptr [esp+2C]
00414534  |.  F3:AB         rep     stos dword ptr es:[edi]
00414536  |.  8B3D AC924100 mov     edi, dword ptr [<&USER32.SendMessageA>]     ;  USER32.SendMessageA
0041453C  |.  8D4424 1C     lea     eax, dword ptr [esp+1C]
00414540  |.  50            push    eax                                         ; /lParam
00414541  |.  6A 00         push    0                                           ; |wParam = 0
00414543  |.  68 01100000   push    1001                                        ; |Message = MSG(1001)
00414548  |.  53            push    ebx                                         ; |hWnd
00414549  |.  FFD7          call    edi                                         ; \SendMessageA
0041454B  |.  8B4C24 22     mov     ecx, dword ptr [esp+22]
0041454F  |.  8B5424 20     mov     edx, dword ptr [esp+20]
00414553  |.  8B4424 1E     mov     eax, dword ptr [esp+1E]
00414557  |.  81E1 FFFF0000 and     ecx, 0FFFF
0041455D  |.  81E2 FFFF0000 and     edx, 0FFFF
00414563  |.  894C24 38     mov     dword ptr [esp+38], ecx
00414567  |.  8B4C24 1C     mov     ecx, dword ptr [esp+1C]
0041456B  |.  895424 44     mov     dword ptr [esp+44], edx
0041456F  |.  8D5424 1C     lea     edx, dword ptr [esp+1C]
00414573  |.  25 FFFF0000   and     eax, 0FFFF
00414578  |.  81E1 FFFF0000 and     ecx, 0FFFF
0041457E  |.  52            push    edx                                         ; /lParam
0041457F  |.  6A 00         push    0                                           ; |wParam = 0
00414581  |.  48            dec     eax                                         ; |
00414582  |.  81E9 6C070000 sub     ecx, 76C                                    ; |
00414588  |.  68 01100000   push    1001                                        ; |Message = MSG(1001)
0041458D  |.  56            push    esi                                         ; |hWnd
0041458E  |.  894424 4C     mov     dword ptr [esp+4C], eax                     ; |
00414592  |.  894C24 50     mov     dword ptr [esp+50], ecx                     ; |
00414596  |.  FFD7          call    edi                                         ; \SendMessageA
00414598  |.  8B4424 24     mov     eax, dword ptr [esp+24]
0041459C  |.  8B4C24 26     mov     ecx, dword ptr [esp+26]
004145A0  |.  8B5424 28     mov     edx, dword ptr [esp+28]
004145A4  |.  25 FFFF0000   and     eax, 0FFFF
004145A9  |.  894424 34     mov     dword ptr [esp+34], eax
004145AD  |.  8D4424 2C     lea     eax, dword ptr [esp+2C]
004145B1  |.  81E1 FFFF0000 and     ecx, 0FFFF
004145B7  |.  81E2 FFFF0000 and     edx, 0FFFF
004145BD  |.  50            push    eax                                         ; /timeptr
004145BE  |.  894C24 34     mov     dword ptr [esp+34], ecx                     ; |
004145C2  |.  895424 30     mov     dword ptr [esp+30], edx                     ; |
004145C6  |.  FF15 A0914100 call    dword ptr [<&MSVCRT.mktime>]                ; \mktime
004145CC  |.  83C4 04       add     esp, 4
004145CF  |.  83F8 FF       cmp     eax, -1
004145D2  |.  75 18         jnz     short 004145EC
004145D4  |.  68 24D54100   push    0041D524                                    ;  无法转换新日期为 utc 格式 :(
004145D9  |.  55            push    ebp
004145DA  |.  E8 C1FDFEFF   call    004043A0
004145DF  |.  83C4 08       add     esp, 8
004145E2  |.  33C0          xor     eax, eax
004145E4  |.  5F            pop     edi
004145E5  |.  5E            pop     esi
004145E6  |.  5D            pop     ebp
004145E7  |.  5B            pop     ebx
004145E8  |.  83C4 40       add     esp, 40
004145EB  |.  C3            retn
004145EC  |>  8B0D A4914100 mov     ecx, dword ptr [<&MSVCRT._timezone>]        ;  MSVCRT._timezone
004145F2  |.  8B11          mov     edx, dword ptr [ecx]
004145F4  |.  2BC2          sub     eax, edx
004145F6  |.  8B15 68BC4100 mov     edx, dword ptr [41BC68]                     ;  LordPE_f.0041BCB0
004145FC  |.  50            push    eax
004145FD  |.  8D4424 14     lea     eax, dword ptr [esp+14]
00414601  |.  52            push    edx                                         ; |Format => "%08lX"
00414602  |.  50            push    eax                                         ; |s
00414603  |.  FF15 C0924100 call    dword ptr [<&USER32.wsprintfA>]             ; \wsprintfA
00414609  |.  83C4 0C       add     esp, 0C
0041460C  |.  8D4C24 10     lea     ecx, dword ptr [esp+10]
00414610  |.  51            push    ecx                                         ; /Text
00414611  |.  68 6F040000   push    46F                                         ; |ControlID = 46F (1135.)
00414616  |.  55            push    ebp                                         ; |hWnd
00414617  |.  FF15 0C924100 call    dword ptr [<&USER32.SetDlgItemTextA>]       ; \SetDlgItemTextA
0041461D  |.  5F            pop     edi
0041461E  |.  5E            pop     esi
0041461F  |.  5D            pop     ebp
00414620  |.  B8 01000000   mov     eax, 1
00414625  |.  5B            pop     ebx
00414626  |.  83C4 40       add     esp, 40
00414629  |.  C3            retn
0041462A  |>  8D5424 10     lea     edx, dword ptr [esp+10]
0041462E  |.  6A 09         push    9                                           ; /Count = 9
00414630  |.  52            push    edx                                         ; |Buffer
00414631  |.  68 6F040000   push    46F                                         ; |ControlID = 46F (1135.)
00414636  |.  55            push    ebp                                         ; |hWnd
00414637  |.  FF15 10924100 call    dword ptr [<&USER32.GetDlgItemTextA>]       ; \得到"戳编辑框"的内容(该函数调用失败返回0,成功则返回字符数)
0041463D  |.  85C0          test    eax, eax
0041463F  |.  75 18         jnz     short 00414659                              ;  返回不是0就是成功了
00414641  |.  68 00D54100   push    0041D500                                    ;  请输入一个日期时间标志值!
00414646  |.  55            push    ebp
00414647  |.  E8 54FDFEFF   call    004043A0
0041464C  |.  83C4 08       add     esp, 8
0041464F  |.  33C0          xor     eax, eax
00414651  |.  5F            pop     edi
00414652  |.  5E            pop     esi
00414653  |.  5D            pop     ebp
00414654  |.  5B            pop     ebx
00414655  |.  83C4 40       add     esp, 40
00414658  |.  C3            retn
00414659  |>  8D4424 54     lea     eax, dword ptr [esp+54]                     ;  一个定值
0041465D  |.  8D4C24 10     lea     ecx, dword ptr [esp+10]                     ;  我们给出的戳
00414661  |.  50            push    eax
00414662  |.  51            push    ecx
00414663  |.  E8 88D2FEFF   call    004018F0           
注释:
进去追踪了下,有个循环遍历了我传进去的时间日期戳
函数的功能如下                         ;
ecx指向的字符串转换为数字,然后放到eax指向的堆栈的一个变量x中
00414668  |.  8D5424 5C     lea     edx, dword ptr [esp+5C]                     ;  edx=x
0041466C  |.  52            push    edx                                         ; /timet
0041466D  |.  FF15 90914100 call    dword ptr [<&MSVCRT.gmtime>]                ; \gmtime
原来这个便是时间日期戳转换为时间日期的函数了,该函数需要一个long型的时间日期戳,返回一个time_t结构。
如果早就知道用这个函数可以把日期戳转换为日期的话我就不会来跟OD的代码了,不过也算练练手吧
00414673  |.  83C4 0C       add     esp, 0C
00414676  |.  85C0          test    eax, eax
00414678  |.  0F84 84000000 je      00414702
0041467E  |.  66:8B48 0C    mov     cx, word ptr [eax+C]
00414682  |.  66:894C24 22  mov     word ptr [esp+22], cx
00414687  |.  66:8B50 18    mov     dx, word ptr [eax+18]
0041468B  |.  66:895424 20  mov     word ptr [esp+20], dx
00414690  |.  66:8B48 08    mov     cx, word ptr [eax+8]
00414694  |.  66:894C24 24  mov     word ptr [esp+24], cx
00414699  |.  66:C74424 2A >mov     word ptr [esp+2A], 0
004146A0  |.  66:8B50 04    mov     dx, word ptr [eax+4]
004146A4  |.  66:895424 26  mov     word ptr [esp+26], dx
004146A9  |.  66:8B48 10    mov     cx, word ptr [eax+10]
004146AD  |.  66:41         inc     cx
004146AF  |.  66:894C24 1E  mov     word ptr [esp+1E], cx
004146B4  |.  66:8B10       mov     dx, word ptr [eax]
004146B7  |.  8D4C24 1C     lea     ecx, dword ptr [esp+1C]
004146BB  |.  66:895424 28  mov     word ptr [esp+28], dx
004146C0  |.  66:8B40 14    mov     ax, word ptr [eax+14]
上面一看就知道是Fill struct之类的东西了
004146C4  |.  51            push    ecx                                         ; /lParam
004146C5  |.  6A 00         push    0                                           ; |wParam = 0
004146C7  |.  68 02100000   push    1002                                        ; |Message = MSG(1002)
004146CC  |.  66:05 6C07    add     ax, 76C                                     ; |
004146D0  |.  56            push    esi                                         ; |hWnd
004146D1  |.  8B35 AC924100 mov     esi, dword ptr [<&USER32.SendMessageA>]     ; |USER32.SendMessageA
004146D7  |.  66:894424 2C  mov     word ptr [esp+2C], ax                       ; |
004146DC  |.  FFD6          call    esi                                         ; \SendMessageA
004146DE  |.  85C0          test    eax, eax
004146E0  |.  74 20         je      short 00414702
004146E2  |.  8D5424 1C     lea     edx, dword ptr [esp+1C]
004146E6  |.  52            push    edx                                         ; /lParam
004146E7  |.  6A 00         push    0                                           ; |wParam = 0
004146E9  |.  68 02100000   push    1002                                        ; |Message = MSG(1002)
004146EE  |.  53            push    ebx                                         ; |hWnd
004146EF  |.  FFD6          call    esi                                         ; \SendMessageA
注释:
上面调用了两次SendMessage,MSG参数是0x1002,我查了查WINUSER.H头文件,这个消息是:SPI_GETMENUANIMATION
觉得好像不太搭,但是从以上的参数压入中,有push ebx 和push esi 可以看出,这个sendmessage是有关对两个编辑框的操控的
(不然不会用到编辑框的窗口句柄的)
于是我觉得应该是将转换好的内容放到里面去
004146F1  |.  85C0          test    eax, eax
004146F3  |.  74 0D         je      short 00414702
004146F5  |.  5F            pop     edi
004146F6  |.  5E            pop     esi
004146F7  |.  5D            pop     ebp
004146F8  |.  B8 01000000   mov     eax, 1
004146FD  |.  5B            pop     ebx
004146FE  |.  83C4 40       add     esp, 40
00414701  |.  C3            retn
00414702  |>  68 C8D44100   push    0041D4C8
00414707  |.  55            push    ebp
00414708  |.  E8 93FCFEFF   call    004043A0
0041470D  |.  83C4 08       add     esp, 8
00414710  |.  33C0          xor     eax, eax
00414712  |.  5F            pop     edi
00414713  |.  5E            pop     esi
00414714  |.  5D            pop     ebp
00414715  |.  5B            pop     ebx
00414716  |.  83C4 40       add     esp, 40
00414719  \.  C3            retn


在分析的过程中我用了下Resource Hacker,这个工具挺好,能让我知道哪个控件ID对应哪个控件。



发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

hexi7164 发表于 2012-8-2 18:47
这个不错 很好
Chenxs110 发表于 2012-8-13 16:05
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 08:15

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表