近日,微软Internet Explorer浏览器爆出高危漏洞,微软已经发布公告提醒用户,并承诺将修复该漏洞。与此同时,该漏洞也已经被木马所利用。知名信息安全厂商卡巴斯基实验室在爆出该漏洞之后很快就检测到了一个可以利用这个漏洞的木马。
据了解,此木马是一个恶意网页脚本木马,会打开带有漏洞利用程序的恶意flash文件,利用最近爆出的微软Internet Explorer浏览器高危漏洞向用户计算机中下载安装后门木马,使用户计算机被黑客操纵。
用户在用IE浏览器浏览含有此木马的网页时,此木马会加载一个名为Moh2010.swf的flash文件。
Moh2010.swf使用了Doswf进行了加壳保护,使人不能轻易地看到flash文件的内容。
从中我们可以看到它会去调用另一个Protect.html.另外还可以看到其中还包含有转换为字符的代码。
可以看到这段代码还会对其中后面的代码进行异或解密。
从解密后的代码中我们可以看到它所要下载的后门木马的地址。
前面提到的被flash文件调用的Protected.html被卡巴斯基检测为Trojan-Downloader.HTML.SWFLoad.h。
从中可以看到这个版本的漏洞利用程序只攻击Windows XP上的IE7和IE8,并且还可以看到其中包含有真正的CVE-2012-4969漏洞的利用代码。漏洞触发后会执行前面解密出的代码并从http://62.152.xxx.xxx/public/help/111.exe向用户计算机中下载运行木马。被下载的木马被卡巴斯基检测为Trojan.Win32.Agent.tuzg,是一种Poison Ivy远程控制木马。
目前来看,该木马使得用户的电脑存在极大的风险,用户应安装专业的安全软件。卡巴斯基所有产品已经可以完全查杀这个恶意网页脚本木马了,尤其是近期刚刚发布的卡巴斯基安全部队2013,其具备的自动漏洞入侵防护技术能帮助用户排除隐忧。
/***
* <p> 封装日志api的调用. 将日志api的调用统一放到这个类下,
* 更换具体是使用的日志框架时就只要修改这个类时就好了.
* (比如: 将现在使用的java内置log框架换为Log4j时). </p>
*
* <p> 日志其实就是在代码中预先添加好一些用于调试或者跟踪程序的代码,
* 在代码出问题的时候可以让我们通过记录的日志来查找程序问题. 加入了日志在打印处可能会带来一些开销,
* 但基本是可以忽略不计的那种, 所以程序中尽量要在需要的地方加入日志. </p>
*/
public class AppLog {
/** 开发标记 */
public static final boolean DEV = false;
private static final String TAG = "AppLog";
public static class LogConfig {
File mLogFolder;
String mLogFileNamePattern;
int mLimit = 100 * 1024;
int mCount = 5;
boolean mAppend = true;
/** 日志写入文件的级别 */
Level mFileLogLevel = Level.WARNING;
Formatter mFileLogFormatter = new SimpleFormatter();
public LogConfig(File logFolder) {
this(logFolder, "/%u.log");
}
public LogConfig(File logFolder, String logFileNamePattern) {
if (logFileNamePattern.charAt(0) == '/') {
mLogFileNamePattern = logFileNamePattern;
} else {
mLogFileNamePattern = '/' + logFileNamePattern;
}
mLogFolder = logFolder;
}
}
private static FileHandler sFileHandler;
private static String sFileHandlerPattern;
/***
* <p> 配置Logger. </p>
*/
public static void configRootLogger(LogConfig lc) {
Logger rootLogger = Logger.getLogger("");
rootLogger.setLevel(Level.WARNING);
try {
boolean logFolderExists = lc.mLogFolder.exists();
if (!logFolderExists) {
AppLog.i(lc.mLogFolder.getAbsolutePath());
AppLog.i("log folder doesn't exists");
logFolderExists = lc.mLogFolder.mkdirs();
if (!logFolderExists) {
if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {
AppLog.i("log folder create fail and sdcard exists, " +
"please check is permission android.permission.WRITE_EXTERNAL_STORAGE exists");
} else {
AppLog.i("log folder create fail and sdcard not exists");
}
} else {
AppLog.i("log folder created");
}
}
if (logFolderExists) {
String fileHandlerPattern = lc.mLogFolder.getPath() + lc.mLogFileNamePattern;
if (fileHandlerPattern.equals(sFileHandlerPattern)) {
return;
}
sFileHandler = new FileHandler(fileHandlerPattern, lc.mLimit, lc.mCount, lc.mAppend);
sFileHandler.setLevel(lc.mFileLogLevel);
sFileHandler.setFormatter(lc.mFileLogFormatter);
rootLogger.addHandler(sFileHandler);
sFileHandlerPattern = fileHandlerPattern;
} else {
rootLogger.removeHandler(sFileHandler);
sFileHandler = null;
sFileHandlerPattern = null;
}
} catch (IOException ex) { // 创建FileHandler时出错, 就不用FileHandler
rootLogger.removeHandler(sFileHandler);
sFileHandler = null;
sFileHandlerPattern = null;
Log.w(TAG, ex);
}
}
/***
* <p> 使用配置文件来配置Logger. </p>
*/
public static void configLogger(InputStream is) {
try {
LogManager logManager = LogManager.getLogManager();
logManager.readConfiguration(is);
} catch (IOException ex) {
// 如果出错则使用默认的log配置
Log.w(TAG, ex);
}
}
// -----------------------------------
private static volatile Logger sDefaultLogger = Logger.getLogger(TAG);
private static boolean sDev = DEV;
private static String sTag = TAG;
public static void setDefaultTag(String tag) {
if (!tag.equals(sTag)) { // tag不能为null
sTag = tag;
sDefaultLogger = Logger.getLogger(tag);
}
}
public static void setDevMode(boolean dev) {
sDev = dev;
}
// -----------------------------------
// 优先级: v>d>i>w>e
// error, warning日志需要保持到日志文件中(在开发时就只显示到控制台)
public static void e(String msg) {
if (DEV) { // 开发时只显示到控制台
Log.e(sTag, msg);
} else { // 发布时, 保存到日志文件中
sDefaultLogger.log(Level.SEVERE, msg);
}
}
public static void e(String msg, Throwable tr) {
if (DEV) {
Log.e(sTag, msg, tr);
} else {
sDefaultLogger.log(Level.SEVERE, msg, tr);
}
}
public static void w(String msg) {
if (DEV) { // 开发时只显示到控制台
Log.w(sTag, msg);
} else { // 发布时, 保存到日志文件中
sDefaultLogger.log(Level.WARNING, msg);
}
}
public static void w(Throwable tr) {
if (DEV) {
Log.w(sTag, tr);
} else {
sDefaultLogger.log(Level.WARNING, "", tr);
}
}
private static void log(String tag, Level level, String msg) {
Logger logger = Logger.getLogger(tag);
logger.log(level, msg);
}
private static void log(String tag, Level level, String msg, Throwable tr) {
Logger logger = Logger.getLogger(tag);
logger.log(level, msg, tr);
}
// -----------------------------------
// info, debug, verbose日志只打印到控制台
/***
* <p> 记录程序运行状态的日志. 比如: 用来确定是否有程序模块是否都正常启动了,
* 或者配置文件都正确加载了. </p>
*/
public static void i(String msg) {
if (sDev) {
Log.i(sTag, msg);
}
}
/***
* <p> 跟踪程序时可以用到的日志记录. 主要用在一些关键的数据上, 比如从网络获取来的数据,
* 在进入程序前记录下日志, 就可以知道传入的数据是否不合法. </p>
*/
public static void d(String msg) {
if (sDev) {
Log.d(sTag, msg);
}
}
/***
* <p> 开发时, 代替System.out.println()的, 用来记录任何想要显示到控制台上的内容,
* 需要在发布版本时从实际代码中删除, 否则会造成额外的方法调用开销. </p>
*/
public static void v(String msg) {
if (DEV) {
Log.v(sTag, msg);
}
}
}
AppLog类的使用:
在app启动时配置好日志
public class App extends Application {
@Override
public void onCreate() {
super.onCreate();
// 在app启动时配置好日志
File logFolder = new File(Environment.getExternalStorageDirectory(), getPackageName()+"/log");
LogConfig lc = new LogConfig(logFolder);
AppLog.configRootLogger(lc);
// 记录app的运行状态
AppLog.i("App.onCreate()");
}
}
在app崩溃时将错误堆栈写入到日志文件中
public class CrashHandler implements Thread.UncaughtExceptionHandler {
@Override
public void uncaughtException(Thread thread, Throwable t) {
// 对于引起app挂掉的异常, 我们可以使用error级别的日志来记录
AppLog.e("+++crash", t);
}
}
用error级别的日志记录app执行过程中发生的错误, 用warning级别的日志记录可以忽略的异常
public class Act extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
AppLog.i("Act.onCreate()");
String file = "d:/not_exists_file";
FileInputStream fis = null;
try {
fis = new FileInputStream(file);
fis.read();
} catch (IOException ex) {
// 使用error级别的日志记录下引发错误的异常
AppLog.e(file, t);
} finally {
try {
if (fis != null) {
fis.close();
}
} catch (IOException ex) {
// 一些可忽略的异常可以用warning级别的日志来记录
AppLog.w(ex);
}
}
}
@Override
protected void onResume() {
super.onResume();
File logFolder;
// 每次在activity恢复时检查sd卡, 因为在pause期间可能sd卡被拔出
if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {
logFolder = new File(Environment.getExternalStorageDirectory(), getPackageName()+"/log");
} else { // sd卡不可用时, 将日志记录到/data/data/app_package_name/app_log目录下
logFolder = getDir("log", 0);
}
LogConfig lc = new LogConfig(logFolder);
AppLog.configRootLogger(lc);
}
}
在学习《cocos2d-x手机游戏开发》时,书中里面多处出现了FPS,在不同的上下文当中有不同的含义。
1. 在图像领域中
FPS(Frames Per Second):每秒传输帧数。 更确切的解释是“每秒钟填充图像的帧数(帧/秒)”。也可以理解为我们常说的“刷新率(单位为Hz)
常见媒体的FPS帧率:
电影:24fps
电视(PAL):25fps
电视(NTSL):30fps
CRT显示器:75Hz以上
液晶显示器:60Hz
2. 在电子游戏领域中
FPS(First- Person Shooter Game):第一人称射击游戏。严格来说FPS属于ACT类游戏的一个分支,但和RTS类游戏一样,由于其在世界上的迅速风靡,使之展成了一个单独的类 型。 (注:ACT=Action Game 动作类游戏,RTS=Real-Time Strategy Game 即时战略游戏)
著 名的FPS游戏有:《毁灭战士》系列(Doom)、《雷神之锤》系列 (Quake)、《虚幻竞技场》系列(Unreal Tournament)、《半条命》系列及其Mod(Half-Life)、《反恐精英》系列(Counter-Strike 即 CS)、《胜利之日》系列(Day of Defeat)、《死亡空间》系列(Dead Space)、《荣誉勋章》系列(Medal of Honor)、《使命召唤》系列(Call of Duty)、《德军总部》/《狼穴》(Wolfenstein)、《战地》/《战地风云》系列及其Mod(Battlefield)、《三角洲特种部队》 系列(Delta Force)、《丛林之狐》系列(Vietcong)、《彩虹六号》系列及其Mod(Rainbow six)、《幽灵行动》系列(Ghost Recon)、《VR特警》系列(Virtua Squad)、《命令与征服》系列(Command & Conquer)、......
更多关于 cocos2d-x手机游戏开发的资料请点这里