首页
社区
课程
招聘
[旧帖] [讨论]函数GetSystemTimeAsFileTime调用后返回参数在哪个寄存器? 0.00雪花
发表于: 2012-2-29 10:00 5012

[旧帖] [讨论]函数GetSystemTimeAsFileTime调用后返回参数在哪个寄存器? 0.00雪花

2012-2-29 10:00
5012
有一个软件,嗅探是由Microsoft Visual Studio .NET 2005 -- 2008 (应该是MFC)编写的,其保护机制是日期限制,超过2011年即不能运行,将弹出对话框“软件已过期……”,找到这个字符串地址和相关代码:
:004091B7 85F6                    test esi, esi
:004091B9 7474                    je 0040922F                (将此处的7474改成EB74,直接爆破)
:004091BB E83AE80300              call 004479FA
:004091C0 33C9                    xor ecx, ecx
:004091C2 85C0                    test eax, eax
:004091C4 0F95C1                  setne cl
:004091C7 85C9                    test ecx, ecx
:004091C9 750A                    jne 004091D5
:004091CB 6805400080              push 80004005
:004091D0 E8BB8FFFFF              call 00402190
:004091D5 8B10                    mov edx, dword ptr [eax]
:004091D7 8BC8                    mov ecx, eax
:004091D9 8B420C                  mov eax, dword ptr [edx+0C]
:004091DC FFD0                    call eax
:004091DE 83C010                  add eax, 00000010
:004091E1 89442414                mov dword ptr [esp+14], eax
:004091E5 83FE01                  cmp esi, 00000001
:004091E8 C784243C06000000000000  mov dword ptr [esp+0000063C], 00000000
:004091F3 7411                    je 00409206
:004091F5 83FE02                  cmp esi, 00000002
:004091F8 740C                    je 00409206
:004091FA 6860A84900              push 0049A860
:004091FF 8D4C2418                lea ecx, dword ptr [esp+18]
:00409203 51                      push ecx
:00409204 EB0A                    jmp 00409210
:00409206 68F8A74900              push 0049A7F8                (就是这个地址保存了字符串)
:0040920B 8D542418                lea edx, dword ptr [esp+18]
:0040920F 52                      push edx
:00409210 E86B93FFFF              call 00402580
:00409215 8B44241C                mov eax, dword ptr [esp+1C]
:00409219 83C408                  add esp, 00000008
:0040921C 6A00                    push 00000000
:0040921E 6A00                    push 00000000
:00409220 50                      push eax
:00409221 8BCD                    mov ecx, ebp
:00409223 E8398B0300              call 00441D61
:00409228 6A00                    push 00000000
:0040922A E8C7470500              call 0045D9F6
:0040922F 8B8C2434060000          mov ecx, dword ptr [esp+00000634]
:00409236 64890D00000000          mov dword ptr fs:[00000000], ecx
:0040923D 59                      pop ecx
:0040923E 5F                      pop edi
:0040923F 5E                      pop esi
:00409240 5D                      pop ebp
:00409241 5B                      pop ebx
:00409242 8B8C241C060000          mov ecx, dword ptr [esp+0000061C]
:00409249 33CC                    xor ecx, esp
:0040924B E803360500              call 0045C853
:00409250 81C42C060000            add esp, 0000062C
:00409256 C20C00                  ret 000C

直接爆破后,对话框不出现,正常工作界面出来后却发现功能不正常,可见简单的直接爆破是不行的。再看软件与日期时间的相关调用,
函数GetSystemTimeAsFileTime  取得系统时间为文件时间引起了注意,那么,这个函数在调用后各寄存器的状态如何呢?特别是返回的日期参数保存在哪个寄存器呢?知道了这个寄存器的话,那么就可以对其赋值,将2012改为2011从而满足软件正常运行的条件,软件代码中GetSystemTimeAsFileTime出场了两次:
一处是:

:0045E92E 55                      push ebp
:0045E92F 8BEC                    mov ebp, esp
:0045E931 51                      push ecx
:0045E932 51                      push ecx
:0045E933 8D45F8                  lea eax, dword ptr [ebp-08]
:0045E936 50                      push eax

* Reference To: KERNEL32.GetSystemTimeAsFileTime, Ord:01CAh
                                  |
:0045E937 FF1518714700            Call dword ptr [00477118]
:0045E93D 8B45F8                  mov eax, dword ptr [ebp-08]
:0045E940 8B4DFC                  mov ecx, dword ptr [ebp-04]
:0045E943 6A00                    push 00000000
:0045E945 050080C12A              add eax, 2AC18000
:0045E94A 6880969800              push 00989680
:0045E94F 81D1214E62FE            adc ecx, FE624E21
:0045E955 51                      push ecx
:0045E956 50                      push eax
:0045E957 E864990000              call 004682C0
:0045E95C 8B4D08                  mov ecx, dword ptr [ebp+08]
:0045E95F 85C9                    test ecx, ecx
:0045E961 7405                    je 0045E968
:0045E963 8901                    mov dword ptr [ecx], eax
:0045E965 895104                  mov dword ptr [ecx+04], edx
:0045E968 C9                      leave
:0045E969 C3                      ret

