起因

最近在对接一个第三方平台。该平台只提供了Java版本的SDK,C#版本的还处于敬请期待状态。由于C#可以复用绝大部分代码,便考虑找一个Java到C#的转换器,在试用了几个软件之后,发现还是Java to C# Converter(下文简称Converter)好用一点。然而基本版功能受限(文件夹不能超过1000行代码,代码片段不能超过100行),高级版的则要$169。

在经历过自己写小程序转换Java、手写代码、利用Converter分批次转换、查找替换等方式完成C#版本之后。终于按捺不住心中的好奇心,研究了下软件的破解。

希望

首先看看这个软件是不是C#写的,将文件拖入ILSpy,一看之下,果然有惊喜。

嗯,惊喜就是虽然该软件是利用C#+WinForm写成的,但是很明显的经过了混淆。吓得我赶忙利用ILSpy的Save Code功能将其保存为工程文件。看能不能重新编译成可执行程序。

失望

首先试试双击工程文件,VS没反应。换用dotPeek依然如此。

然后新建工程,将项目添加到工程中,一大堆错误,无外乎是变量名不正确。换用dotPeek依然如此。如果时间充足的话,可以细心研读代码,修复错误,重新编译。一来错误太多、二来我也不想花太多时间在读代码上面、三来我的目的不在这上面。于是果断放弃该方式。

新希望

思路

我们知道,C#程序是编译成IL的,恰好我知道Reflexil可以直接编辑IL。上Reflexil官网一看,现在也支持ILSpy(以前我以为只支持Reflector),那就直接在ILSpy中改写IL。

查找编辑位置

要编辑IL的话,关键是要找对地方。软件未注册的话,好多时候都会弹出一个对话框,Converter也与此类似。

直接在VS中查找相应的字符串,如最开始的The Free Edtion of。经过简单分析后不难看出_g22.cs正是我们要找的地方。

internal static bool _g41(List<string> Copyright_Tangible_Software_Solutions_p0)
{
if (_g22._g24 == _g3.FreeEdition)
{
if (_g22._m21 != 100)
{
Copyright_Tangible_Software_Solutions_g810._g844(Copyright_Tangible_Software_Solutions_g810._g843);
return false;
}
if (Copyright_Tangible_Software_Solutions_p0 == null)
{
return true;
}
int num = 0;
for (int i = 0; i < Copyright_Tangible_Software_Solutions_p0.Count; i++)
{
if (Copyright_Tangible_Software_Solutions_p0[i].Trim().Length > 0 && !Copyright_Tangible_Software_Solutions_p0[i].TrimStart(new char[0])._g1079("//"))
{
num++;
if (num > _g22._m21)
{
new _g376(string.Concat(new string[]
{
"The Free Edition of ",
Application.ProductName,
" doesn't allow conversion of snippets with more than ",
_g22._m21.ToString(),
" lines at a time."
}));
return false;
}
}
}
}
return true;
}

下面还有两个函数,_g42和_g43形式与此类似,_g42应该是文件夹的许可,_g43不知道是做什么的。从函数的代码上看,感觉直接将返回值改成true就好了。不管那么多,先来试试改写_g41。

准备工作

在网站上下了reflexil.for.ILSpy.2.0.AIO(我愣了下才反应过来AIO是All In One的意思),解压后将里面的DLL复制到ILSpy目录下。打开ILSpy(如果ILSpy复制前是打开,则需重启),在View中点击Reflexil v2.0,然后在ILSpy中打开Converter的可执行文件,找到_g22类中的_g41函数。如下图所示:

Instructions标签页就是进行IL编辑操作的地方。虽然在Reflexil中可以直接编辑源码:在Instructions标签页的表格中选择Replace all with code,在弹出的窗口中编辑源码。但是在Converter中默认的代码方法体无任何内容,而且Complie也会访问错误(虽然并没有错误)。于是果断放弃这种方式。

编辑IL

编辑IL还有一个问题就是我们要将IL改变成什么样。在本例中就是return true对应的IL是什么 。这个问题说难也难,说简单也简单。只要我们在VS中编写一段同样的代码,生成后在ILSpy中以IL方式查看即可。

C#形式的代码

IL形式的代码

接下来就是将Instructions标签页表格中的IL改为与上图的IL一样。整个过程很简单,删除、添加、修改,只要保持指令与目标一致。值得一提的是,总共6条指令(nop将就留下吧),只有第4条有操作数,可将其最后添加。因为是跳转语句,需要在Operand type中选择Instruction reference,然后在Operand选择要跳转的指令位置。

大功告成

在ILSpy中Converter可执行文件上单击右键,在弹出的右键菜单中选择Save As,保存好文件(可以对Converter原文件作好备份后直接覆盖)。验证后发现针对代码片段的限制确实失效了。

如果对_g42和_g43也如法炮制,就会发现针对文件夹的限制也会失效。

结语

我是抱着研究学习的态度来尝试破解的,破解之后也没有作其他用途。本着跟大家沟通交流的初衷将这个过程写下来,请各位多多赐教,同时,也希望大家多支持正版。

然而我辛辛苦苦作出的C#版本最终一点用都没派上,这真是一个温暖人心的结局。

