首页
社区
课程
招聘
[旧帖] [求助]破解一个统计开机启动时间的小程序,关键地方找到了但是看不懂。 0.00雪花
发表于: 2013-2-28 15:46 1966

[旧帖] [求助]破解一个统计开机启动时间的小程序,关键地方找到了但是看不懂。 0.00雪花

2013-2-28 15:46
1966
最近需要写一个统计系统开机时间的小工具,类似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直播授课

上传的附件:
收藏
免费 0
支持
分享
最新回复 (2)
雪    币:
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
我想从这个程序开始学习反汇编,欢迎各位初学者一起学习。我QQ: 362 703 111
2013-2-28 15:52
0
雪    币:
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
lea     ecx, [esp+54h+var_2C]
call    sub_4010E0
push    offset aPleaseWait____ ; "Please wait....",这是重启后控制台窗口显示的内容
push    offset unk_41E7F8
mov     [esp+5Ch+var_4], ebx
call    sub_402070
add     esp, 8
mov     esi, eax
push    0Ah
mov     ecx, esi
call    sub_402300
mov     ecx, esi
call    sub_401EC0
push    offset aImportantDoNot ; "IMPORTANT: Do not use mouse or keyboard"...
                                                     这是重启后控制台窗口显示的内容,接下来会过一会就显示出统计的开机启动时间
push    offset unk_41E7F8
call    sub_402070
add     esp, 8
mov     esi, eax
push    0Ah
mov     ecx, esi
call    sub_402300
mov     ecx, esi
call    sub_401EC0
mov     esi, ds:GetTickCount
mov     ebp, ds:Sleep

loc_4025D1:
push    ebx
lea     ecx, [esp+58h+var_2C]
call    sub_401450
cmp     eax, 5Eh
jle     short loc_4025F8

mov     eax, [esp+54h+var_38]
add     eax, 1
cmp     eax, 1
mov     [esp+54h+var_38], eax
jnz     short loc_4025FE

call    esi ; GetTickCount   在这里已经开始读取这个工具认为的系统启动结束的时间了。
mov     [esp+54h+var_30], eax
jmp     short loc_402607
2013-2-28 16:39
0
游客
登录 | 注册 方可回帖
返回
//