Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 0000000077087DC0 | push rbx | ;Prolog
- 0000000077087DC2 | sub rsp,60 |
- 0000000077087DC6 | mov rax,qword ptr ds:[7718B3D0] | ;Canary
- 0000000077087DCD | xor rax,rsp |
- 0000000077087DD0 | mov qword ptr ss:[rsp+50],rax |
- 0000000077087DD5 | xor edx,edx | ;InputBuffer = 0
- 0000000077087DD7 | mov rbx,rcx | ;RBX = lpSystemPowerStatus
- 0000000077087DDA | lea r9,qword ptr ss:[rsp+30] | ;OutputBuffer = rsp+30h
- 0000000077087DDF | lea ecx,dword ptr ds:[rdx+5] | ;InformationLevel = 5 = SystemBatteryState
- 0000000077087DE2 | xor r8d,r8d | ;InputBufferLength = 0
- 0000000077087DE5 | mov dword ptr ss:[rsp+20],20 | ;OutputBufferLength = 20h
- 0000000077087DED | call qword ptr ds:[<&NtPowerInformation>] | ;NtPowerInformation(SystemBatteryState, NULL, 0, &out, 32)
- 0000000077087DF3 | test eax,eax |
- 0000000077087DF5 | js kernel32.770B26DE | ;Check return and set last error if failed
- 0000000077087DFB | xor eax,eax | ;Zero out SYSTEM_POWER_STATUS
- 0000000077087DFD | mov dword ptr ds:[rbx],eax |
- 0000000077087DFF | mov dword ptr ds:[rbx+4],eax |
- 0000000077087E02 | mov dword ptr ds:[rbx+8],eax |
- 0000000077087E05 | movzx eax,byte ptr ss:[rsp+31] | ;EAX = PSYSTEM_BATTERY_STATE.BatteryPresent
- 0000000077087E0A | mov byte ptr ds:[rbx],1 | ;SYSTEM_POWER_STATUS.ACLineStatus = PSYSTEM_BATTERY_STATE.BatteryPresent
- 0000000077087E0D | test al,al | ;Battery present
- 0000000077087E0F | jnz _BatteryPresent |
- ;NO BATTERY
- _BatteryPresent.AcOnLine:
- 0000000077087E15 | cmp byte ptr ss:[rsp+32],0 | ;Battery charging?
- 0000000077087E1A | jnz _BatteryCharging |
- _BatteryPresent.Charging:
- 0000000077087E20 | test al,al | ;BatteryPresent?
- 0000000077087E22 | jnz _BatteryPresent.Charging2 |
- ;NO CHARGING
- 0000000077087E24 | or byte ptr ds:[rbx+1],80 | Set bit7 (No battery) in BatteryFlag
- _BatteryPresent.Charging2:
- 0000000077087E28 | mov r8d,dword ptr ss:[rsp+38] | ;r8d = PSYSTEM_BATTERY_STATE.MaxCapacity
- 0000000077087E2D | mov byte ptr ds:[rbx+2],FF | ;SYSTEM_POWER_STATUS.BatteryLife = UNKNOWN
- 0000000077087E31 | test r8d,r8d | ;MaxCapacity != 0?
- 0000000077087E34 | jnz _MaxCapacityPresent |
- ;NO MAXCAPACITY
- _BatteryPresent.MaxCapacity:
- 0000000077087E3A | mov eax,dword ptr ss:[rsp+44] | ;eax = PSYSTEM_BATTERY_STATE.EstimatedTime
- 0000000077087E3E | mov dword ptr ds:[rbx+4],FFFFFFFF | ;BatteryLife = -1 (Unknown)
- 0000000077087E45 | mov dword ptr ds:[rbx+8],FFFFFFFF | ;BatteryLifePercent = -1 (Unknown)
- 0000000077087E4C | test eax,eax | ;EstimatedTime != 0?
- 0000000077087E4E | jnz _Times | ;To 770B2746 if Yes
- _TimesDone:
- 0000000077087E54 | mov eax,1 | ;Return value
- 0000000077087E59 | mov rcx,qword ptr ss:[rsp+50] | ;Canary check
- 0000000077087E5E | xor rcx,rsp |
- 0000000077087E61 | call kernel32.770A17A0 |
- 0000000077087E66 | add rsp,60 | ;Epilog
- 0000000077087E6A | pop rbx |
- 0000000077087E6B | ret |
- _BatteryPresent:
- 00000000770B26EC | cmp byte ptr ss:[rsp+30],0 | ;PSYSTEM_BATTERY_STATE.AcOnLine ?
- 00000000770B26F1 | jnz _BatteryPresent.AcOnLine |
- 00000000770B26F7 | mov byte ptr ds:[rbx],0 | ;SYSTEM_POWER_STATUS.AcLineStatus = 0
- 00000000770B26FA | jmp _BatteryPresent.AcOnLine |
- _BatteryCharging:
- 00000000770B26FF | or byte ptr ds:[rbx+1],8 | ;PSYSTEM_BATTERY_STATE.BatteryFlags |= Charging
- 00000000770B2703 | jmp _BatteryPresent.Charging |
- _MaxCapacityPresent:
- 00000000770B2708 | mov eax,dword ptr ss:[rsp+3C] | ;EAX = PSYSTEM_BATTERY_STATE.RemainingCapacity
- 00000000770B270C | cmp eax,r8d | ;PSYSTEM_BATTERY_STATE.RemainingCapacity <= PSYSTEM_BATTERY_STATE.MaxCapacity
- 00000000770B270F | jbe kernel32.770B2717 |
- 00000000770B2711 | mov byte ptr ds:[rbx+2],64 | ;SYSTEM_POWER_STATUS.BatteryLifePercent = 100
- 00000000770B2715 | jmp _BatteryLifeDone |
- 00000000770B2717 | imul eax,eax,64 | ;EAX = PSYSTEM_BATTERY_STATE.RemainingCapacity*100
- 00000000770B271A | mov ecx,r8d | ;RCX = PSYSTEM_BATTERY_STATE.MaxCapacity
- 00000000770B271D | xor edx,edx | ;RDX = 0
- 00000000770B271F | shr ecx,1 | ;ECX = PSYSTEM_BATTERY_STATE.MaxCapacity/2
- 00000000770B2721 | add eax,ecx | ;EAX = PSYSTEM_BATTERY_STATE.RemainingCapacity*100 + PSYSTEM_BATTERY_STATE.MaxCapacity/2
- 00000000770B2723 | div r8d | ;EAX = Ceil(PSYSTEM_BATTERY_STATE.RemainingCapacity*100 / PSYSTEM_BATTERY_STATE.MaxCapacity)
- 00000000770B2726 | mov byte ptr ds:[rbx+2],al | ;SYSTEM_POWER_STATUS.BatteryLifePercent = AL
- _BatteryLifeDone :
- 00000000770B2729 | movzx eax,byte ptr ds:[rbx+2] | ;EAX = SYSTEM_POWER_STATUS.BatteryLifePercent
- 00000000770B272D | cmp al,42 | ;SYSTEM_POWER_STATUS.BatteryLifePercent <= 66?
- 00000000770B272F | jbe _BatteryLife_below66 |
- 00000000770B2731 | or byte ptr ds:[rbx+1],1 | ;SYSTEM_POWER_STATUS.BatteryFlags |= 1 (High)
- _BatteryLife_below66:
- 00000000770B2735 | cmp al,21 | ;SYSTEM_POWER_STATUS.BatteryLifePercent > 33?
- 00000000770B2737 | jnb _BatteryPresent.MaxCapacity |
- 00000000770B273D | or byte ptr ds:[rbx+1],2 | ;SYSTEM_POWER_STATUS.BatteryFlags |= 2 (Low)
- 00000000770B2741 | jmp _BatteryPresent.MaxCapacity |
- _Times:
- 00000000770B2746 | mov dword ptr ds:[rbx+4],eax | ;SYSTEM_POWER_STATUS.BatteryLife = PSYSTEM_BATTERY_STATE.RemainingCapacity
- 00000000770B2749 | jmp _Times_Done |
- 00000000770B274E | xor eax,eax |
- 00000000770B2750 | mov dword ptr ss:[rsp+30],10 |
- 00000000770B2758 | mov r9,r10 |
- 00000000770B275B | mov qword ptr ss:[rsp+28],rax |
- 00000000770B2760 | mov qword ptr ss:[rsp+20],rax |
- 00000000770B2765 | call qword ptr ds:[<&LdrResFindResourceDirectory>] |
- 00000000770B276B | add rsp,78 |
- 00000000770B276F | ret |
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement