• WinForm的EXE破解(基于IL修改)


    一、目的与目标

    1.1 主题目的

      部门新人较多,希望通过本次分享让同学们对以下知识点有个认识:

    • 破解原理
    • IL原理
    • 强签名与加密
    • resx文件

       由于时间有限,本文作为部门分享演示过程中辅助性文档,会对文中一些关键点列出参考学习的博客地址,供大家课后学习。

    1.2 本次实战最终要达到的效果

       本次实战中所要达成效果如下图:

    1. 登录时跳过,判断是否注册函数,直接进入业务操作模块;

    2. 修改logo大图,改成其他图片,如下图所示;

    clipboard_thumb11                 clipboard_thumb1  

                                    图一 破解前                                                             图二 破解后(去掉登录限制)

    二、破解过程

      一个程序破解的过程,无论是.net还是c++等,过程大致都是这样。

    1.了解业务过程(绕过的点);

    2. 找到对应的源代码;

    3. 删除验证代码;

    4. 重新为编译可执行文件;

    *,只是c++等,需要更为复杂的逆向工程,脱壳等步骤;

    那我们就按此步骤开始;

    【【源代码】】从此处获取

    2.1. 找到需要绕过的点;

        经过对需要破解的程序分析,最早突破就在找到【登录】按钮的代码位置;通常验证的函数都应该独立封装为一个函数;所以得出两种绕过验证的方式:

    • 删除业务逻辑中的验证代码;
    • 修改验证业务逻辑,不管是否注册都返回已注册;

    2.2. 找到对应源代码

         这里借用反编译工具来将IL反编译可读性更高的c#代码,这样更快速的帮助我们定位到button点击事件或验证函数(当然没有这步也是可以,只是为了提高我们理解代码的速度)。

          反编译工具通常用这两种“Reflector” 和 “ILSpy” ,Reflector的反编译代码还原度更高但是非开源非免费(可以找低版本6.8以下),ILSpy反编译程度不如Reflector高,但是开源免费,大家可以视自己具体的需求来选取;

    1. 使用Reflector查看源代码, 操作说明

    2. 查看WindowsFormsApp1.exe ,如下图可以看到,按钮【登陆】的业务逻辑为,先调用Class1.getKey()方法来判断是否注册;

    clipboard_thumb13

    图四,反编译后查看按钮点击事件

    2.3. 使用ildasm将exe和dll 逆向成IL文件

    2.3.1 使用ildasm 将exe反编译为il文件并修改

          我们使用微软官方提供了ildasm.exe来将.net程序反向成il文件

    1. 找到 ildasm.exe 通常在C:Program Files (x86)Microsoft SDKsWindowsv8.1AinNETFX 4.5.1 Tools;或者使用vs提供的开发人员命令操作符。

              但是需要注意路径,在demo中我已经将ildam和ildasm都打包到文件夹中了

         2.  输入 ildasm.exe WindowsFormsApp1.exe /out=ilwindowsformsapp1.il 

         3.  修改IL代码,跳过验证:

               1.打开windowsformsapp1.il;

    clipboard_thumb17

            2. IL重点行数分析:

                 128行,调用 Class1.getKey(),压入值到堆栈;

                 129行,idc.i4.0在Stack 中int长度为4,值为0=>对应代码为if(Class1.getKey()==false)中的false

                 130行,ceq 比较

                 136行,定义文本"请先注册"

                 137行,调用MessageBox.show

                 138行, pop 弹出堆栈中的值

                 139行,转向 IL 0028,对应代码if(){}else{}那个代码块

             3. 修改il方式一 (不调用:Class1.getkey())

                  将128行修改为:IL_0001: ldc.i4.1 //call bool [ClassLibrary1]ClassLibrary1.Class1::getkey()

                  使用2.3.2重新生成exe,反编译后可以看到代码变成下图:

    clipboard_thumb18

               4. 逻辑修改二,依然调用验证。但是取消else代码块

                    将139行注释。注释后可以参照方法2.3.2重新编译生成exe。查看新的exe的源代码如下:

    clipboard_thumb21

    2.3.2 重新生成windowsformsapp1.exe(记得这一步哦)

            ilasm.exe windowsformsapp1.il /out=windowsformsapp1.exe

    2.3.3  其他修改方案

           不改windowform1.il,修改ClassLibrary.dll的验证逻辑

          类似方案一,留作大家自己研究

    2.4. 修改资源文件,修改图片;

    修改exe中的图片,使用以下步骤:

    1. 将resources文件转为resx

    ResGen.exe WindowsFormsApp1.Properties.Resources.resources WindowsFormsApp1.Properties.Resources.resx

    2. 使用vs打开新生成的resx文件,替换旧图片icon-02.png,如下图:

    clipboard_thumb22

    3. 或用记事本打开resx文件,将base64文本替换为新图片的base64

    4. 重新编译为resources

          ResGen.exe WindowsFormsApp1.Properties.Resources.resx WindowsFormsApp1.Properties.Resources.resources

    * .resources,编译后的资源文件,是无法直接打开无法直接保存图片文件;使用反编译工具反编译后默认是产生.resources;而.resx 可被VS打开的文件;

    那怎么将resources转为resx呢,我们可以利用官方提供的Resgen.exe进行文件转换

    https://docs.microsoft.com/zh-cn/dotnet/framework/tools/resgen-exe-resource-file-generator

    三、防御方法

    既然.net这么轻易的被破解,那我们要怎么对我们的程序进行安全防护,以保证我们的代码安全呢;主要也是通过以下两点:

    • 使用强签名,防止DLL被篡改;
    • 使用代码混淆工具,防止被反编译源码;

    强签名:

         本文不在描述,强签名的作用和使用方式

         官方的使用方式   一些博友的博客

    代码混淆工具:

    代码混淆工具有很多,如:微软官方的Dotfuscator,有开源的ConfuserEX;还有其他的xeoncode、foxit;

    代码混淆可以单独作为一个主题铺开来说(java,ios 等等都面临这个问题,所以不要过分担心.net)

    ConfuserEx操作步骤:https://blog.csdn.net/xiaoyong_net/article/details/78988264

    四、最后

    最后,作为开发人员的我们并不应该法盗用他人劳动成果,这篇文章只是为了让大家更好的认识IL语言,以及IL语言模式的缺点与防御方式,让大家能够更改好的提高防范意识,本文并未真正深入到破解细节中去,仅起来点睛入门的作用,有兴趣的同学可以自行深入去研究,win32下的逆向工程、加壳、脱壳等技术;

    【【源代码】】从此处获取

  • 相关阅读:
    iOS 11: CORE ML—浅析
    Android 平台 Native 代码的崩溃捕获机制及实现
    H5直播避坑指南
    Mac系统升级至OS X Mavericks后Genymotion出现的问题及解决方法
    Android 4.4 KitKat终于支持录屏(Screen Recording)了!
    Android开发者资源大汇总
    用AndroidSDK中的Face Detector实现人脸识别
    [Android设计模式]Android退出应用程序终极方法
    ActionBarCompat 教程-实现Action Bar
    使用Roboguice依赖注入规划Android项目
  • 原文地址:https://www.cnblogs.com/ksh-xy/p/9737646.html
Copyright © 2020-2023  润新知