【ARTS】01_08_左耳听风-20181231~20190106
ARTS:
- Algrothm: leetcode算法题目
- Review: 阅读并且点评一篇英文技术文章
- Tip/Techni: 学习一个技术技巧
- Share: 分享一篇有观点和思考的技术文章
Algorithm
【leetcode】557. Reverse Words in a String III
https://leetcode.com/problems/reverse-words-in-a-string-iii/
1)problem
Given a string, you need to reverse the order of characters in each word within a sentence while still preserving whitespace and initial word order.
Example 1:
Input: "Let's take LeetCode contest"
Output: "s'teL ekat edoCteeL tsetnoc"
Note: In the string, each word is separated by single space and there will not be any extra space in the string.
2)answer
判断是否为空格,然后每个单词转换。有一个很好用的交换函数swap。
3)solution
class Solution {
public:
string reverseWords(string s) {
int begin = 0;
int end = 0;
for (int i = 0; i <= s.length(); ++i) {
//如果遇到了空格,就准备颠倒每个字符串的值
if (s[i] == ' ' || s[i] == '\0') {
end = i;
// 转换每个单词的值,end是单词的结尾长度,j是单词开始长度。
for (int j = begin; j < end; ++j) {
std::swap(s[j], s[--end]);
}
begin = i + 1;
}
}
return s;
}
};
Review
【恶意代码】The Road To Reverse Engineering Malware
1)场景
逆向工程恶意软件之路
2)问题难点
恶意软件逆向工程资源分散在互联网,互联网很容易找到教程,课程和书籍,但正确构建这些资源,这是完全不同的事情。
3)解决问题的方法
恶意软件分析书籍
在线资源:课程,视频,研讨会和博客
基础班
实践的工具和资源
查找恶意软件样本和CTF挑战
4)方法细节
- 恶意软件分析书籍
- Practical Malware Analysis
https://www.amazon.co.uk/Practical-Malware-Analysis-Hands-Dissecting/dp/1593272901/ref=sr_1_1?s=books&ie=UTF8&qid=1514541782&sr=1-1&keywords=malware+analysis
- Malware Analyst's Cookbook and DVD: Tools and Techniques for Fighting Malicious Code Paperback – 27 Oct 2010
https://www.amazon.co.uk/Malware-Analysts-Cookbook-DVD-Techniques/dp/0470613033/ref=sr_1_3?s=books&ie=UTF8&qid=1514541782&sr=1-3&keywords=malware+analysis
- Windows Malware Analysis Essentials: Master the fundamentals of malware analysis for the Windows platform and enhance your anti-malware skill set Paperback – 1 Sep 2015
https://www.amazon.co.uk/Windows-Malware-Analysis-Essentials-Victor/dp/1785281518/ref=sr_1_8?s=books&ie=UTF8&qid=1514541782&sr=1-8&keywords=malware+analysis
- 在线资源:课程,视频,研讨会和博客
- opensecuritytraining
http://opensecuritytraining.info/Welcome.html
- 基础班
x86简介 - http://opensecuritytraining.info/IntroX86.html
x86-6简介 - http://opensecuritytraining.info/IntroX86-64.html
二进制生活 - http://opensecuritytraining.info/LifeOfBinaries.html
恶意软件动态分析 - http://opensecuritytraining.info/MalwareDynamicAnalysis.html
软件漏洞简介 - http://opensecuritytraining.info/Exploits1.html
中级英特尔x86:架构,装配,应用程序和头韵 - http://opensecuritytraining.info/IntermediateX86.html
逆向工程软件简介:http://opensecuritytraining.info/IntroductionToReverseEngineering.html
逆向工程恶意软件 - http://opensecuritytraining.info/ReverseEngineeringMalware.html
Rootkit:它们是什么,以及如何找到它们 - http://opensecuritytraining.info/Rootkits.html
击键历险记:深入了解Windows上的键盘记录程序 - http://opensecuritytraining.info/Keylogging.html
恶意软件独角兽研讨会RE101和RE102 : . 从0到逆向工程加密算法常见的恶意软件样本使用。第一个研讨会提供了一个良好的工作流程,它在任何恶意软件分析任务中都很有用。RE102是一本很好的教程和分步指南,用于剖析恶意软件并介绍恶意软件编写者使用的一些最常见的“反”技术
https://securedorg.github.io/RE101/
https://securedorg.github.io/RE102/
- https://github.com/RPISEC/Malware:由RPISEC开发的材料。它包括讲座,实验室和项目。作为一本教科书,它引用了“实用恶意软件分析”,它还包含了一系列可以继续获取更多样本或挑战的地方。
- 实践的工具和资源
- 工具
REMnux - https://remnux.org/:REMnux是一个Linux发行版,它预先打包了一堆非常有用的工具.
收费内容:https://medium.com/@pramos/why-you-need-you-a-malware-analysis-lab-and-how-to-build-it-10048eaa8e9
- 查找恶意软件样本和CTF挑战
- 动物园(https://github.com/ytisf/theZoo):这个Github仓库包含一个LIVE恶意软件样本的精选列表,其中一些包括源代码。为分析师提供一个有关于RE恶意软件学习示例的地方。
- Flare-On挑战:FireEye每年都会组织一场类似于CTF的比赛,包括JavaScript,Windows,Linux和Android二进制文件。https://www.fireeye.com/blog/threat-research/2017/10/2017-flare-on-challenge-solutions.html
5)总结
- 恶意软件分析书籍
- 在线资源:课程,视频,研讨会和博客
- 基础班
- 实践的工具和资源
- 查找恶意软件样本和CTF挑战
Tip
【安全开发】MFC界面开发-恶意代码上机文件排查
1)场景
文件特征排查
2)问题难点
遍历目录方法
3)解决思路
1、WIN32_FIND_DATA、FindFirstFile()/FindNextFile()/FindClose()
2、finddata_t fd、_findfirst()/_findnext()/_findclose
4)方法细节
1、Windows 文件夹遍历-WIN32_FIND_DATA结构
https://docs.microsoft.com/zh-cn/windows/desktop/api/minwinbase/ns-minwinbase-_win32_find_dataa
- WIN32_FIND_DATA结构
typedef struct _WIN32_FIND_DATAA {
// 一个文件(或路径)的文件属性。
DWORD dwFileAttributes;
// 指定一个文件或目录的创建时间。如果文件系统不支持创建时间,此成员为0。
FILETIME ftCreationTime;
// 对于文件,指定文件最后被读取、写入,或(对于可执行文件)被运行的时间。对于目录,指定目录的创建时间。如果文件系统不支持最后一次写入时间,此成员为0。
FILETIME ftLastAccessTime;
// 指定文件最后被写入、截短或重写的时间(例如调用WriteFile()或SetEndOfFile()时)。日期和时间在文件属性或描述符被改变时不会被更新。
FILETIME ftLastWriteTime;
// 文件大小(以字节为单位)的高DWORD。除非文件大小大于MAXDWORD,否则值为0。文件大小等于(nFileSizeHigh * (MAXDWORD + 1)) + nFileSizeLow。
DWORD nFileSizeHigh;
// 文件大小(以字节为单位)的低DWORD。
DWORD nFileSizeLow;
// 如果dwFileAttributes成员含有FILE_ATTRIBUTE_REPARSE_POINT属性,这个成员指定重新分析点标签(reparse point tag)。否则这个值是未定义的。
DWORD dwReserved0;
// 保留给将来使用。
DWORD dwReserved1;
// CHAR/WCHAR数组,大小为MAX_PATH。文件名。
_Field_z_ CHAR cFileName[ MAX_PATH ];
// CHAR/WCHAR数组,大小为14。文件的别名。名称的格式为8.3文件名格式。
_Field_z_ CHAR cAlternateFileName[ 14 ];
#ifdef _MAC
DWORD dwFileType;
DWORD dwCreatorType;
WORD wFinderFlags;
#endif
} WIN32_FIND_DATAA;
- FindFirstFile()/FindNextFile()/FindClose()函数
要查找文件,需要使用FindFirstFile()、FindNextFile()和FindClose()函数。
FindFirstFile() //搜索第一个文件,创建并返回搜索句柄。
HANDLE WINAPI FindFirstFile(
_In_ LPCTSTR lpFileName, // 路径或文件名
_Out_ LPWIN32_FIND_DATA lpFindFileData //用于接收找到的文件/目录的信息。
);
FindNextFile() //搜索下一个文件。
BOOL WINAPI FindNextFile(
_In_ HANDLE hFindFile, //搜索句柄
_Out_ LPWIN32_FIND_DATA lpFindFileData //WIN32_FIND_DATA指针。用于接收找到的文件/目录的信息。
);
FindClose() //释放搜索句柄。
BOOL WINAPI FindClose(
_Inout_ HANDLE hFindFile //搜索句柄。
);
- 通配符(wildcards)
*和?字符被用作通配符。
指定全部具有某个扩展名的文件 , 如 *.txt
指定全部具有某个名称的文件/目录,如 readme.*
指定具有一定长度的扩展名的文件,如 index.????
指定具有一定长度的文件名的文件,如 ???????.txt
- 当前目录和上一级目录
调用FindFirstFile()时,使用"."表示当前目录,使用".."表示上一级目录。FindFirstFile()和FindNextFile()所返回的文件/目录名也可能是"."或"..",可以忽略。
遍历某个目录代码
只遍历单个目录
#include "pch.h"
#include <iostream>
#include <cstring>
#include <windows.h>
void listFiles(const char * dir);
int n = 0;
int main()
{
using namespace std;
char dir[100];
cout << "Enter a directory (ends with \'\\\'): ";
cin.getline(dir, 100);
strcat(dir, "*.*"); // 需要在目录后面加上*.*表示所有文件/目录
listFiles(dir);
cout << n << endl;
return 0;
}
void listFiles(const char * dir)
{
using namespace std;
HANDLE hFind;
WIN32_FIND_DATA findData;
LARGE_INTEGER size;
hFind = FindFirstFile(dir, &findData);
if (hFind == INVALID_HANDLE_VALUE)
{
cout << "Failed to find first file!\n";
return;
}
do
{
// 忽略"."和".."两个结果
if (strcmp(findData.cFileName, ".") == 0 || strcmp(findData.cFileName, "..") == 0){
continue;}
if (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) // 是否是目录
{
cout << findData.cFileName << "\t<dir>\n";
}
else
{
size.LowPart = findData.nFileSizeLow;
size.HighPart = findData.nFileSizeHigh;
cout << findData.cFileName << "\t" << size.QuadPart << " bytes\n";
n = n + 1;
}
} while (FindNextFile(hFind, &findData));
cout << "Done!\n";
}
遍历某个目录里的所有文件
void listFiles(const char * dir)
{
using namespace std;
HANDLE hFind;
WIN32_FIND_DATA findData;
LARGE_INTEGER size;
char dirNew[100];
// 向目录加通配符,用于搜索第一个文件
strcpy(dirNew, dir);
strcat(dirNew, "\\*.*");
hFind = FindFirstFile(dirNew, &findData);
do
{
// 是否是文件夹,并且名称不为"."或".."
if (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY != 0
&& strcmp(findData.cFileName, ".") != 0
&& strcmp(findData.cFileName, "..") != 0
)
{
// 将dirNew设置为搜索到的目录,并进行下一轮搜索
strcpy(dirNew, dir);
strcat(dirNew, "\\");
strcat(dirNew, findData.cFileName);
listFiles(dirNew);
}
else
{
size.LowPart = findData.nFileSizeLow;
size.HighPart = findData.nFileSizeHigh;
cout << findData.cFileName << "\t" << size.QuadPart << " bytes\n";
}
} while (FindNextFile(hFind, &findData));
FindClose(hFind);
}
5)总结
遍历文件夹的两种方法:
第一种:WIN32_FIND_DATA、FindFirstFile()/FindNextFile()/FindClose()
第二种: _finddata_t fd、_findfirst、_findnext、_findclose
Share
【业务】极客时间-左耳听风-开篇词2
1)场景
- 程序错误处理排查
- 机器学习基础
- 时间管理
2)问题难点
程序中的错误处理的几种方法是什么?
机器学习的大体方法?
时间管理的认知?
3)解决思路
- 程序中的错误处理
从传统解决思路和异常捕捉方式进行对比,分场景进行调试、判断。区分不同语言的处理方式。
根据错误返回码和异常捕捉
- 传统的错误检查查询错误码
- 多返回值
- 异常捕捉处理
- 内存资源清理
- 机器学习
从机器学习的常见方式,科研领域学者出版的经典书籍、文章学习
- 时间管理
投资自己的时间、规划自己的时间、用好自己的时间。
4)方法细节
【技术思路】极客时间-左耳听风-开篇词2
https://www.cnblogs.com/17bdw/p/10211002.html
5)总结
程序中的错误处理:错误返回码和异常捕捉
错误码:每个API返回一个状态码
多返回值:返回一个结果值、错误值
资源清理:C free、C++ RAII、Go defer
异常捕捉:try\catch\finally
机器学习
监督式学习:提供一组学习样本以及相关标签,需要样本数据和历史数据。
非监督式学习:数据是没有被标注过的,所以相关的机器学习算法需要找到这些数据中的共性。
相关算法:
- 监督式学习
1、决策树
2、朴素贝叶斯分类
3、最小二乘法
4、逻辑回归
5、支持向量机
6、集成方法
- 非监督式学习
1、聚类算法
2、主成分分析
3、奇异值分解
时间管理
- 主动管理:主动管理的不是你的时间,而是管理你的同事,管理你的信息
- 学会说“不”:给出另一个你可以做到的方案,而不是把对方的方案直接回绝掉、我不说我不能完全满足你,但我说我可以部分满足你
- 加班和开会:开会,不是讨论问题,而是讨论方案,开会不是要有议题,而是要有议案。
投资时间
- 花时间学习基础知识,花时间读文档:系统地学习一门技术是非常关键的,所以这个时间是值得投资的。
- 花时间在解放自己生产力的事上:花时间在解放自己的事上是最有意义的了
- 花时间在让自己成长的事上
- 花时间在建立高效的环境上
规划自己的时间
- 定义好优先级
- 最短作业优先
- 想清楚再做
- 关注长期利益规划
用好自己的时间
形成习惯
形成正反馈
反思和举一反三
【ARTS】01_08_左耳听风-20181231~20190106的更多相关文章
- 【ARTS】01_21_左耳听风-201900401~201900407
ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...
- 【ARTS】01_20_左耳听风-20190325~20190331
zz## ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 ...
- 【ARTS】01_19_左耳听风-20190318~20190324
ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...
- 【ARTS】01_18_左耳听风-20190311~20190317
ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...
- 【ARTS】01_17_左耳听风-20190304~20190310
ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...
- 【ARTS】01_16_左耳听风-20190225~20190303
ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...
- 【ARTS】01_14_左耳听风-20190211~20190217
ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...
- 【ARTS】01_10_左耳听风-20190114~20190120
ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...
- 【ARTS】01_09_左耳听风-20190107~20190113
ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...
随机推荐
- Linux读书笔记第三、四章
第三章 主要内容: 进程和线程 进程的生命周期 进程的创建 进程的终止 1. 进程和线程 进程和线程是程序运行时状态,是动态变化的,进程和线程的管理操作(比如,创建,销毁等)都是有内核来实现的. Li ...
- 《linux内核设计与实现》第二章
第二章 从内核出发 一.获取内核源码 1.使用Git(linux创造的系统) 使用git来获取最新提交到linux版本树的一个副本: $ git clone git://git.kernel.org/ ...
- 《Linux内核分析》第一周学习小结 计算机是如何工作的?
<Linux内核分析>第一周.计算机是如何工作的? 20135204 郝智宇 一.存储程序计算机工作模型 1. 冯诺依曼体系结构: 数字计算机的数制采用二进制:计算机应该按照程 ...
- Jquery ajax 完整实例子1
$ajax请求--------------------------------- var $personWifePs=$("#wife-money tbody tr"); var ...
- 第五周可执行代码 以及 Canvas 制作个人PSP分类饼图
第五周可执行代码已经上传github,地址是https://github.com/yanyige/CourseWork/tree/master/Week4.以及效果在http://yanyige.gi ...
- 【题解】 POJ 1201 Intervals(差分约束)
懒得复制,戳我戳我 Solution: 这道题就是一个板子题 抽象成第\(a\)至第\(b\)间选择数的个数为\(c\),我们就可以用前缀和来表示,这样就可以得到不等式\(s[b]-s[a-1]> ...
- Python 使用multiprocessingm模块创建多进程
from multiprocessing import Process def run_proc(name): print("子进程Process %s(%s)运行..."%(na ...
- 手动生成moc文件
在VS中写Qt项目时,手动添加了一个类,由于要用到信号槽,所以需要生成相应的moc文件.写好信号槽以后,在类里面第一行应该写上Q_OBJECT关键字,编译项目会提示无法找到moc_XXX.cpp文件. ...
- C#列表所有IIS站点以及相关站点属性
using System; using System.Drawing; using System.Collections; using System.ComponentModel; using Sys ...
- (转)面向对象——UML类图设计
背景:一直以来,对UMl类图的画法不甚理解,但是随着学习的深入,发现熟练掌握UML类图,能够更好理解代码间的逻辑性,而这也是程序设计的基础所在,所以很有必要把UML好好掌握. UML类图新手入门级介绍 ...