标 题: 【原创】小小菜鸟爆破IphoneBackupextractor V3.08
作 者: Wmbit(wzpyh)
时 间: 2011-10-25,20:02

在此要先感谢下
【原创】DOTNET动态调试破解Spoon,及MSI安装包文件替换技术
的作者chenxiaolu 发的帖,让我受益匪浅!

前言
玩Iphone的朋友对这个东西应该并不陌生,它可以把电脑里的Iphone备份文件提取自己所需的东西出来。

作为一个超级潜水艇0 0(看我注册时间就知道了),逛了那么久的看雪。。觉得是该笨鸟飞起来了恩。。
废话不说了,进入正题。。
工具使用:
CFF Explorer
Simple Assembly Explorer
ILSPY

1、  打开软件我们可以看到有个注册按钮在主界面
 用Reflector打开软件,显示错误,看来软件动过手脚。。
改用Simple Assembly Explorer+ILSPY 顺利打开~
在Form类的MainForm,看到许多函数都被混淆了
 

尽管如此,硬着头皮用ILSPY分析下代码,发现个button叫btnButton

 
点右键Analyze一下恩。
 
看到这四个方法调用了BtnRegister,点第一个进去看看。。看到了一个东西~(运气太好了- -)
 


当case 为2的时候,注册按钮就会隐藏起来,看来这里是关键,因为一般注册成功了才会把它隐藏起来。那么看下是怎么才能到case 2的- -。。

代码:
  case 2:
      {
        YCAgON0yw60m63HqxL.nXwlNs0Yvy.btnRegister.Hide();
        num = 15;
        break;
      }

在下面点看到了这个
代码:
case 13:
      {
        if (!YCAgON0yw60m63HqxL.ARRlToEtRO)
        {
          return;
        }
        num = 2;
        break;
      }
也就说当YCAgON0yw60m63HqxL.ARRlToEtRO ==true时,赋值num=2,然后走循环走到case2验证就通过了。。

那么true的代码在哪呢?在Case 4那。。
代码:
  case 4:
      {
        YCAgON0yw60m63HqxL.ARRlToEtRO = true;
        num = 9;
        break;
      }
也就是说我们让分支一开始就等于4,就可以无视掉其他分支了吧。。。再回到开头代码看下。

代码:
public static void ADBlBnyecQ()
{
  int arg_199_0 = 12;
  if (YCAgON0yw60m63HqxL.GqJHamoA9rMXWwobD70())
  {
    goto IL_10;
  }
  string text2;
  while (true)
  {
    IL_199:
    string text;
    int num;
    RegistryHelper registryHelper;
    switch (arg_199_0)
我的目的将arg_199_0改成4,那不就验证通过了?转成IL代码如下

代码:
0       L_0000:  ldc.i4  12
1       L_0005:  call  System.Boolean Hx4BCgCK7VXi5M2Ni4.YCAgON0yw60m63HqxL::GqJHamoA9rMXWwobD70()
2       L_000a:  brfalse  96 -> switch 29, 65, 23, 78, 14, 19, 50, 4, 56, 87, 29, 45, 8, 45, 100, 108
直接用SAE改保存。。软件功能失效- -,难道不能用它改?
查询Gerneral页可知道
代码:
/* Token: 0x060002df */
/* RVA: 0x2af58 */
.method public hidebysig static Void ADBlBnyecQ()
.maxstack 6
ldc.i4 的16进制为20
开启CFF Explorer 打开文件,在Address Converter 填入RVA显示如下

(此图是已经改过值后的)


20 0C  即0x0C=12 把0C 改成04,保存,
软件运行。。。Done!

后话:
只用改一个字节就搞定它了=。= ,但前后分析却花了半天。。。逆向入门真不容易啊