首页
社区
课程
招聘
[求助]一个8字节16进制字符串转日期时间函数,后半段不懂,求帮助。
2013-5-24 11:49 7833

[求助]一个8字节16进制字符串转日期时间函数,后半段不懂,求帮助。

2013-5-24 11:49
7833
小弟初学者,最近逆向一个DLL 下面一段函数功能应该是把8字节的16进制字符串转换成 14字节的日期时间 YYYYMMDDHHSSss 但有些地方实在弄不懂。请前辈们指点一下
这是函数的调用部分……
push    0Eh                        ;输出结果长度 14字节
lea     edx, [ebp+var_A3]        ;存放输出结果变量
push    edx
push    8                        ;输入参数长度
lea     eax, [ebp+var_58]        ;输入参数
push    eax
mov     ecx, [ebp+var_4]        ;这个参数不清楚是什么
call    sub_100010AF                       

sub_100010AF proc near
jmp     sub_100025E0
sub_100010AF endp

下面是函数。
.text:100025E0 ; =============== S U B R O U T I N E =======================================
.text:100025E0
.text:100025E0 ; Attributes: bp-based frame
.text:100025E0
.text:100025E0 ; int __stdcall sub_100025E0(void *Src, size_t Size, int, size_t Count)
.text:100025E0 sub_100025E0    proc near               ; CODE XREF: sub_100010AFj
.text:100025E0
.text:100025E0 var_AC          = byte ptr -0ACh
.text:100025E0 var_6C          = dword ptr -6Ch
.text:100025E0 var_68          = dword ptr -68h
.text:100025E0 var_64          = dword ptr -64h
.text:100025E0 var_60          = byte ptr -60h
.text:100025E0 var_5C          = byte ptr -5Ch
.text:100025E0 var_58          = dword ptr -58h
.text:100025E0 var_54          = dword ptr -54h
.text:100025E0 Format          = byte ptr -50h
.text:100025E0 Dst             = byte ptr -48h
.text:100025E0 var_4           = dword ptr -4
.text:100025E0 Src             = dword ptr  8
.text:100025E0 Size            = dword ptr  0Ch
.text:100025E0 arg_8           = dword ptr  10h
.text:100025E0 Count           = dword ptr  14h
.text:100025E0
.text:100025E0                 push    ebp
.text:100025E1                 mov     ebp, esp
.text:100025E3                 sub     esp, 0ACh
.text:100025E9                 push    ebx
.text:100025EA                 push    esi
.text:100025EB                 push    edi
.text:100025EC                 push    ecx
.text:100025ED                 lea     edi, [ebp+var_AC]
.text:100025F3                 mov     ecx, 2Bh
.text:100025F8                 mov     eax, 0CCCCCCCCh
.text:100025FD                 rep stosd
.text:100025FF                 pop     ecx
.text:10002600                 mov     [ebp+var_4], ecx
.text:10002603                 push    41h             ; Size
.text:10002605                 push    0               ; Val
.text:10002607                 lea     eax, [ebp+Dst]
.text:1000260A                 push    eax             ; Dst
.text:1000260B                 call    memset
.text:10002610                 add     esp, 0Ch
.text:10002613                 mov     ecx, [ebp+Size]
.text:10002616                 push    ecx             ; Size
.text:10002617                 mov     edx, [ebp+Src]
.text:1000261A                 push    edx             ; Src
.text:1000261B                 lea     eax, [ebp+Dst]
.text:1000261E                 push    eax             ; Dst
.text:1000261F                 call    memcpy
.text:10002624                 add     esp, 0Ch
.text:10002627                 mov     esi, esp
.text:10002629                 lea     ecx, [ebp+Dst]
.text:1000262C                 push    ecx             ; Str
.text:1000262D                 call    ds:_strupr
.text:10002633                 add     esp, 4
.text:10002636                 cmp     esi, esp
.text:10002638                 call    _chkesp
.text:1000263D                 movsx   edx, [ebp+Dst]
.text:10002641                 cmp     edx, 41h                                                        ;是否大于 41H(A)
.text:10002644                 jge     short loc_10002658                                       
.text:10002646                 movsx   eax, [ebp+Dst]                                                ;否
.text:1000264A                 sub     eax, 30h                                                        ;减30H
.text:1000264D                 mov     [ebp+var_54], eax                                        ;结果放入ebp+var_54
.text:10002650                 mov     ecx, [ebp+var_54]
.text:10002653                 mov     [ebp+var_64], ecx                                        ;结果放入ebp+var_64
.text:10002656                 jmp     short loc_10002668
.text:10002658 ; ---------------------------------------------------------------------------
.text:10002658
.text:10002658 loc_10002658:                           ; CODE XREF: sub_100025E0+64j
.text:10002658                 movsx   edx, [ebp+Dst]                                                ;是
.text:1000265C                 sub     edx, 37h                                                        ;减37H
.text:1000265F                 mov     [ebp+var_54], edx                                        ;结果放入ebp+var_54
.text:10002662                 mov     eax, [ebp+var_54]
.text:10002665                 mov     [ebp+var_64], eax                                        ;结果放入ebp+var_64
.text:10002668
.text:10002668 loc_10002668:                           ; CODE XREF: sub_100025E0+76j
.text:10002668                 mov     [ebp+var_58], 1                                                ;计数器
.text:1000266F                 jmp     short loc_1000267A                                       
.text:10002671 ; ---------------------------------------------------------------------------
.text:10002671
.text:10002671 loc_10002671:                           ; CODE XREF: sub_100025E0:loc_100026C7j
.text:10002671                 mov     ecx, [ebp+var_58]
.text:10002674                 add     ecx, 1                                                        ;计数器+1
.text:10002677                 mov     [ebp+var_58], ecx
.text:1000267A
.text:1000267A loc_1000267A:                           ; CODE XREF: sub_100025E0+8Fj
.text:1000267A                 mov     edx, [ebp+var_58]
.text:1000267D                 cmp     edx, [ebp+Size]                                                ;比较计数器和字串长度
.text:10002680                 jge     short loc_100026C9                                        ;大于等于 跳出
.text:10002682                 mov     eax, [ebp+var_58]
.text:10002685                 movsx   ecx, [ebp+eax+Dst]
.text:1000268A                 cmp     ecx, 41h                                                        ;是否大于 41H(A)
.text:1000268D                 jge     short loc_100026AC
.text:1000268F                 mov     edx, [ebp+var_54]                                        ;否,取上轮结果
.text:10002692                 shl     edx, 4                                                        ;左移4位
.text:10002695                 mov     eax, [ebp+var_58]                                        ;计数器放入 EAX
.text:10002698                 movsx   ecx, [ebp+eax+Dst]                                        ;读字串的第 EAX位 到ECX
.text:1000269D                 lea     edx, [edx+ecx-30h]                                        ;EDX=上轮结果+ECX(读字串的第 EAX位)-30H
.text:100026A1                 mov     [ebp+var_54], edx                                        ;结果放入ebp+var_54
.text:100026A4                 mov     eax, [ebp+var_54]
.text:100026A7                 mov     [ebp+var_68], eax                                        ;结果放入ebp+var_68
.text:100026AA                 jmp     short loc_100026C7
.text:100026AC ; ---------------------------------------------------------------------------
.text:100026AC
.text:100026AC loc_100026AC:                           ; CODE XREF: sub_100025E0+ADj
.text:100026AC                 mov     ecx, [ebp+var_54]                                        ;是,取上轮结果
.text:100026AF                 shl     ecx, 4                                                        ;左移4位
.text:100026B2                 mov     edx, [ebp+var_58]                                        ;计数器放入 EDX
.text:100026B5                 movsx   eax, [ebp+edx+Dst]                                        ;读字串的第 EDX位 到EAX
.text:100026BA                 lea     ecx, [ecx+eax-37h]                                        ;ECX=上轮结果+EAX(读字串的第 EDX位)-37H
.text:100026BE                 mov     [ebp+var_54], ecx
.text:100026C1                 mov     edx, [ebp+var_54]                                        ;结果放入ebp+var_54
.text:100026C4                 mov     [ebp+var_68], edx                                        ;结果放入ebp+var_68
.text:100026C7
.text:100026C7 loc_100026C7:                           ; CODE XREF: sub_100025E0+CAj
.text:100026C7                 jmp     short loc_10002671                                        ;跳转至循环开始
.text:100026C9 ; ---------------------------------------------------------------------------
.text:100026C9
上面一部分 如果我分析的没错的话,应该是把十六进制字符串,转换成十进制数
取一字节十六进制字串,如果ASCII值大于 41H(A)则减 37H 否则减 30H  之后结果左移四位,再与下一字节减30H或37H进行累加
直到字串尾

