飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 4096|回复: 8

[求助] VM中eflags值到底是怎么回事

[复制链接]
  • TA的每日心情

    昨天 16:00
  • 签到天数: 911 天

    [LV.10]以坛为家III

    发表于 2018-10-12 12:30:18 | 显示全部楼层 |阅读模式
    看了wai1216老师的贴子 https://www.chinapyg.com/forum.p ... =VMP%2B%B1%AC%C6%C6

    里面有这句话:

    ~zf = vm_p(not(0x40),eflags) = 0

    这里的eflags,应该是原程序里跳转时eflags值吧?

    找了个测试程序,未加壳时,填写假码1,原程序这里eflags的值是0x246, 是跳转的,如果修改Z标志位,是不跳转的话,那么eflags值是0x206



    被VM后,在0045E8A0 PUSHFD处下ESI == 0x49375B,修改eax为0x40就爆破成功。

    -----------------------------------------------------------------------------------------------------------------------

    而如果我在这里下条件断点。



    在0045E88D NOT     EAX 处下条件断点:ESI == 0x49375B,走到0045E89E时,这里

    EDX=0x286,EAX=0x40,

    而原贴中,老师说。
    ~zf = vm_p(not(0x40),eflags) = 0

    对应于此程序,eflags应该是EDX,即0x286, 但是在未VM时,这里跳转的eflags是0x246,

    不明白的就是这里,VM的话也是不可能对原程序的流程和结果改变的吧,也不可能改变原来eflags的值的。

    那么eflags的值应该还是0x246的,为什么这里EDX却等于0x286了呢?明显不相同了!!! 请问到底是怎么回事。



    求助wai1216老师。@wai1216

    测试程序 链接: https://pan.baidu.com/s/1dG019Bj 密码: a9my


    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?加入我们

    x

    点评

    提问请不要点将,想回答你的都不好意思回答了~~~  发表于 2018-10-12 19:32
    PYG19周年生日快乐!
  • TA的每日心情

    昨天 16:00
  • 签到天数: 911 天

    [LV.10]以坛为家III

     楼主| 发表于 2018-10-12 12:35:34 | 显示全部楼层
    ~zf = vm_p(not(0x40),eflags) = 0

    zf   = and(0x40,eflags) = 1  

    eflags值变化了。不明白怎么回事。
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2016-4-19 21:35
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2018-10-13 11:35:44 | 显示全部楼层
    本帖最后由 wai1216 于 2018-10-13 17:46 编辑

    我稍微调试了下。用这个demo来加例子并不是很可取(原因在于test al,al处,为什么你可以研究下)。恩,vmp2.x 这个demo的pc(esi)是递减的,其次你找的地方并不对。你可以试试当你输入真码时,pc(esi)都达不了这个判断的地方。所以导致你有这样的疑惑。
    你应该去关注这个地方,以及去调试
    [Asm] 纯文本查看 复制代码
    00453EA4  /$ 83F8 7B        CMP EAX,0x7B
    00453EA7     74 06          JE SHORT VMP原版.00453EAF
    00453EA9  |. B8 00000000    MOV EAX,0x0
    00453EAE  |. C3             RETN
    00453EAF  |> B8 01000000    MOV EAX,0x1
    00453EB4  \. C3             RETN


    ----------------------
    你可以多看看我的视频,虽然声音不太清晰。
    并注意到
    [Asm] 纯文本查看 复制代码
    esi (rva:x00458137) <==> vm_nand( rva:0045E89E)
    eax == 0x00000040 && edx == eflags时
    eflags的数据是否一致以及之后调用
    [Asm] 纯文本查看 复制代码
    vm_add(rva:0x0045ECAC):0018F2F0  F4 F2 18 00 || 29 1E BA C8 || 08 6B BA C8
    的情况。
    这里才是重点,然后修改al。而之后test al,al会根据al再去改变eflags---------------------
    btw:可以去了解下cmp(sub等)指令 以及 jcc指令分别对应那些handle组合



    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    昨天 16:00
  • 签到天数: 911 天

    [LV.10]以坛为家III

     楼主| 发表于 2018-10-14 09:21:46 | 显示全部楼层
    wai1216 发表于 2018-10-13 11:35
    我稍微调试了下。用这个demo来加例子并不是很可取(原因在于test al,al处,为什么你可以研究下)。恩,vmp2.x ...

    挺晦涩挺难懂。看过老师的视频了,之前看了几遍,大概的VM流程算是似懂非懂了。但是不深入,本身VM的东西就好难。
    我纠结的是这里:

    当输入正确的注册码123时,
    在0045E89E    AND     EAX, EDX下断点,用脚本记录下,看日志,看样子应该是这里



    这里edx==286, 那么这个edx对应的原版eflags值都没有,


    (1)
    00453F1F  |. /74 0C         JE      SHORT VMP原版.00453F2D   ------这里
    00453F21  |. |B8 743F4500   MOV     EAX, VMP原版.00453F74              ;  Good job!
    00453F26  |. |E8 458AFDFF   CALL    VMP原版.0042C970
    00453F2B  |. |EB 0A         JMP     SHORT VMP原版.00453F37
    00453F2D  |> \B8 883F4500   MOV     EAX, VMP原版.00453F88              ;  Try again!

    (2)
    00453EA4  /$  83F8 7B       cmp eax,0x7B
    00453EA7  |.  74 06         je short VMP原版.00453EAF        ------这里
    00453EA9  |.  B8 00000000   mov eax,0x0
    00453EAE  |.  C3            retn
    00453EAF  |>  B8 01000000   mov eax,0x1
    00453EB4  \.  C3            retn
    00453EB5      8D40 00       lea eax,dword ptr ds:[eax]
    00453EB8   .  E8 9BAEFFFF   call VMP原版.0044ED58
    00453EBD   .  C3            retn


    无论未加壳时,(1)还是(2),输入真码123时,eflags里都没有出现286的情况。

    那么这条记录: eax:40  edx:286 esi:494223 , eflags = 286是怎么出来的呢,一直纠结于这一点,想不明白。







    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?加入我们

    x

    点评

    已经说了,这个地方不关系到cmp+jccvm_p(not(0x40),eflags) --> and eax, edx 的 时候 eax, edx的值应该是什么呢 eax == 0x40, edx == not(eflags) 而不是 edx == 0x286 对应程序中 esi == 0x0045813B时,eip  详情 回复 发表于 2018-10-14 13:06
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2016-4-19 21:35
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2018-10-14 13:06:22 | 显示全部楼层
    本帖最后由 wai1216 于 2018-10-14 13:12 编辑
    hahacker 发表于 2018-10-14 09:21
    挺晦涩挺难懂。看过老师的视频了,之前看了几遍,大概的VM流程算是似懂非懂了。但是不深入,本身VM的东西 ...

    已经说了,这个地方不关系到cmp+jccvm_p(not(0x40),eflags) --> and eax, edx 的 时候
    eax, edx的值应该是什么呢
    eax == 0x40, edx == not(eflags) 而不是 edx == 0x286

    对应程序中
    esi == 0x0045813B时,eip == 0045E89E
    假码 not(0x293) ==  0xFFFFFD6C 真码 not(0x) == 0xFFFFFDB9判断

    ------------

    再回答你的问题
    这条eax:40  edx:286。修改此处能显示good jobs/try a again。说实话有点偶然性,与对vmp的使用不够成熟以及程序指令有关。
    我仔细看了看,其中虽然也会改变
    [Asm] 纯文本查看 复制代码
    0045F1BD Main     JPE VMP原版_.0045DCCB

    此处0045DCCB handle循环的次数有关,因为pf标志位进行了更改
    但不是重点,重点如下:

    你可以在之后的vm_add下断:
    [Asm] 纯文本查看 复制代码
    0045ECAC   0145 04          ADD DWORD PTR SS:[EBP+0x4],EAX           ; <== vm_add

    如果是假码,此时[ebp+0x4]的数据为(eax = 0)
    [Asm] 纯文本查看 复制代码
    Stack SS:[0018F2FC]=00453F1D (VMP原版_.00453F1D)

    那么对应到程序呢,我们可以看一看rva:00453F1D的数据是多少
    [Asm] 纯文本查看 复制代码
    00453F1D   84C0             TEST AL,AL
    00453F1F   74 0C            JE SHORT VMP原版_.00453F2D
    00453F21   B8 743F4500      MOV EAX,VMP原版_.00453F74                  ; ASCII "Good job!"
    00453F26   E8 458AFDFF      CALL VMP原版_.0042C970
    00453F2B   EB 0A            JMP SHORT VMP原版_.00453F37
    00453F2D   B8 883F4500      MOV EAX,VMP原版_.00453F88                  ; ASCII "Try again!"
    00453F32   E8 398AFDFF      CALL VMP原版_.0042C970

    而这个地方,恰好就是返回主程序的位置。
    我假设你已经知道更改为0x40,其实是关系到eip:0045ECAC时,调用vm_add时,更改了[ebp+0x4]的数据(也就是返回主程序的位置) ---> 0x00453F1D + 0x4
    然后你可以发现当返回主程序直接变为了eip:0x00453F21
    那么这条0x286的nand的含义搞定。
    btw:你可能会发现,当真码时,这里得到的也是0x00453F1D,但注意到运行此处,真码的eflags,以及al
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    昨天 16:00
  • 签到天数: 911 天

    [LV.10]以坛为家III

     楼主| 发表于 2018-10-15 08:14:13 | 显示全部楼层
    本帖最后由 hahacker 于 2018-10-15 08:20 编辑
    wai1216 发表于 2018-10-14 13:06
    已经说了,这个地方不关系到cmp+jccvm_p(not(0x40),eflags) --> and eax, edx 的 时候
    eax, edx的值应该 ...

    好像我问的问题越来越跑题了,偏离了中心思想,因为最基本性的问题没有弄明白,所以后面出现了更多的问题。那就是:

    ~zf = vm_p(not(0x40),eflags) = 0
    zf   = and(0x40,eflags) = 1  



    eflags到底是不是原程序中,跳转时的值。

    --------------------------------------------------------------------

    假设,如果我知道未加壳某程序时,输入假码1,判断条件是cmp xxx, xxx, je xxx,  OD走到je xxx时,此时eflags=0x999(只是假设)

    那么我VM后,在and eax,edx与非门时,同样的我输入1(输入不同的值,原程序中eflags的值是会变的,所以为了保证一致,我这里也输入1)
    如果eax是0x40,那么edx里保存的就是eflags了,那么此时判断跳转时,eflags的值(或是说edx的值)是否还是0x999 ???



    点评

    不是跑题,是理解不对,请你仔细分析 以及 看回复 1.vmp中 调用 nand的地方不止只有vm cmp/sub指令。还有其他运算会用到这些handle 2.不应该走到and eax,edx的时候。eax=0x40,edx=not(0x999) vm_p(not(0x40  详情 回复 发表于 2018-10-15 08:38
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2016-4-19 21:35
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2018-10-15 08:38:44 | 显示全部楼层
    hahacker 发表于 2018-10-15 08:14
    好像我问的问题越来越跑题了,偏离了中心思想,因为最基本性的问题没有弄明白,所以后面出现了更多的问题 ...

    不是跑题,是理解不对,请你仔细分析 以及 看回复
    1.vmp中 调用 nand的地方不止只有vm cmp/sub指令。还有其他运算会用到这些handle
    2.不应该走到and eax,edx的时候。eax=0x40,edx=not(0x999)
    vm_p(not(0x40),eflags)
    1.not eax //before not(0x40) after eax = 0x40
    2.not edx //before eflags after edx =  not(eflags)
    3.and eax,edx // 如上

    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    昨天 16:00
  • 签到天数: 911 天

    [LV.10]以坛为家III

     楼主| 发表于 2018-10-15 10:18:14 | 显示全部楼层
    wai1216 发表于 2018-10-15 08:38
    不是跑题,是理解不对,请你仔细分析 以及 看回复
    1.vmp中 调用 nand的地方不止只有vm cmp/sub指令。还 ...

    老师的第二句打错了吧。多打了个“不”字。2.不应该走到and eax,edx的时候。eax=0x40,edx=not(0x999)

    需要把“不”去掉吧。

    应该走到and eax,edx的时候。eax=0x40,edx=not(0x999)
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表