用户
搜索
  • TA的每日心情
    擦汗
    5 天前
  • 签到天数: 99 天

    连续签到: 3 天

    [LV.6]常住居民II

    i春秋作家

    Rank: 7Rank: 7Rank: 7

    11

    主题

    38

    帖子

    670

    魔法币
    收听
    0
    粉丝
    21
    注册时间
    2017-12-31

    i春秋签约作者

    发表于 2018-7-19 21:56:36 10556204
    本帖最后由 Sp4ce 于 2018-12-7 08:16 编辑

    1.本篇文章属于从零开始的程序逆向之路系列
    2.未经允许禁止转载
    3.作者:Crazyman_Army
    4.Date: 2018.7.19 初稿
    2018.12.7 重新修订

    0x00 准备

    1. 自从上次笔者调戏完盗取文件盗号大黑客后,这激发了笔者的创作热情,就给大家带来程序逆向系列,当然有一些地方还是有所欠缺,请大家在私聊中指出我文中的错误,我会加以改正。
    2. 本篇教程每篇文章都会在附件中给出一个程序逆向例子,当堂课的用Markdown整理的笔记文件(后缀为.pdf) PS:里面有一些配套的基础练习以及概念题目并在其最后给出了正确答案,还有一个程序逆向练习的扩展练习,其扩展练习所用到的知识都会在该篇文章中体现,但是加以技巧的把握和经验的积累,有兴趣的同学可以自己实践实践
    3. 为什么要学习逆向破解?
      • 你可以汉化一些软件给予大家使用
      • 你可以进行病毒分析
      • 外挂辅助的研究
      • 程序的破解
    4. 这套系列笔者所用的工具已经被笔者整理为工具包,链接地址 Anti-Lock Team Tools V2.0
    5. 基础篇需要用到的工具:
      ​    a.OllyDbg v1.1
    6. 实现这系列文章例子的环境:

      • 毕竟程序的编写者不期望自己的程序被破解(其实谁也不期望),所以就采取了一些比较极端的方法,比如:格式化您的重要资料……所以为了保证您的电脑资料数据安全请您务必在虚拟机环境下逆向破解程序。
      • 虚拟机软件您可以自己进行选择,但是笔者还是推荐使用VMware,这是VMware Workstation提取密码是:9954 其文件文件名带着VMware的秘钥。
      • 虚拟机的安装教程请看 虚拟机安装教程
      • 安装虚拟机系统所需要的系统镜像下载地址 msdn i tell you
        Msdn I tell you

      只需要把您需要用到的镜像的下载链接(箭头所指处)放到迅雷里即可

      • 本系列文章的所有内存地址以及特定的模块名称只是该篇文章的参考,这是笔者用来解释知识所用到的例子。
    7. 本篇文章的知识点:
      • 认识OllyDbg(OD)
      • OllyDbg所用的一些常用操作
      • 汇编的快速扫盲

    0x01 首先先认识一下OD(OllyDbg)

    打开OD界面,呈现出下图的窗口分布,这里笔者对OD界面的几个窗口进行了一下标识。
    如图:
    OD界面窗口分布

    下面笔者对这几个窗口在程序破解中的作用一一介绍:

    1.菜单窗口:

    如图:
    菜单窗口

    从左往右依次去说这些按钮的作用以及快捷键:

    序号(编号) 功能 快捷键
    1 打开新的可执行文件 F3
    2 重新载入程序 Ctrl+F2
    3 关闭程序 Alt+F2
    4 运行程序 F9
    5 暂停正在运行的程序 F12
    6 单步步入 F7
    7 单步步过 F8
    8 跟踪步入 Ctrl+F11
    9 跟踪步过 Ctrl+F12
    10 执行到返回 Ctrl+F9
    11 转到反汇编窗口中的地址(转到表达式) Ctrl+G
    12 显示记录窗口 Alt+L
    13 显示模块窗口 Alt+E
    14 显示内存窗口 Alt+M
    15 显示线程窗口
    16 显示窗口
    17 显示句柄窗口
    18 显示CPU窗口 Alt+C
    19 显示补丁窗口 Alt+P
    20 显示调用堆栈窗口 Alt+K
    21 显示断点窗口 Alt+B
    22 显示参考窗口 Alt+R
    23 显示Run跟踪窗口
    24 显示源码窗口
    25 调试选项 Alt+O
    26 界面选项
    27 帮助

    2.反汇编窗口:

    为了演示方便笔者决定用C语言写个简单的Hello World!程序
    代码如下(C):

    #include<stdio.h>
    int main()
    {
            printf("Hello World!");
            getchar();
            return 0;
    }

    将编译好的exe文件拖入OD
    exe拖入OD后

    这里笔者对反汇编窗口进行了一下划分和标注:

    地址栏 Hex栏 反汇编栏 具体信息栏 注释栏

    反汇编窗口分布

    如下表所示:

    名称 功能
    地址栏 程序的内存地址
    hex栏 hex数据(16进制)
    反汇编栏 程序的汇编代码
    具体信息栏 对汇编代码进行更详尽的查看和说明
    注释栏 OD分析出来的,双击可进行编辑

    3.寄存器窗口

    寄存器窗口

    这里就简单介绍几个 通用寄存器 :
    ESP: 指向堆栈栈顶
    EBP: 大部分用来定位局部变量和参数
    其余的就各自拆开来用,这里不做过多的讲解
    这里面不对寄存器做更加深入的讲解,有兴趣的同学可以看看王爽的 《汇编语言(第3版) 》
    另外, 点击标签 寄存器 (FPU) 可以切换显示寄存器的方式

    4.数据窗口:

    数据窗口

    数据窗口主要的即为程序或者内存的数据,右键可以切换显示方式

    5.堆栈窗口:(在动态调试方面十分重要)

    堆栈窗口

    主要存放线程的临时数据,可以用于动态调试.

    6.命令行窗口

    命令行窗口

    用于执行一些OD命令
    例如: bp+API函数名称(内存地址)  设置断点

    0x02 一些OD常用操作

    为了方便演示下面的操作,笔者写了一段代码来检测explorer.exe进程的程序
    代码如下(C):

    #include <windows.h>
    #include <tlhelp32.h>   
    #include <stdio.h>
    int main()
    {
            char* procressName = "explorer.exe";
            char pName[MAX_PATH];
            strcpy(pName, procressName);
            CharLowerBuff(pName, MAX_PATH);
            PROCESSENTRY32 currentProcess;
            currentProcess.dwSize = sizeof(currentProcess);
            HANDLE hProcess = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
            if (hProcess == INVALID_HANDLE_VALUE)
            {
                    printf("函数CreateToolhelp32Snapshot调用失败!\n");
                    return FALSE;
            }
    
            BOOL bMore = Process32First(hProcess, ¤tProcess);
            while (bMore)
            {
                    CharLowerBuff(currentProcess.szExeFile, MAX_PATH);
                    if (strcmp(currentProcess.szExeFile, pName) == 0)
                    {
                            CloseHandle(hProcess);
                            printf("发现explorer.exe");
                            system("pause");
                            exit(0);
                    }
                    bMore = Process32Next(hProcess, ¤tProcess);
            }
            printf("没有发现explorer.exe\n");
            CloseHandle(hProcess);
            printf("Cracke Success!");
            getchar();
            return 0;
    }

    编译后运行
    运行结果

    那现在我们开始来绕过这个检测explorer.exe的程序吧
    打开OD

    1.载入OD的几种方法

    (1). 直接点击打开新的可执行文件按钮(或者按F3)载入新的exe
    (2). 将exe文件直接拖拽到反汇编窗口中进行加载
    (3). 进程附加

    • 前提是你需要先运行所要附加的exe

    a.运行要附加的exe

    • 点击文件->附加,找到需要附加的进程,选中后点击附加

    b.附加exe

    2.字符串搜索方法

    在反汇编窗口上点击右键->中文搜索引擎[根据需要你可以选取相应的筛选选项(1.搜索ASCII,2.搜索UNICODE,3.智能搜索)]

    名称 别称 简写为
    ASCII ANSI A
    UNICODE WideChar W

    程序API里面的A/W就是指的这两种编码
    用刚刚那个检测explorer进程的exe为例子:

    ASCII搜索:
    ASCII

    Unicode搜索:
    Unicode

    智能搜索:
    智能

    在这里面笔者推荐在搜索字符串的时候使用智能搜索

    3.下断点以及删除断点:

    下断点:

    1. 快捷键下断点 快捷键F2 :用鼠标选中需要下断的代码,按一下F2
      如图:
      快捷键下断点

    2. 基本下断: 用鼠标选中代码 右键 -> 断点 -> 切换
      如图:
      基本下段

    3. 命令行下断:
      • 先找到需要下断的内存地址:
        找到内存地址
    • 在命令行窗口输入 bp+ 内存地址
    • 本程序中需要下断的内存地址为: 00B510EC 输入命令:  bp 00B510EC, 回车
      命令行下断

    删除断点:

    1. 基础删除断点方法:
      • 查看 –> 断点 然后就进入到显示断点窗口(快捷键 Alt+B),如图:
        断点窗口
    • 用鼠标点击需要删除的断点右键删除即可
      这里对断点的介绍并不是很全面,只是起到了一个引导知识的作用

      4.保存文件:

      就以这个检测Explorer.exe的程序为例子
      我们需要将程序改为直接输出Cracke Success!
      首先搜索字符串找到Cracke Success!
      如图:
      找到字符

    双击字符串跟踪
    向上翻一翻字符串会发现 没有发现explorer.exe \n这段ASCII,用鼠标选中ASCII所在的代码,如图所示
    跟踪字符串

    这里面用白色圆形所传出来的是一段跳转,我们需要跟踪一下
    这里的红线代表的是跳转实现,而白线则是不实现。
    跟踪explorer.exe

    发现是从je short Checking.00B510EC跳转过来
    跟踪跳转

    这里面普及一下汇编的条件跳转指令:

    指令名称 英文全称(不重要) 功能
    jmp jump 无条件跳转
    je/jz jump zero 结果为0跳转
    jnz/jne jump not zero 结果不为0跳转
    js jump if sign 结果为负跳转
    jns jump if not sign 结果为正跳转
    jb jump below 比较结果小于跳转
    jnb jump not below 比较结果大于或者等于则跳转

    回到这个程序中.
    程序的意思就是调用CreateToolhelp32Snapshot函数去创造一个当前进程快照,利用ProcessFirstProcessNext这两个API函数去遍历进程快照的进程并且与Explorer.exe做比较(cmp指令),如果结果为真就不跳转,输出“发现explorer.exe”,如果结果为假就跳转“没有发现explorer.exe Cracke Success!”
    基础分析

    所以这其中的关键就在于遍历查找部分
    遍历查找

    用鼠标选中后,双击
    用鼠标选中后双击

    将条件跳转的je改为无条件跳转的jmp
    je改jmp

    右键 -> 复制到可执行文件 –> 所有修改
    复制所有修改

    点击全部复制
    点击全部复制后

    右键后,找到保存文件
    保存文件

    我们将其重命名为Cracker-Checking Explorer.exe 保存在桌面上
    保存到桌面后

    运行一下
    运行

    这个进程检测就被我们绕过了

    0x03 常用汇编指令扫盲(只是起到抛转引玉的作用,具体的讲解还请看作者的  从零开始撸汇编系列  )

    1.通用数据传送指令

    指令名称 功能 备注
    mov(MOV) 传送赋值 英文(move)      例子:mov a,b 把b的值传给a
    push(PUSH) 压栈 英文(Push noto the stack)
    pop(POP) 出栈 英文(pop from the stack)    例子: 由于堆栈平衡原理,所以有push就有pop
    xchg(XCHG) 交换 英文(Exchange)

    2.标志寄存器传送指令

    指令名称 功能 备注
    pushf(PUSHF) 标志进栈 英文(push the flag)
    popf(POPF) 标志出栈 英文(pop the flag)

    3.条件跳转(一般配合cmp使用)

    指令名称 指令英文全拼 功能 备注
    jmp(JMP) jump 无条件跳转 强制跳转
    jz(JZ)/je(JE) jump if zero,or equal 结果为0(相等)跳转 检测Z位
    jnz(JNZ)/jne(JNE) jump if not zero,or not equal 结果不为0(不相等)跳转 检测Z位
    js(JS) jump if sign 结果为负跳转 检测S位
    jns(JNS) jump if not sign 结果为正跳转 检测S位
    jb(JB) jump below 比较小于跳转 检测C位
    jnb(JNB) jump not below 比较大于或者等于跳转 检测C位

    What is Z位 S位 C位?

    0x01认识OD中在寄存器窗口中认识了标志寄存器,如图:
    标志寄存器

    这里用jnz去举例,jnz的判断检查Z位,当Z位是0的时候就跳转,在Z位是1的时候就不跳转

    Z=1

    Z=0

    4.子程序

    指令名称 指令英文全拼 功能
    call(CALL) CALL 调用子程序或者函数
    ret(RET) return 返回到

    5.循环指令

    LOOP loop

    6.算数指令

    指令名称 功能
    add(ADD) 加法
    sub(SUB) subr(SUBR) 减法
    mul(MUL) 乘法
    div(DIV) divr(DIVR) 除法

    6.空指令

    空指令:nop

    7.比较指令

    比较指令:cmp

    例如:cmp x,y      比较x,y是否相等

    0x04 总结

    本篇文章介绍了OD 的基础使用,以及一些基础操作
    介绍了一些常用的汇编指令,如果有哪些常用的汇编指令没有补充到位的以及文章中出现瑕疵的地方欢迎在评论区中指出,我会及时审改的
    附件中有关于本篇文章的一些练习


    游客,如果您要查看本帖隐藏内容请回复

    评分

    参与人数 2魔法币 +10 收起 理由
    icq5f7a075d + 5 感谢你的分享,i春秋论坛有你更精彩!.
    cl058015 + 5

    查看全部评分

    本帖被以下淘专辑推荐:

    • · sc|主题: 48, 订阅: 2
    • · 8086|主题: 5, 订阅: 0
    从零开始的程序逆向之路  第一章——认识OD(Ollydbg)以及常用汇编扫盲
    https://bbs.ichunqiu.com/thread-43041-1-1.html
    (出处: i春秋社区-分享你的技术,为安全加点温度)
    使用道具 举报 回复

    从零开始的程序逆向之路  第一章——认识OD(Ollydbg)以及常用汇编扫盲
    https://bbs.ichunqiu.com/thread-43041-1-1.html
    (出处: i春秋社区-分享你的技术,为安全加点温度)
    使用道具 举报 回复
    从零开始的程序逆向之路  第一章——认识OD(Ollydbg)以及常用汇编扫盲
    https://bbs.ichunqiu.com/thread-43041-1-1.html
    (出处: i春秋社区-分享你的技术,为安全加点温度)
    使用道具 举报 回复
    发表于 2018-10-20 22:31:36

    从零开始的程序逆向之路  第一章——认识OD(Ollydbg)以及常用汇编扫盲
    https://bbs.ichunqiu.com/thread-43041-1-1.html
    (出处: i春秋社区-分享你的技术,为安全加点温度)
    使用道具 举报 回复
    从零开始的程序逆向之路  第一章——认识OD(Ollydbg)以及常用汇编扫盲
    https://bbs.ichunqiu.com/thread-43041-1-1.html
    (出处: i春秋社区-分享你的技术,为安全加点温度)
    使用道具 举报 回复
    从零开始的程序逆向之路  第一章——认识OD(Ollydbg)以及常用汇编扫盲
    https://bbs.ichunqiu.com/thread-43041-1-1.html
    (出处: i春秋社区-分享你的技术,为安全加点温度)
    使用道具 举报 回复
    本帖最后由 icq288a6cce 于 2018-8-1 19:41 编辑

    BOOL bMore = Process32First(hProcess, ¤tProcess);
    代码第19行有错误。应该是
    BOOL bMore = Process32First(hProcess, &currentProcess);
    &curren 被解析成HTML实体了
    使用道具 举报 回复
    icq288a6cce 发表于 2018-8-1 19:36
    BOOL bMore = Process32First(hProcess, ¤tProcess);
    代码第19行有错误。应该是
    BOOL bMore = Process32Fi ...

    的确是,感谢补充
    使用道具 举报 回复
    发表于 2018-7-20 09:47:34
                
    使用道具 举报 回复
    这个很不错 支持一下
    部分回复是自动回帖回的。
    使用道具 举报 回复
    学习学学习
    使用道具 举报 回复
    发表于 2018-7-20 14:39:49
    支持~
    使用道具 举报 回复
    感谢分享
    使用道具 举报 回复
    发表于 2018-7-20 16:59:46
    工具包里很多文件报毒怎么说
    使用道具 举报 回复
    发表于 2018-7-20 17:19:39
    写得非常好!
    使用道具 举报 回复
    发表于 2018-7-20 20:32:52
    6666666666666666666666666666666666666
    使用道具 举报 回复
    发表于 2018-7-20 21:15:33
    HardMan 发表于 2018-7-20 16:59
    工具包里很多文件报毒怎么说

    因为有些工具是杀毒软件误报,您如果放心不下就在虚拟机中运行吧
    使用道具 举报 回复
    好好学习一下
    使用道具 举报 回复
    好东西,谢谢
    使用道具 举报 回复
    表哥给你提个建议,做视频教程吧,图文能累死你
    使用道具 举报 回复
    真的能学到很多,感谢
    抱歉抱歉◍´꒳`◍)告辞!!
    使用道具 举报 回复
    发新帖
    您需要登录后才可以回帖 登录 | 立即注册