但是下面这段就看不懂了。  主要是 CWnd::CWnd(void)  和  CComboBox::FindStringExact(int,char const *) 不懂 请高人指点一下。 谢谢。                                   
.text:100026C9 loc_100026C9:                           ; CODE XREF: sub_100025E0+A0j
.text:100026C9                 mov     eax, [ebp+var_54]
.text:100026CC                 push    eax
.text:100026CD                 lea     ecx, [ebp+var_5C]
.text:100026D0                 call    ??0CWnd@@QAE@XZ ; CWnd::CWnd(void)  
.text:100026D5                 mov     esi, esp
.text:100026D7                 mov     ecx, [ebp+Count]
.text:100026DA                 push    ecx
.text:100026DB                 push    offset a0Ds     ; "%%0%ds"
.text:100026E0                 lea     edx, [ebp+Format]
.text:100026E3                 push    edx             ; Dest
.text:100026E4                 call    ds:sprintf
.text:100026EA                 add     esp, 0Ch
.text:100026ED                 cmp     esi, esp
.text:100026EF                 call    _chkesp
.text:100026F4                 push    offset aYMDHMS  ; "%Y%m%d%H%M%S"
.text:100026F9                 lea     eax, [ebp+var_60]
.text:100026FC                 push    eax
.text:100026FD                 lea     ecx, [ebp+var_5C]
.text:10002700                 call    ?FindStringExact@CComboBox@@QBEHHPBD@Z ; CComboBox::FindStringExact(int,char const *)
.text:10002705                 mov     [ebp+var_6C], eax
.text:10002708                 mov     esi, esp
.text:1000270A                 mov     ecx, [ebp+var_6C]
.text:1000270D                 mov     edx, [ecx]
.text:1000270F                 push    edx
.text:10002710                 lea     eax, [ebp+Format]
.text:10002713                 push    eax             ; Format
.text:10002714                 mov     ecx, [ebp+Count]
.text:10002717                 push    ecx             ; Count
.text:10002718                 mov     edx, [ebp+arg_8]
.text:1000271B                 push    edx             ; Dest
.text:1000271C                 call    ds:_snprintf
.text:10002722                 add     esp, 10h
.text:10002725                 cmp     esi, esp
.text:10002727                 call    _chkesp
.text:1000272C                 lea     ecx, [ebp+var_60]
.text:1000272F                 call    ??1CTreeView@@UAE@XZ ; CTreeView::~CTreeView(void)
.text:10002734                 mov     eax, [ebp+var_54]
.text:10002737                 pop     edi
.text:10002738                 pop     esi
.text:10002739                 pop     ebx
.text:1000273A                 add     esp, 0ACh
.text:10002740                 cmp     ebp, esp
.text:10002742                 call    _chkesp
.text:10002747                 mov     esp, ebp
.text:10002749                 pop     ebp
.text:1000274A                 retn    10h
.text:1000274A sub_100025E0    endp

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
打赏
分享
最新回复 (6)
雪    币: 2252
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
goldsuncxc 2013-5-24 12:49
2
0
初学,关注中
雪    币: 177
活跃值: (31)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
sunless 2013-5-24 17:01
3
0
CWnd::CWnd(void)   查不到资料。
CComboBox::FindStringExact(int,char const *) 好像是从combobox中查找字串。
真晕……
雪    币: 204
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
水流花谢 2013-5-24 17:52
4
0
ext:100026D7                 mov     ecx, [ebp+Count]
.text:100026DA                 push    ecx
.text:100026DB                 push    offset a0Ds     ; "%%0%ds"
.text:100026E0                 lea     edx, [ebp+Format]
.text:100026E3                 push    edx             ; Dest
.text:100026E4                 call    ds:sprintf           ; 如果[ebp+Count]的值是8出来的结果就是%08s
                                                                            ; [ebp+Count]实际指定了后面字符串的宽度
