【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、奇异值分解

时间管理

- 主动管理:主动管理的不是你的时间,而是管理你的同事,管理你的信息
- 学会说“不”:给出另一个你可以做到的方案,而不是把对方的方案直接回绝掉、我不说我不能完全满足你,但我说我可以部分满足你
- 加班和开会:开会,不是讨论问题,而是讨论方案,开会不是要有议题,而是要有议案。

投资时间

- 花时间学习基础知识,花时间读文档:系统地学习一门技术是非常关键的,所以这个时间是值得投资的。
- 花时间在解放自己生产力的事上:花时间在解放自己的事上是最有意义的了
- 花时间在让自己成长的事上
- 花时间在建立高效的环境上

规划自己的时间

- 定义好优先级
- 最短作业优先
- 想清楚再做
- 关注长期利益规划

用好自己的时间

形成习惯
形成正反馈
反思和举一反三
上一篇:ligerui_ligerTree_006_ligerui事件支持


下一篇:Shell入门知识