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的更多相关文章

  1. 【ARTS】01_21_左耳听风-201900401~201900407

    ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...

  2. 【ARTS】01_20_左耳听风-20190325~20190331

    zz## ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 ...

  3. 【ARTS】01_19_左耳听风-20190318~20190324

    ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...

  4. 【ARTS】01_18_左耳听风-20190311~20190317

    ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...

  5. 【ARTS】01_17_左耳听风-20190304~20190310

    ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...

  6. 【ARTS】01_16_左耳听风-20190225~20190303

    ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...

  7. 【ARTS】01_14_左耳听风-20190211~20190217

    ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...

  8. 【ARTS】01_10_左耳听风-20190114~20190120

    ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...

  9. 【ARTS】01_09_左耳听风-20190107~20190113

    ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...

随机推荐

  1. Linux内核分析——第二周学习笔记

    20135313吴子怡.北京电子科技学院 chapter 1 知识点梳理 (一)计算机是如何工作的?(总结)——三个法宝 ①存储程序计算机工作模型,计算机系统最最基础性的逻辑结构: ②函数调用堆栈,高 ...

  2. Javascript中Base64编码解码的使用实例

    Javascript为我们提供了一个简单的方法来实现字符串的Base64编码和解码,分别是window.btoa()函数和window.atob()函数. 1 var encodedStr = win ...

  3. (Alpha)Let's-典型用户和场景&功能规格说明书

    典型用户和场景 Personal/典型用户 名字 阿王 性别.年龄 男.20 职业 学生 收入 无 知识层次和能力 大学学生,善于乐于使用电脑.手机 生活/工作情况 上学 动机.目的.困难 感到大学生 ...

  4. 项目UML设计(团队)

    团队 队名 boy next door 队员 林晗 124(组长) 微博链接 显东 114 微博链接 基智 505 微博链接 松雄 126 微博链接 团队分工 分工表 任务 林晗 显东 基智 松雄 前 ...

  5. CopyOnWriteArrayList、CopyOnWriteArraySet、ConcurrentHashMap的实现原理和适用场景

    ConcurrentHashMap代替同步的Map(Collections.synchronized(new HashMap())),众所周知,HashMap是根据散列值分段存储的,同步Map在同步的 ...

  6. 用send_keys输入文本的方法

    我们使用app时,输入文字都是调用软键盘.在自动化测试中当然也可以调用软键盘,但是由于输入法设计上的差异,有时候不能达到很好的效果. 例如,搜狗拼音输入法: 选择4-咖啡,然而多打几次,输入法就把“咖 ...

  7. 洛谷P4301 [CQOI2013]新Nim游戏

    P4301 [CQOI2013]新Nim游戏 题目描述 传统的Nim游戏是这样的:有一些火柴堆,每堆都有若干根火柴(不同堆的火柴数量可以不同).两个游戏者轮流操作,每次可以选一个火柴堆拿走若干根火柴. ...

  8. 小菜菜mysql练习解读分析2——查询存在" 01 "课程但可能不存在" 02 "课程的情况(不存在时显示为 null )

    “查询存在" 01 "课程但可能不存在" 02 "课程的情况(不存在时显示为 null )” ——翻译为:课程表里面,存在01的信息,未必满足有02的课程情况 ...

  9. IntelliJ IDEA2017 修改缓存文件的路径

    IDEA的缓存文件夹.IntelliJIdea2017.1,存放着IDEA的破解密码,各个项目的缓存,默认是在C盘的用户目录下,目前有1.5G大小.现在想要把它从C盘移出. 在IDEA的安装路径下中, ...

  10. 动态dp 板子

    动态dp 瞎扯两句吧 先从序列上理解,维护链的最大独立集. 考虑是从左边转移的,那么矩阵的转移唯一,直接放在线段树上就可以了. 放在树上的话,儿子都可以转移,把轻儿子的转移放在子链链头更新,然后每条链 ...