小弟初学者,最近逆向一个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直播授课