.text:100026EA                 add     esp, 0Ch
.text:100026ED                 cmp     esi, esp
.text:100026EF                 call    _chkesp
.text:100026F4                 push    offset aYMDHMS  ; "%Y%m%d%H%M%S"
.text:100026F9                 lea     eax, [ebp+var_60]
.text:100026FC                 push    eax
.text:100026FD                 lea     ecx, [ebp+var_5C]
.text:10002700                 call    ?FindStringExact@CComboBox@@QBEHHPBD@Z ; CComboBox::FindStringExact(int,char const *)                            ; MSDN很明确知道这个函数
.text:10002705                 mov     [ebp+var_6C], eax
.text:10002708                 mov     esi, esp
.text:1000270A                 mov     ecx, [ebp+var_6C]       ;combobox中找到的串按照%0?d输出
.text:1000270D                 mov     edx, [ecx]
.text:1000270F                 push    edx
.text:10002710                 lea     eax, [ebp+Format]
.text:10002713                 push    eax             ; Format
.text:10002714                 mov     ecx, [ebp+Count]
.text:10002717                 push    ecx             ; Count
.text:10002718                 mov     edx, [ebp+arg_8]
.text:1000271B                 push    edx             ; Dest
.text:1000271C                 call    ds:_snprintf

大概来讲,这后半段就是做了一个格式化,应该还有其他的代码
雪    币: 177
活跃值: (31)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
sunless 2013-5-24 22:55
5
0
感谢楼上朋友。  是的,这是整个字串函数处理的一个子函数。  表面上看应该就是输出 14位的日期时间。
另外  
.text:100026C9 loc_100026C9:                           ; CODE XREF: sub_100025E0+A0j
.text:100026C9                 mov     eax, [ebp+var_54]
.text:100026CC                 push    eax
.text:100026CD                 lea     ecx, [ebp+var_5C]
.text:100026D0                 call    ??0CWnd@@QAE@XZ ; CWnd::CWnd(void)  
这段是查找窗口句柄?   [ebp+var_54] 应该是 8位16进制数转换成十进制后的结果 。
雪    币: 177
活跃值: (31)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
sunless 2013-5-26 09:58
6
0
看来还真没愿意回答这么初级的问题。
雪    币: 177
活跃值: (31)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
sunless 2013-5-30 07:47
7
0
还是没搞定...
游客
登录 | 注册 方可回帖
返回