-
-
[旧帖]
[推荐][原创]去除某软件的NAG
0.00雪花
-
发表于:
2009-8-5 12:21
1486
-
[旧帖] [推荐][原创]去除某软件的NAG
0.00雪花
刚刚尝试去除了一个软件的NAG,现在发出来,希望能拿到邀请码
。
声明:本人是刚学2天的菜鸟,文章有许多不足之处,请各位大牛指点。
============================================================================================================
目标程序简介:
该程序是一款虚拟桌面程序,如果没注册,每次关闭程序时会依次弹出两个对话框,要求注册、修改IE主页。
任务目标:
使得程序退出时不显示该对话框。
使用工具:
PEid,Ollydbg,UnAspack2.1,WinHex
============================================================================================================
过程:
首先
PEid查壳,结果是
Aspack2.12。由于我暂时不会手工脱壳,就用网上的
UnAspack2.1脱壳机把壳去掉(脱壳明天再学
)。
然后用
od载入,Ctrl+N查看API函数,看到两个
MessageBoxA,选
在每个参考上设置断点,运行,关闭程序,断了:
0045FC77 |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4] ; |
0045FC7A |. 8B40 30 MOV EAX,DWORD PTR DS:[EAX+30] ; |
0045FC7D |. 50 PUSH EAX ; |hOwner
0045FC7E |. E8 B576FAFF CALL <JMP.&user32.MessageBoxA> ; \MessageBoxA(断于此处)
0045FC83 |. 8945 F8 MOV DWORD PTR SS:[EBP-8],EAX
0045FC86 |. 33C0 XOR EAX,EAX
此call是弹出提示框。往上翻,发现没有跳转可以绕过这个call,没办法,在该函数入口处设断,并把其他不必要的断点禁用掉。
然后重新载入,运行。又断了,正是断在函数入口,看看堆栈:
0012FBF0 004D3B44 返回到 v2.004D3B44 来自 v2.0045FB98
按enter到返回的位置:
004D3B20 . 53 PUSH EBX
004D3B21 . 8BD9 MOV EBX,ECX
004D3B23 . 803D 30A34D00>CMP BYTE PTR DS:[4DA330],0
004D3B2A . 75 2F JNZ SHORT v2.004D3B5B ; 修改这里
004D3B2C . 6A 24 PUSH 24
004D3B2E . B9 603B4D00 MOV ECX,v2.004D3B60
004D3B33 . BA 683B4D00 MOV EDX,v2.004D3B68
004D3B38 . A1 50844D00 MOV EAX,DWORD PTR DS:[4D8450]
004D3B3D . 8B00 MOV EAX,DWORD PTR DS:[EAX]
004D3B3F . E8 54C0F8FF CALL v2.0045FB98
004D3B44 . 83F8 06 CMP EAX,6 ; enter到这里
004D3B47 . 75 12 JNZ SHORT v2.004D3B5B
004D3B49 . C603 00 MOV BYTE PTR DS:[EBX],0
004D3B4C . A1 A8854D00 MOV EAX,DWORD PTR DS:[4D85A8]
004D3B51 . 8B00 MOV EAX,DWORD PTR DS:[EAX]
004D3B53 . 8B10 MOV EDX,DWORD PTR DS:[EAX]
04D3B55 . FF92 E8000000 CALL DWORD PTR DS:[EDX+E8]
004D3B5B > 5B POP EBX
004D3B5C . C3 RETN
往上翻,发现有个JNZ可以跳过刚才的call,于是尝试修改,把JNZ改为JMP。再把所有断点禁掉。
然后重新载入,Ctrl+P运用该补丁,运行,关闭程序。竟然没有弹出窗口!再测试一下其他功能,哈哈,一切正常。
现在要改程序文件了。我没了解过PE文件格式,就直接用
WinHex改文件...
运用了补丁后的代码是:
004D3B2A /EB 2F JMP SHORT v2.004D3B5B ; 运用之后的代码
用
WinHex打开脱过壳的程序,Alt+G转到偏移
004D3B2A,提示不存在该偏移。怎么回事??
再看
OllyDbg中最小的地址都是
00401000,
WinHex里最大的偏移才
16DFFF,相差巨大。
我一想,可能是内存的地址和文件的偏移之间存在某种不相等的数量关系。
于是找到开头的代码:
00401000 . /04104000 DD v2.00401004
00401004 \03 DB 03
00401005 . 07 DB 07
00401006 . 42 6F 6F 6C 6>ASCII "Boolean" ; 查找此处的文本
0040100D 01 DB 01
0040100E 00 DB 00
0040100F 00 DB 00
00401010 00 DB 00
00401011 00 DB 00
00401012 01 DB 01
00401013 00 DB 00
00401014 00 DB 00
00401015 00 DB 00
00401016 00104000 DD v2.00401000
0040101A . 05 DB 05
0040101B . 46 61 6C 73 6>ASCII "False"
00401020 . 04 DB 04
00401021 . 54 72 75 65 ASCII "True"
在
WinHex中Ctrl+F查找文本
Boolean,找到偏移量为
1006处,往下看,居然和
OllyDbg中的数据一样:
Offset 0 1 2 3 4 5 6 7 8 9 A B C D E F
00001000 04 10 40 00 03 07 42 6F 6F 6C 65 61 6E 01 00 00 ..@...Boolean...
00001010 00 00 01 00 00 00 00 10 40 00 05 46 61 6C 73 65 ........@..False
00001020 04 54 72 75 65 .True
于是用
00401006-1006=400000,
OllyDbg中的地址对应到文件中的偏移量要相应地减
400000
(我觉得我明天有必要了解一下PE文件的结构,这种换算关系应该是个巧合)
回去继续看补丁,它把
004D3B2A处的
75 2F改成了
EB 2F,换算到文件中就是把
000D3B2A处的
75 2F改成
EB 2F。
打开
WinHex,Alt+G定位到
000D3B2A处,看看正好是
75 2F。
把
75 2F改为
EB 2F,保存,测试...OK!
============================================================================================================
任务完成情况:
成功完成目标,在不影响其他功能的前提下保证了关闭时的提示框不弹出。
完成时间:
09年8月5日凌晨
============================================================================================================
提问:
关于将OllyDbg中的补丁运用到文件去,应该还有更好的方法,哪位大牛可以介绍一下??
最后的话:
凡指出我在本文章中的不足的人,不管是大牛还是菜鸟,在此,我都不胜感激。。。
[课程]Linux pwn 探索篇!