新入手的XT912 MAXX,用金山电池检测是1780mA,用battery monitor widget pro检测是3200mA,哪个准啊
两个软件测的差这么对,完全没有比对的意义。你应该有个现实生活中的参考,比如使用时间、电池重量这些,根据这些指标两个相差这么大的值就很好比出来。
有一种办法可以近似估算出你的电池容量,如果是3200mA电池要比1780mA电池要厚和重,你上京东这些网站上可以看下这些电池的规格参数,然后就可以做一个比较得出结果了
另外,你可以看下手机背面电池的信息,上网搜索一下电池的相关信息。
脱壳.UPolyX v0.5 *
想要脱
VMP
的壳,首要工作当然是要找一个强
OD
啦!至于是什么版本的
OD
自己多试验几个,网上
大把大把的,一般来说只要加载了你想脱的
VMP
加壳程序不关闭都可以。
其次就是
StrongOD.dll
这个插件了,现在用的比较多的就是海风月影,同样网上也是大把大把的。下载
回来后复制到你的
OD
程序所在的文件夹里面的
plugin
里。
StrongOD
的设置选项搞不懂就全部打钩。
接下来要做的工作就是搞清楚我们要脱壳的程序编程的语言了,
可以用
PEID
或者
fastscanner
查看
,
如果
在这里看不到也可以在
OD
载入以后通过里面的字符串判断了。例如
VB
的程序会出现
MSVB----/VC
的会
出现
MSVC---
等等。这些都是程序运行所需要的
windows
链接文件。
做完这些预备工作接下来当然是用
OD
载入文件啦。文件载入后在反汇编窗口
CTRL+G
搜索
VirtualProtect(
注意
V
跟
P
要大写,
至于为什么要搜索这个别问我
)
。
一般来说搜索的结果会出现以下的类似:
7C801AE3
E8 75FFFFFF
call kernel32.VirtualProtectEx
我们在这里下
F2
断点。
然后
F9
运行到我们下的这个断点。
接下来我们就要注意观察堆栈窗口了。
一般来
说当我们
F9
运行到我们上面下的断点的时候在堆栈窗口会出现以下类似:
0012F66C
00401000 |Address = TradeCen.00401000
0012F670
000280D1 |Size = 280D1 (164049.)
0012F674
00000004 |NewProtect = PAGE_READWRITE
0012F678
0012FF98 \pOldProtect = 0012FF98
我们要注意观察的就是在接下来我们
F9
运行的时候,
ADDRESS
和
NEWPROTECT
这两行的变化。按
F9-
速度别太快,直到
NewProtect
项变为
PAGE_READONLY
,这时候程序就释放完毕了。
0012F66C
0042A000 |Address = TradeCen.0042A000
0012F670
000069DE |Size = 69DE (27102.)
0012F674
00000002 |NewProtect = PAGE_READONLY
0012F678
0012FF98 \pOldProtect = 0012FF98
现在可以取消刚才我们下的断点了。
接下来就是找
OEP
了。
找
OEP
的时候我个人的一个经验就是
OEP
一般就在接近上面的
ADDRESS
地址的附近。例如上面的地址是
0042A000
,我一般就在这个基础上减到
420000
搜索程序的特征段,当然我们也可以直接跳到
401000
开始搜索。虽然我们搜索的范围比较大,但
是因为我们搜索的是命令序列,所以工作量还不是很大。
废话不多说,
CTRL+G--
上面的地址,然后
CTRL+S
查找命令序列。命令序列的内容就是我们用查到的
编程语言的特征段。我们可以在特征段里面选择两三句固定不变的命令查找。例如
VC++6.0
的特征段是
0046C07B U》 55
push ebp
0046C07C
8BEC
mov ebp,esp
0046C07E
6A FF
push -1
0046C080
68 18064C00
push UltraSna.004C0618
0046C085
68 F8364700
push UltraSna.004736F8
0046C08A
64:A1 00000000
mov eax,dword ptr fs:
0046C090
50
push eax
0046C091
64:8925 00000000 mov dword ptr fs:,esp
0046C098
83EC 58
sub esp,58
0046C09B
53
push ebx
0046C09C
56
push esi
0046C09D
57
push edi
我们可以只搜索前三条命令。找到符合前三条命令的,我们在对照接下来的命令。只要命令相符那这个
地址八九不离十就是
OEP
了。如果在
ADDRESS
地址附近找不到
OEP
,那就只好用笨办法,从
401000
开
始找吧。
找到
OEP
地址后,我们在
OEP
处点鼠标右键《此处为新
EIP
》
。接下来就可以
dump
啦。通常选择
OD
的
dump
插件脱壳要好点,用
loadpe
脱壳后要么程序不运行要么干脆没脱。用
OD
的
dump
插件脱壳的时
候,脱壳窗口下面的(重建输入表)项前面的勾一定要去掉,这个也是前辈总结的经验。
到此脱壳就结束了。可以试验一下脱壳后的程序了。能运行说明它在
70-80%
的范围,不能运行的话那
也是我还在学习的内容,大家共同探讨!
以下是主要几种编程语言的
OEP
特征段:
Borland C++
0040163C B》 /EB 10
jmp short Borland_.0040164E
0040163E
|66:623A
bound di,dword ptr ds:[edx]
00401641
|43
inc ebx
00401642
|2B2B
sub ebp,dword ptr ds:[ebx]
00401644
|48
dec eax
00401645
|4F
dec edi
00401646
|4F
dec edi
00401647
|4B
dec ebx
00401648
|90
nop
00401649
-|E9 98E04E00
jmp SHELL32.008EF6E6
0040164E
\A1 8BE04E00
mov eax,dword ptr ds:[4EE08B]
00401653
C1E0 02
shl eax,2
00401656
A3 8FE04E00
mov dword ptr ds:[4EE08F],eax
0040165B
52
push edx
0040165C
6A 00
push 0
0040165E
E8 DFBC0E00
call 《jmp.&KERNEL32.GetModuleHandleA》
**********************************************************************************
Delphi
00458650 D》 55
push ebp
00458651
8BEC
mov ebp,esp
00458653
83C4 F0
add esp,-10
00458656
B8 70844500
mov eax,Delphi.00458470
0045865B
E8 00D6FAFF
call Delphi.00405C60
00458660
A1 58A14500
mov eax,dword ptr ds:[45A158]
00458665
8B00
mov eax,dword ptr ds:[eax]
00458667
E8 E0E1FFFF
call Delphi.0045684C
0045866C
A1 58A14500
mov eax,dword ptr ds:[45A158]
00458671
8B00
mov eax,dword ptr ds:[eax]
00458673
BA B0864500
mov edx,Delphi.004586B0
00458678
E8 DFDDFFFF
call Delphi.0045645C
0045867D
8B0D 48A24500
mov ecx,dword ptr ds:[45A248]
Delphi.0045BC00
00458683
A1 58A14500
mov eax,dword ptr ds:[45A158]
00458688
8B00
mov eax,dword ptr ds:[eax]
0045868A
8B15 EC7D4500
mov edx,dword ptr ds:[457DEC]
Delphi.00457E38
00458690
E8 CFE1FFFF
call Delphi.00456864
00458695
A1 58A14500
mov eax,dword ptr ds:[45A158]
0045869A
8B00
mov eax,dword ptr ds:[eax]
0045869C
E8 43E2FFFF
call Delphi.004568E4
**********************************************************************************
Visual C++ 6.0
0046C07B U》 55
push ebp
0046C07C
8BEC
mov ebp,esp
0046C07E
6A FF
push -1
0046C080
68 18064C00
push UltraSna.004C0618
0046C085
68 F8364700
push UltraSna.004736F8
0046C08A
64:A1 00000000
mov eax,dword ptr fs:
0046C090
50
push eax
0046C091
64:8925 00000000 mov dword ptr fs:,esp
0046C098
83EC 58
sub esp,58
0046C09B
53
push ebx
0046C09C
56
push esi
0046C09D
57
push edi
0046C09E
8965 E8
mov dword ptr ss:[ebp-18],esp
0046C0A1
FF15 74824A00
call dword ptr ds:[《&KERNEL32.GetVersion》] kernel32.GetVersion
0046C0A7
33D2
xor edx,edx
0046C0A9
8AD4
mov dl,ah
0046C0AB
8915 403F4F00
mov dword ptr ds:[4F3F40],edx
0046C0B1
8BC8
mov ecx,eax
0046C0B3
81E1 FF000000
and ecx,0FF
0046C0B9
890D 3C3F4F00
mov dword ptr ds:[4F3F3C],ecx
**********************************************************************************
Visual C++ 7.0
0100739D 》 $ 6A 70
push 0x70
0100739F
. 68 98180001
push NOTEPAD.01001898
010073A4
. E8 BF010000
call NOTEPAD.01007568
010073A9
. 33DB
xor ebx,ebx
**********************************************************************************
汇编
00401000
汇
》 6A 00
push 0
00401002
E8 C50A0000
call 《jmp.&KERNEL32.GetModuleHandleA》
00401007
A3 0C354000
mov dword ptr ds:[40350C],eax
0040100C
E8 B50A0000
call 《jmp.&KERNEL32.GetCommandLineA》
00401011
A3 10354000
mov dword ptr ds:,eax
00401016
6A 0A
push 0A
00401018
FF35 10354000
push dword ptr ds:
0040101E
6A 00
push 0
00401020
FF35 0C354000
push dword ptr ds:[40350C]
00401026
E8 06000000
call
汇编
.00401031
0040102B
50
push eax
0040102C
E8 8F0A0000
call 《jmp.&KERNEL32.ExitProcess》
00401031
55
push ebp
00401032
8BEC
mov ebp,esp
00401034
83C4 B0
add esp,-50
00401037
C745 D0 30000000 mov dword ptr ss:[ebp-30],30
0040103E
C745 D4 0B000000 mov dword ptr ss:[ebp-2C],0B
00401045
C745 D8 37114000 mov dword ptr ss:[ebp-28],
汇编
.00401137
**********************************************************************************
VB
0040116C V》/$ 68 147C4000
push VB.00407C14
00401171
|. E8 F0FFFFFF
call 《jmp.&MSVBVM60.#100》
00401176
|. 0000
add byte ptr ds:[eax],al
00401178
|. 0000
add byte ptr ds:[eax],al
0040117A
|. 0000
add byte ptr ds:[eax],al
0040117C
|. 3000
xor byte ptr ds:[eax],al
如何使用appwidget实现进程常驻
本篇打算从以下几个点来介绍AppWidget:
1.如何创建一个简单的AppWidget
2.如何使得AppWidget与客户端程序交互
创建简单的AppWidget
在介绍之前给大家看一下程序运行的最后结果和项目结构图,以便大家有个整体的印象。
运行结果图:
项目结构图:
第一步:
首先在res文件夹下新建一个名字为xml的文件夹,然后在xml目录下创建一个名为appwidget01的xml文件(如上图所示)。这个appwidget01中的内容如下:
《?xml version=“1.0“ encoding=“utf-8“?》
《appwidget-provider
xmlns:android=“
-Pro