好友
阅读权限10
听众
最后登录1970-1-1
|
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对应哪个控件。
|
|