破解Java to C# Converter的更多相关文章

  1. JAVA To C++ Converter Cracked ( 破解版 )

    JAVA To C++ Converter v17.10.2 Cracked by X-Cracker 简介 JAVA To C++是一款将JAVA代码或项目转换为 C++的工具 免费版本只每次只支持 ...

  2. 一招破解 Java 集合类面试题

    今日招式:Java集合类面试题 Java集合类绝对是我们的老朋友了,Java技术江湖里,谁人不知,谁人不晓,它的使用率非常高,使用难度却也不大,这也导致了很多人对它不屑一顾,殊不知其中却暗藏玄机,今天 ...

  3. [破解]java打包Exe工具 - Jar2Exe Wizard

    打包java文件为exe的方法和软件有很多,还有一些开源的软件和一些免费的软件. 我用过的所有打包exe软件中,Jar2Exe Wizard是最好用的,但是只有一个月的试用期,需要的可以从官网下载. ...

  4. 最简破解-java代码热加载热部署IDEA插件JRebel

    如果经济实力允许的话,还是建议大家去购买收费版.支持原创作者,才能有更好的产品出现. 一.Jrebel插件介绍 JRebel一款帮助我们在开发过程中实现热加载的插件,目前来说,在IDEA中实现热加载最 ...

  5. IT生涯, 我的常用软件清单

    IT生涯, 我的常用软件清单 SkySeraph Jan. 26th 2017 Email:skyseraph00@163.com 更多精彩请直接访问SkySeraph个人站点:www.skysera ...

  6. Windows 7上QTP11破解及java等插件破解方法

    QTP11破解方法: 1.准备文件 注册机mgn-mqt82.exe 2.安装QTP11 3.运行注册机mgn-mqt82.exe 如果运行mgn-mqt82.exe 没有反应-,请注意关掉暂时关掉杀 ...

  7. Java To CSharp源代码转换

    前言 开发环境 客户端:Unity3D开发(C#) 服务器:Java (基于Java7) 日   期:2016年09月 需求说明 部分服务器的部分逻辑功能在客户端实现一遍,可以简单的理解为服务器的部分 ...

  8. Atitit.dwr3 不能显示错误详细信息的解决方案,控件显示错误详细信息的解决方案 java .net php

    Atitit.dwr3 不能显示错误详细信息的解决方案,控件显示错误详细信息的解决方案 java .net php 1. Keyword/subtitle 1 2. 使用dwr3的异常convert处 ...

  9. paip.c++ 转换 java 解决方案

    paip.c++ 转换 java 解决方案 作者Attilax  艾龙, EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog.csdn.net/a ...

随机推荐

  1. 一个struts2登录bug的解决

    点登录的时候,在url后面总会加上一个;jsessionid=xxx 使找不到页面 的404 Bug ,百思不得其解,最后终于找到解决方案,实验最终成功解决了这个bug,下面是解决方案 1,增加依赖  ...

  2. Matlab 之 字符串数组查找

    Matlab的优势在于向量操作,字符串操作往往费时费力,但是如果能充分利用Matlab自带的一些函数,也可以取得不错的效果.下面就介绍一下字符串数组查找的小技巧. 字符串数组我通常会选择应用cell格 ...

  3. KB,Kb单位换算,网络带宽中的Kbps和KB/s到底是什么意思? (注:B和b的区别)

    B是指字节(Byte)1个字节有8个比特组成    b是指比特(bit)代表一个2进制位(值为0或1) 上过网的朋友应该会听说过网络带宽这个词,可是这个网络带宽的单位到底是什么,为什么有的人说Kbps ...

  4. 17、ASP.NET MVC入门到精通——Spring.net入门

    Spring.NET环境准备 pring.NET 1.3.2下载地址:http://down.51cto.com/data/861700 下载后解压 Spring.NET-1.3.2.7z:这个里面有 ...

  5. ASP.NET Redis 开发

    文件并发(日志处理)--队列--Redis+Log4Net Redis简介 Redis是一个开源的,使用C语言编写,面向“键/值”对类型数据的分布式NoSQL数据库系统,特点是高性能,持久存储,适应高 ...

  6. WCF自寄宿

    WCF很早就出现了,然而我感受到能够让新手重点去学习WCF而不是WebService是最近两年.我相信大部分人初步了解WCF的时候会很痛苦,尤其是生成代理类,以及配置的问题.我本人其实比较讨厌配置编程 ...

  7. MVC数据传递

    一.数据传递 1.ViewData[]: 用法:action中:ViewData["key"]="aaa";,V层接收ViewData["key&qu ...

  8. Linux(Centos)之安装Redis及注意事项

    1.redis简单说明 a.在前面我简单的说过redis封装成共用类的实现,地址如下:http://www.cnblogs.com/hanyinglong/p/Redis.html. b.redis是 ...

  9. JS中用new创建对象与不用new创建对象区别:

    function classA() { console.log(this); var that = this == window ? {} : this; that.name = "clas ...

  10. SharePoint 自定义的列表页面中添加javascript的一个 For循环语句后,该页面就打不开了。

    一个sharepoint 2013的普通的列表的自定义新建页面,我在其中新添加几行javascript代码后页面就打不开了.如图所示: 真是一言不合,友谊的页面说打不开就打不开啊.后来慢慢比对发现是因 ...