用户
搜索
  • TA的每日心情

    2017-8-12 13:24
  • 签到天数: 217 天

    连续签到: 3 天

    [LV.7]常住居民III

    i春秋签约作家

    Rank: 7Rank: 7Rank: 7

    39

    主题

    816

    帖子

    44

    魔法币
    收听
    3
    粉丝
    12
    注册时间
    2015-11-20

    核心白帽i春秋签约作者积极活跃奖

    发表于 2017-4-12 17:57:31 3348902
    之前答应坏蛋的文章拖了这么久才写,本身我也是个彩笔,没有什么高神的东西拿得出来,论坛好多表哥都发表过破解的文章,表示小菜我也写几篇吧。打算写一个系列的吧,网络验证,本地爆破,注册机编写啥的,满足一下大家的口味。还有啊,破解软件其实不用脱壳的,看到论坛的大大还讲了脱壳的帖子,自身感觉没必要找入口点打个补丁就够了,ok,开始吧

    VMP壳原理
    1.与传统的加壳工具不同,不是简单的把目标进行压缩、内存解压运行,而是修改目标源码,让目标的部分指令在vmp创建的虚拟环境下运行,虚拟环境中无操作数比较指令、条件跳转和无条件跳转指令;
    2.被修改替换的目标指令最终形成的字节码有前后相关性,即你改变其他任意一个字节会影响到所有被vm虚拟化的指令
    3.vmp的虚拟机其实是一个字节码解释器,循环的读取指令并执行,并且只有一个入口和一个出口

    说明:这个程序是从一位破解大牛的课程里拿到的,只为本次文章做演示,别无其他用途

    0x01
    准备工具:PEID 0.95
    DetectItEasy V1.0
    Ollydbg
    樱花补丁制作工具

    0x02 show  
    载入PEID看一下壳子
    1.png
      看一下EP区段,确实是vmp的壳子
    2.png

    推荐一款工具DetectItEasyV1.0,这个工具无论程序加了什么壳子,都能查看到是什么语言编写的程序。
    3.png
    Delphi语言,vmp壳  没毛病吧?
    下一步载入OD,不用多说
    4.png
    因为程序加了壳,乱乱的代码,看不懂,所以我们要先把程序跑起来,等壳子加载完成了,就能看到里面的代码了,F9运行
    5.png
    CTRL+G来到00401000,来到程序段
    因为之前打开过,出现这样的情况就是解码状态,未解码状态应该是带颜色的
    6.png
    7.png

    8.png
    现在是这样了,没有之前那些看不懂的乱码了,因为壳子跑完,就可以使用字符串查找了
    9.png
    【用户密码错误】,这就是关键字
    右键-中文搜索引擎-智能搜索 find字符串
    10.png
    看到了吧,如果不把壳子跑完,是看不到字符串的,所以加了壳的程序级的把程序先跑起来
    双击-来到代码处
    11.png
    往上找关键跳转
    12.png
    Jmp不是关键跳,因为上面还有一个跳跳过这个jmp,所以关键跳是jnz
    ,F2下断,回到程序输入密码,
    13.png
    仔细看,下完断点之后,点击确定按钮,并没有提示错误信息,因为程序被断下来,还没有执行到这一步,回到OD
    14.png

    程序跳转已实现,要让他不实现,可以
    ①、修改Z标志位,使其变灰,不实现
    ②、修改jnz位jmp
    ③、使用Nop或者00填充
    但是,单独修改Z标志位是不能保存程序的,只能做测试使用
    15.png

    1. <font size="3">00539AC0   . /75 31         jnz short Protecti.00539AF3</font>
    复制代码

    复制这条信息,后面打补丁用
    然后呢,我们改用NOP填充

    16.png

    Nop就是空,到这不执行,没有
    ,好了,回到程序试一下,F8 单步往下走,直接跳过登陆窗口了
    回到OD,保存程序到可执行文件
    17.png
    叮咚,因为加了vmp的壳,并没法保存
    下一步,我们打开樱花补丁制作工具
    18.png
    选择文件,
    19.png
    信息框里随便写点东西就好,然后,添加-生成补丁
    20.png
    生成之后,打开看一下
    21.png
    自己添加了一个弹窗
    22.png

    什么都不用输入,直接确定,就可以跳过登陆窗口了,OVER

    本文主要讲的是,程序破解不需要脱壳,打个补丁就完事,当然后面用到的程序可能补丁量可能会多一点,只要有耐心就好了,毕竟玩逆向,玩破解要有耐心啊。

    这个软件没有破解注册内容,其实只要找到跳转修改一下下就好了,然后对应代码打下补丁,就当你们拿去实战了,用到的案例程序我会打包,工具在破解工具暴力有,就不发了。

    打算出一个系列的,还请各位表哥多多关注,在本帖底下留言支持我哦!
    【附件下载】
    案例文件.rar (3.41 MB, 下载次数: 27)

    本帖被以下淘专辑推荐:

    yyyxy 管理员 六国战旗移动展示平台! 秦 楚 燕 魏 齐 赵
    来自 26#
    发表于 2017-4-18 16:26:34
    文章奖励介绍及评分标准:http://bbs.ichunqiu.com/thread-7869-1-1.html,如有疑问请加QQ:286894635!
    奖金
    点评
    100
    思路不错,整体逻辑清晰。

    欢迎加入i春秋QQ群大家庭,每人只能任选加入一个群哦!投稿请加我QQ:286894635。
    i春秋-楚:533191896
    i春秋-燕:129821314
    i春秋-齐:417360103
    i春秋-秦:262108018
    使用道具 举报 回复
    guiguzi 发表于 2017-4-17 16:07
    在破解的过程中  直接跳到了 00401000  , 不同的语言  应该程序的入口点会不一样   能否详细说下   不同的 ...

    1.Borland Delphi 6.0 - 7.0
      
    PUSH EBP
      MOV EBP,ESP
      ADD ESP,-14
      PUSH EBX
      PUSH ESI
      PUSH EDI
      XOR EAX,EAX
      MOV DWORD PTR SS:[EBP-14],EAX
      MOV EAX,unpack.00509720
      CALL unpack.0040694C
      
    2.Microsoft Visual C++ 6.0
      
    PUSH EBP ; (初始 cpu 选择)
      MOV EBP,ESP
      PUSH -1
      PUSH Screensh.00563740
      PUSH Screensh.0049C78C ; SE 处理程序安装
      MOV EAX,DWORD PTR FS:[0]
      PUSH EAX
      MOV DWORD PTR FS:[0],ESP
      SUB ESP,58
      
    3.Microsoft Visual C++ 6.0 [Overlay] E语言
      
    PUSH EBP
      MOV EBP,ESP
      PUSH -1
      PUSH Nisy521.004062F0
      PUSH Nisy521.00404CA4 ; SE 处理程序安装
      MOV EAX,DWORD PTR FS:[0]
      PUSH EAX
      MOV DWORD PTR FS:[0],ESP
      
    4.Microsoft Visual Basic 5.0 / 6.0
      
    JMP DWORD PTR DS:[] ; MSVBVM60.ThunRTMain
      PUSH PACKME.00407C14
      CALL
      ADD BYTE PTR DS:[EAX],AL
      ADD BYTE PTR DS:[EAX],AL
      ADD BYTE PTR DS:[EAX],AL
      XOR BYTE PTR DS:[EAX],AL
      或省略第一行的JMP
      push dumped_.0040D4D0
      call
      add byte ptr ds:[eax],al
      add byte ptr ds:[eax],al
      add byte ptr ds:[eax],al
      xor byte ptr ds:[eax],al
      add byte ptr ds:[eax],al
      
    5.BC++
      
    JMP SHORT BCLOCK.0040164E
      ; CHAR 'f'
      ; CHAR 'b'
      ; CHAR ':'
      ; CHAR 'C'
      ; CHAR '+'
      ; CHAR '+'
      ; CHAR 'H'
      ; CHAR 'O'
      ; CHAR 'O'
      ; CHAR 'K'
      NOP
      00401649 |E9 DB E9
      DD OFFSET BCLOCK.___CPPdebugHook
      MOV EAX,DWORD PTR DS:[4EE08B]
      SHL EAX,2
      MOV DWORD PTR DS:[4EE08F],EAX
      PUSH EDX
      PUSH 0 ; /pModule = NULL
      CALL   ; \GetModuleHandleA
      MOV EDX,EAX
      
    6.Dasm:
      
    ; /pModule = NULL
      CALL   ; \GetModuleHandleA
      MOV DWORD PTR DS:[40350C],EAX
      CALL   ; [GetCommandLineA
      MOV DWORD PTR DS:[403510],EAX
      PUSH 0A ; /Arg4 = 0000000A
      PUSH DWORD PTR DS:[403510] ; |Arg3 =  00000000
      PUSH 0 ; |Arg2 = 00000000
      PUSH DWORD PTR DS:[40350C] ; |Arg1 =  00000000
      
    7.VC8 -> Microsoft Corporation
      
    call QQRecord.00446C13                    ; (Initial CPU selection)
      jmp QQRecord.0043DD01
      push ebp
      mov ebp,esp
      push ecx
      push ebx
      mov eax,dword ptr ss:[ebp+C]
      add eax,0C
      mov dword ptr ss:[ebp-4],eax
      mov ebx,dword ptr fs:[0]
      mov eax,dword ptr ds:[ebx]
      mov dword ptr fs:[0],eax
      mov eax,dword ptr ss:[ebp+8]
      mov ebx,dword ptr ss:[ebp+C]
      mov ebp,dword ptr ss:[ebp-4]
      mov esp,dword ptr ds:[ebx-4]
      jmp eax
      pop ebx
      leave
      retn 8
      
    8.PB
      
    PUSH EBP
      MOV EBP, ESP
      PUSH EBX
      PUSH ESI
      PUSH EDI
      MOV EBX, 00416000
      TEST WORD PTR CS:[004113D2], 850F0004
      FILD DWORD PTR [EAX]
      ADD [EAX], AL
      PUSH 00000000
      CALL [00418454] ; CoInitialize
      CALL 0041100A
      MOV [EBX+00000108], 00000001
      LEA EAX, [EBX+00000290]
      PUSH EAX
      CALL [004183DC] ; GetVersionExA
      SUB ESP, 00000044
      MOV [ESP], 00000044
      MOV [ESP+2C], 00000000
      PUSH ESP
      CALL [004183D4] ; GetStartupInfoA
      MOV EAX, 0000000A
      TEST [ESP+2C], 00000001
      JZ 410DBC
      MOVZX EAX, WORD PTR [ESP+30]
      ADD ESP, 00000044
      MOV [EBX+000000FE], EAX
      CALL [004183B0] ; GetCommandLineA
      
    9.Borland C++ 1999
      
    jmp short VBto_UNP.004014E2
      bound di,dword ptr ds:[edx]
      inc ebx
      sub ebp,dword ptr ds:[ebx]
      dec eax
      dec edi
      dec edi
      dec ebx
      nop
      jmp 0097157A
      mov eax,dword ptr ds:[57008B]
      shl eax,2
      mov dword ptr ds:[57008F],eax
      push edx
      push 0
      call  <jmp.&kernel32.GetModuleHandleA>
      
    10,Microsoft Visual C++ ver. 8.0
      
    call SolidPDF.004A3F56
      jmp SolidPDF.004A38AF
      int3
      int3
      int3
      int3
      int3
      int3
      push ecx
      lea ecx,dword ptr ss:[esp+8]
      sub ecx,eax
      and ecx,0F
      add eax,ecx
      sbb ecx,ecx
      or eax,ecx
      pop ecx
      jmp SolidPDF.004A3810
      push ecx
      lea ecx,dword ptr ss:[esp+8]

    很多论坛都应该发过这些特征的,没见过?
    使用道具 举报 回复
    在破解的过程中  直接跳到了 00401000  , 不同的语言  应该程序的入口点会不一样   能否详细说下   不同的语言  需要怎么操作  才能  找到相对应的程序入口点    总不能一直靠经验吧   呵呵
    使用道具 举报 回复
    guiguzi 发表于 2017-4-17 16:07
    在破解的过程中  直接跳到了 00401000  , 不同的语言  应该程序的入口点会不一样   能否详细说下   不同的 ...

    没发现我发的都是易语言?呵呵
    使用道具 举报 回复
    这只是各个语言的OEP的特征    我想问的是 在VMP 之后   各个语言通过什么方式可以 找到00401000这个地址,即程序的OEP  毕竟 不是所有的程序的OEP 都是 00401000这个地址  谢谢
    使用道具 举报 回复
    guiguzi 发表于 2017-4-17 16:07
    在破解的过程中  直接跳到了 00401000  , 不同的语言  应该程序的入口点会不一样   能否详细说下   不同的 ...

    入口点不看地址看特征
    使用道具 举报 回复
    本帖最后由 常瀚元 于 2017-4-13 18:34 编辑

    VMP加壳是吾爱几个月前发出来的,软件是Shark恒免费百集教程第一课的。VMP加壳完全混淆不可能让你查到字符串,至今网上分析VMP最新教材在吾爱首页精华帖。没有喷的意思,就是想让新手知道VMP没这么容易逆向。
    使用道具 举报 回复
    不断学习~谢谢@!
    使用道具 举报 回复
    发表于 2017-4-13 10:35:04
    全是干货,小白觉得看到了新大陆,希望继续更新!!!
    使用道具 举报 回复
    Keellee 发表于 2017-4-13 10:35
    全是干货,小白觉得看到了新大陆,希望继续更新!!!

    我是菜逼,我是菜逼
    使用道具 举报 回复
    发表于 2017-4-13 12:46:42
    学习了
    使用道具 举报 回复
    发表于 2017-4-13 16:29:24
    来学习了,感谢分享
    使用道具 举报 回复
    发表于 2017-4-13 16:54:25
    感谢分享经验
    使用道具 举报 回复
    发表于 2017-4-13 19:59:59
    常瀚元 发表于 2017-4-13 18:33
    VMP加壳是吾爱几个月前发出来的,软件是Shark恒免费百集教程第一课的。VMP加壳完全混淆不可能让你查到字符 ...

    有附件,自己试试就知道
    使用道具 举报 回复
    发表于 2017-4-13 20:03:56
    常瀚元 发表于 2017-4-13 18:33
    VMP加壳是吾爱几个月前发出来的,软件是Shark恒免费百集教程第一课的。VMP加壳完全混淆不可能让你查到字符 ...

    VMP分版本的
    使用道具 举报 回复
    发表于 2017-4-14 09:14:20
    好好学习!
    使用道具 举报 回复
    发表于 2017-4-14 13:38:53
    我以为是VMP还原 满怀期待的点进来了。。
    http://www.dbgpro.com
    使用道具 举报 回复
    发表于 2017-4-14 14:20:57
    送到法国烧烤搭建
    使用道具 举报 回复
    发表于 2017-4-14 14:41:31
    MrXiao 发表于 2017-4-14 13:38
    我以为是VMP还原 满怀期待的点进来了。。

    我的目的是破解这个软件,不是逆向出其中的原理,目的不同,用到的方法不同
    使用道具 举报 回复
    发表于 2017-4-14 15:26:19
    z7788520 发表于 2017-4-14 03:41
    我的目的是破解这个软件,不是逆向出其中的原理,目的不同,用到的方法不同 ...

    有时间分享点VM还原的
    http://www.dbgpro.com
    使用道具 举报 回复
    123下一页
    发新帖
    您需要登录后才可以回帖 登录 | 立即注册