另一处是:

:00462DB3 55                      push ebp
:00462DB4 8BEC                    mov ebp, esp
:00462DB6 83EC10                  sub esp, 00000010
:00462DB9 A1745A4A00              mov eax, dword ptr [004A5A74]
:00462DBE 8365F800                and dword ptr [ebp-08], 00000000
:00462DC2 8365FC00                and dword ptr [ebp-04], 00000000
:00462DC6 53                      push ebx
:00462DC7 57                      push edi
:00462DC8 BF4EE640BB              mov edi, BB40E64E
:00462DCD 3BC7                    cmp eax, edi
:00462DCF BB0000FFFF              mov ebx, FFFF0000
:00462DD4 740D                    je 00462DE3
:00462DD6 85C3                    test ebx, eax
:00462DD8 7409                    je 00462DE3
:00462DDA F7D0                    not eax
:00462DDC A3785A4A00              mov dword ptr [004A5A78], eax
:00462DE1 EB60                    jmp 00462E43
:00462DE3 56                      push esi
:00462DE4 8D45F8                  lea eax, dword ptr [ebp-08]
:00462DE7 50                      push eax

* Reference To: KERNEL32.GetSystemTimeAsFileTime, Ord:01CAh
                                  |
:00462DE8 FF1518714700            Call dword ptr [00477118]
:00462DEE 8B75FC                  mov esi, dword ptr [ebp-04]
:00462DF1 3375F8                  xor esi, dword ptr [ebp-08]

* Reference To: KERNEL32.GetCurrentProcessId, Ord:0143h
                                  |
:00462DF4 FF1564724700            Call dword ptr [00477264]
:00462DFA 33F0                    xor esi, eax

* Reference To: KERNEL32.GetCurrentThreadId, Ord:0146h
                                  |
:00462DFC FF1598724700            Call dword ptr [00477298]
:00462E02 33F0                    xor esi, eax

* Reference To: KERNEL32.GetTickCount, Ord:01DFh
                                  |
:00462E04 FF15D0714700            Call dword ptr [004771D0]
:00462E0A 33F0                    xor esi, eax
:00462E0C 8D45F0                  lea eax, dword ptr [ebp-10]
:00462E0F 50                      push eax

* Reference To: KERNEL32.QueryPerformanceCounter, Ord:02A3h
                                  |
:00462E10 FF1574714700            Call dword ptr [00477174]
:00462E16 8B45F4                  mov eax, dword ptr [ebp-0C]
:00462E19 3345F0                  xor eax, dword ptr [ebp-10]
:00462E1C 33F0                    xor esi, eax
:00462E1E 3BF7                    cmp esi, edi
:00462E20 7507                    jne 00462E29
:00462E22 BE4FE640BB              mov esi, BB40E64F
:00462E27 EB0B                    jmp 00462E34

:00462E29 85F3                    test ebx, esi
:00462E2B 7507                    jne 00462E34
:00462E2D 8BC6                    mov eax, esi
:00462E2F C1E010                  shl eax, 10
:00462E32 0BF0                    or esi, eax
:00462E34 8935745A4A00            mov dword ptr [004A5A74], esi
:00462E3A F7D6                    not esi
:00462E3C 8935785A4A00            mov dword ptr [004A5A78], esi
:00462E42 5E                      pop esi

:00462E43 5F                      pop edi
:00462E44 5B                      pop ebx
:00462E45 C9                      leave
:00462E46 C3                      ret

从这两处代码都可以看到,有足够的代码空间执行设想中的对寄存器赋值操作。

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 181
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
:0045E94A 6880969800              push 00989680
改成
:0045E94A 68005A6202              push 02625A00

问题解决。
2012-2-29 14:31
0
雪    币: 181
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
知道为什么要改那一行吗?入栈的值是多少?
2012-3-2 00:10
0
雪    币: 200
活跃值: (29)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4

朋友,11年后我来回复你啊。我查到了那个函数的返回值保存在堆栈的变量空间里。具体过程我不知道,我是对比了CALL的前后栈图发现的。看你的代码,再对照我的代码,要说寄存器的话,那就是EAX和ECX二处保存的。

最后于 2023-2-8 22:25 被一无所有编辑 ,原因:
2023-2-8 22:23
0
游客
登录 | 注册 方可回帖
返回
//