最近需要写一个统计系统开机时间的小工具,类似360开机小助手的东西。遇到的问题是不知道什么点算是系统已经启动了。在网上没找到相关资料,只有一些小程序,于是就想看看它们都怎么做的。
搞编程好几年了但没搞过反汇编~~
网上下了IDA,破解版的,这里的大侠别鄙视我哈,待这个问题解决了说不定就去买一份正版。
第一次在这里发帖不知道附件是否上传了。
程序名称:BootTimer.exe
先说下这个程序运行后的效果吧:
1 双击运行后它先将自己加在run键下,以便开机后自启动。
2 弹出messagebox询问需要重启,问是否现在重启,选择Yes则立即重启。
3 重启后它会统计开机时间,在这期间它提示不要使用鼠标和键盘。
目前我大概招到了它开始统计时间的代码,但是看不懂~~,恳请这里的大侠有空的话帮忙分析一下~~
下面是大概的代码,旁边汉字是我的注释,可能不对,各位见笑啦~~
; int __cdecl main(int argc, const char **argv, const char **envp)
_main proc near
var_5C= qword ptr -5Ch
var_3D= byte ptr -3Dh
hKey= dword ptr -3Ch
var_38= dword ptr -38h
phkResult= dword ptr -34h
var_30= dword ptr -30h
var_2C= byte ptr -2Ch
var_C= dword ptr -0Ch
var_4= dword ptr -4
argc= dword ptr 4
argv= dword ptr 8
envp= dword ptr 0Ch
push 0FFFFFFFFh
push offset loc_416FE8
mov eax, large fs:0 ; 可能是GetCurrentProcess or GetCurrentThread
push eax
sub esp, 34h ; 可能是取注册表的值,Run
push ebx
push ebp
push esi
push edi
mov eax, dword_41D3D4 ; 应该是取一个全局量
xor eax, esp
push eax
lea eax, [esp+54h+var_C]
mov large fs:0, eax ; 应该是错误处理函数地址
mov eax, [esp+54h+argv]
xor ebx, ebx
cmp [eax+4], ebx
mov [esp+54h+var_38], ebx
mov [esp+54h+var_30], ebx
mov [esp+54h+var_3D], 1 ; 这里应该是判断是否是开机重启后运行,如果是则跳转到开机
统计时间的地方执行
jnz
Calculate_OSBootTime ;这个名字是我自己改的
;这里我的判断依据是下面有IDA给出的注
; 册表Run键值的提示
_main+43 push 104h ; unsigned int
_main+48 call j_??2@YAPAXI@Z ; operator new(uint)
_main+4D add esp, 4
_main+50 push 104h ; nSize
_main+55 mov esi, eax
_main+57 push esi ; lpFilename
_main+58 push ebx ; hModule
_main+59 call ds:GetModuleFileNameA
_main+5F mov eax, esi
_main+61 add eax, 0FFFFFFFFh
_main+64
_main+64 loc_402484: ; CODE XREF: _main+6Cj
_main+64 mov cl, [eax+1]
_main+67 add eax, 1
_main+6A cmp cl, bl
_main+6C jnz short loc_402484
_main+6E mov ecx, ds:dword_4186FC
_main+74 mov [eax], ecx
_main+76 mov dx, ds:word_418700
_main+7D mov [eax+4], dx
_main+81 lea eax, [esp+54h+hKey]
_main+85 push eax ; phkResult
_main+86 push offset aSoftwareMicros ; "SOFTWARE\\Microsoft\\Windows\\CurrentVersi"...
_main+8B push 80000002h ; hKey
_main+90 mov [esp+60h+hKey], ebx
_main+94 call ds:RegOpenKeyA
_main+9A cmp eax, ebx
_main+9C jnz short loc_4024EE
_main+9E mov eax, esi
_main+A0 lea edx, [eax+1]
_main+A3
_main+A3 loc_4024C3: ; CODE XREF: _main+AAj
_main+A3 mov cl, [eax]
_main+A5 add eax, 1
_main+A8 cmp cl, bl
_main+AA jnz short loc_4024C3
_main+AC mov ecx, [esp+54h+hKey]
_main+B0 sub eax, edx
_main+B2 push eax ; cbData
_main+B3 push esi ; lpData
_main+B4 push 1 ; dwType
_main+B6 push ebx ; Reserved
_main+B7 push offset aWinbooter ; "WinBooter"
_main+BC push ecx ; hKey
_main+BD call ds:RegSetValueExA
_main+C3 mov edx, [esp+54h+hKey]
_main+C7 push edx ; hKey
_main+C8 call ds:RegCloseKey
_main+CE
_main+CE loc_4024EE: ; CODE XREF: _main+9Cj
_main+CE push 64h ; unsigned int
_main+D0 call j_??2@YAPAXI@Z ; operator new(uint)
_main+D5 push 19h ; unsigned int
_main+D7 mov esi, eax
_main+D9 call j_??2@YAPAXI@Z ; operator new(uint)
_main+DE push offset aWindowsHasToRe ; "Windows has to reboot to measure boot t"...
_main+E3 push esi ; char *
_main+E4 mov edi, eax
_main+E6 call _sprintf
_main+EB push offset aWindowsBootTim ; " WINDOWS BOOT TIME UTILITY "
_main+F0 push edi ; char *
_main+F1 call _sprintf
_main+F6 mov ebp, ds:MessageBoxA
_main+FC add esp, 18h
_main+FF push 1004h ; uType
_main+104 push edi ; lpCaption
_main+105 push esi ; lpText
_main+106 push ebx ; hWnd
_main+107 call ebp ; MessageBoxA
_main+109 cmp eax, 6
; 如果用户选择了No则跳转到 loc_402535处
_main+10C jnz short Select_NO
_main+10E call sub_402280
_main+113 jmp short Calculate_OSBootTime
_main+115 ; ---------------------------------------------------------------------------
_main+115
_main+115 Select_NO: ; CODE XREF: _main+10Cj
_main+115 push offset aTheBootTimeUti ; "The boot time utility will launch the n"...
_main+11A push esi ; char *
_main+11B call _sprintf
_main+120 add esp, 8
_main+123 push 1000h ; uType
_main+128 push edi ; lpCaption
_main+129 push esi ; lpText
_main+12A push ebx ; hWnd
_main+12B call ebp ; MessageBoxA
这下面应该就是开机后开始计算开机时间了,因为下面有开机后看到的字串
“Please wait”
“IMPORTANT: Do not use mouse or keyboard”
接下来是在什么时间点开机统计的我现在不会搞了,功力不够,恳请大家帮忙~~
_main+12D Calculate_OSBootTime: ; CODE XREF: _main+3Dj
_main+12D ; _main+113j
_main+12D mov eax, [esp+54h+argv]
_main+131 mov esi, [eax+4]
_main+134 cmp esi, ebx
_main+136 jz loc_40297A
_main+13C mov edi, offset aRun ; "/run"
_main+141 mov ecx, 5
_main+146 xor edx, edx ; 比较是否为/run,不是则跳转
_main+148 repe cmpsb
_main+14A jnz loc_40297A
_main+150 lea ecx, [esp+54h+var_2C]
_main+154 call sub_4010E0
_main+159 push offset aPleaseWait____ ; "Please wait...."
_main+15E push offset unk_41E7F8
_main+163 mov [esp+5Ch+var_4], ebx
_main+167 call sub_402070
_main+16C add esp, 8
_main+16F mov esi, eax
_main+171 push 0Ah
_main+173 mov ecx, esi
_main+175 call sub_402300
_main+17A mov ecx, esi
_main+17C call sub_401EC0
_main+181 push offset aImportantDoNot ; "IMPORTANT: Do not use mouse or keyboard"...
_main+186 push offset unk_41E7F8
_main+18B call sub_402070
_main+190 add esp, 8
_main+193 mov esi, eax
_main+195 push 0Ah
_main+197 mov ecx, esi
_main+199 call sub_402300
_main+19E mov ecx, esi
_main+1A0 call sub_401EC0
_main+1A5 mov esi, ds:GetTickCount
_main+1AB mov ebp, ds:Sleep
_main+1B1
后面的代码就不贴了,大家可以从附件下载这个程序。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课