注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

The Bloom of Youth

本博客已搬家至http://kuangqi.me

 
 
 

日志

 
 

修改IL-破解新理念学习大厅计时器  

2009-11-18 19:29:52|  分类: 工巧匠心 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
新理念大学英语学习大厅是一个在线英语学习软件。软件有一个计时器,记录学生的学习时间。只有达到规定的学习时间才能通过学习并开启相应的单元测试。一旦窗口失活,如切换到别的程序或者最小化,计时器就会停止。对于想利用英语课干点小事的同学来说,这确实是个不幸的消息。

上次说到了用PostMessage发送WM_SETFOCUS消息骗过大厅的计时器。这种方法占用一定 的系统资源,同时会影响大厅的正常使用,出现如菜单无法弹出等情况。详情请看我的博客:http://kqwd.blog.163.com/blog/static/41223448200910411380776/

 

对主程序分析发现该软件为.Net编写。遂准备修改其代码,达到暴力破解的目的。其中不涉及到特殊的技巧,本文用于.Net破解初学者了解破解.Net程序的一般步骤。

 

首先用Reflector反编译,查看程序的代码。发现该软件未采取任何的保护措施,代码可读性很高。查看主窗体的代码,看到这样两段:

private void MainForm_Deactivate(object sender, EventArgs e)

{

    this.PreActivate = this.tTimer.Enabled;

    this.tTimer.Enabled = false;

}

private void MainForm_Activated(object sender, EventArgs e)

{

    this.tTimer.Enabled = this.PreActivate;

}

可见窗口失活时,软件禁用了计时器控件tTime.这么简单吗?马上动手吧!

 

ildasm.exe反汇编。ildasm.exe是微软官方的.Net程序的反汇编程序。随VS一同安装。VS2008中默认路径在C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\ildasm.exe

ildasm.exe打开主程序,然后点文件-转储。导出il代码和资源文件。

为了测试导出的正确性,我们打开VS的命令行,进入il文件的目录,输入

ilasm /exe /resource=*.res *.il

其中**为你导出的文件名

对导出的il进行汇编,重新生成exe。发现生成的exe运行正常(果然很弱,没有强名称保护)。

 

我尝试着将this.tTimer.Enabled = false;改为this.tTimer.Enabled = true;

IL中搜索MainForm_Deactivate,找到方法的代码(行:3873

 

  .method private hidebysig instance void

          MainForm_Deactivate(object sender,

                              class [mscorlib]System.EventArgs e) cil managed

  {

    // 代码大小       32 (0x20)

    .maxstack  8

    IL_0000:  nop

    IL_0001:  ldarg.0

    IL_0002:  ldarg.0

    IL_0003:  ldfld      class [System.Windows.Forms]System.Windows.Forms.Timer LearningCenter.MainForm::tTimer

    IL_0008:  callvirt   instance bool [System.Windows.Forms]System.Windows.Forms.Timer::get_Enabled()

    IL_000d:  stfld      bool LearningCenter.MainForm::PreActivate

    IL_0012:  ldarg.0

    IL_0013:  ldfld      class [System.Windows.Forms]System.Windows.Forms.Timer LearningCenter.MainForm::tTimer

    IL_0018:  ldc.i4.0

    IL_0019:  callvirt   instance void [System.Windows.Forms]System.Windows.Forms.Timer::set_Enabled(bool)

    IL_001e:  nop

    IL_001f:  ret

  } // end of method MainForm::MainForm_Deactivate

 

将红字部分改为IL_0018:  ldc.i4.1

即为将false替换为true。测试发现,在学习状态中,计时器确实可以不停,但在大厅首页时,程序在失活时出错。看窗口激活时的方法,发现其用PreActivate这个布尔变量来记录是否该开启计时器。而修改后,程序一旦失活就开启计时器,因此出错。

我们直接去掉窗口失活时关闭计时器的代码不是也行吗?将斜体部分(0012-0019)注释掉.重新用ilasm编译。再次试用,破解成功!

 

给同学试用后,反映程序在5分钟不操作会弹出离线的对话框,计时器再次停止。看来还不是很完美。再看计时器的代码。有这样一段:

    if (this.CurrentPoint != Cursor.Position)

    {

        this.CurrentPoint = Cursor.Position;

        this.PointTime = 0;

    }

    else

    {

        this.PointTime++;

    }

    if (this.PointTime > WinContext.AFKTime)

    {

        this.tTimer.Enabled = false;

        MessageBox.Show("您目前处于暂离状态,点击确定继续学习", this.Text);

        this.PointTime = 0;

        this.tTimer.Enabled = true;

}

鼠标不动时,PointTime就会增加,加到AFKTime后,计时器就会停止。尝试将this.tTimer.Enabled = false;改为true.时间到后发现计时器虽然不停,但提示对话框会每秒蹦出一个。还是把this.PointTime++;改成0比较好。

 

IL中搜索tTimer_Tick(行:3810),片段如下:

 

    IL_013a:  nop

    IL_013b:  ldarg.0

    IL_013c:  dup

    IL_013d:  ldfld      int32 LearningCenter.MainForm::PointTime

    IL_0142:  ldc.i4.1

    IL_0143:  add

    IL_0144:  stfld      int32 LearningCenter.MainForm::PointTime

    IL_0149:  nop

    IL_014a:  ldarg.0

    IL_014b:  ldfld      int32 LearningCenter.MainForm::PointTime

    IL_0150:  ldsfld     int32 LearningCenter.WinContext::AFKTime

    IL_0155:  cgt

    IL_0157:  ldc.i4.0

    IL_0158:  ceq

    IL_015a:  stloc.2

    IL_015b:  ldloc.2

IL_015c:  brtrue.s   IL_0192

 

IL_0142:  ldc.i4.1改为IL_0142:  ldc.i4.0

重新编译。试用发现一切正常。至此爆破成功

 

小插曲:

tTimer_Tick的第一句就是this.LearnTime++;

 

对应IL有这么一段:

 

    IL_0000:  nop

    IL_0001:  ldarg.0

    IL_0002:  dup

    IL_0003:  ldfld      int32 LearningCenter.MainForm::LearnTime

    IL_0008:  ldc.i4.1

    IL_0009:  add

    IL_000a:  stfld      int32 LearningCenter.MainForm::LearnTime

 

1008这句改成IL_0008:  ldc.i4.s   10

这样就可以让时间以原来10倍的速度增长了~~!不过出于安全考虑(不要被老师发现啊*­_*),没有这么做。

 

免责声明:本文仅用于技术交流,不得用于商业用途,不接受菜鸟求助。由于使用本文介绍的方法导致的任何不良后果,本人不承担责任。未经授权不得转载。

授权的转载请注明出处:http://kqwd.blog.163.com/

 

  评论这张
 
阅读(4491)| 评论(17)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017