首页
社区
课程
招聘
[旧帖] [原创]铁路工程投资控制系统 0.00雪花
发表于: 2009-1-6 18:22 6177

[旧帖] [原创]铁路工程投资控制系统 0.00雪花

2009-1-6 18:22
6177
前几天破解了 113号文,后来发现113号已经不更新了,新版本是铁路工程投资控制系统,于是下载了。

装上一看,根目录下有个sense4.dll,吓一跳,深蓝的狗可不好弄,又上他的网站看看,结果看到 113号的狗可以用在新软件上,就是说同时有深蓝的狗和ROCKEY4的狗,而且都可以用,结合上个软件经验,R4的狗应该容易点,于是用peid看一下主程序是.net的,.net程序可不好跟,又看了看R4的文档,c#的样例里提到了使用c#之前要先注册Ry4Com.dll的服务,于是用od加载Ry4Com.dll看看代码再说,结果一看在系统io读狗部分和RYDLL32.DLL几乎一样,于是想到爆破。

ok说干就干,在Ry4Com.dll中的

10007650   .  FF15 84000110 call    dword ptr [<&KERNEL32.DeviceIoCo>; \DeviceIoControl

处下断点。

再用od打开源程序,有2个异常,用shift+F9跳过,在断点处停下来了,再跟踪至返回,到了

068D48C8   .  57            push    edi                              ;  p2
068D48C9   .  51            push    ecx                              ;  p1
068D48CA   .  8B8C24 641000>mov     ecx, dword ptr [esp+1064]
068D48D1   .  52            push    edx                              ;  lp2
068D48D2   .  50            push    eax                              ;  lp1
068D48D3   .  51            push    ecx                              ;  回调句柄
068D48D4   .  55            push    ebp                              ;  调用号
068D48D5   .  E8 962A0000   call    068D7370                         ;  与狗通讯
068D48DA   .  83C4 24       add     esp, 24                     《——————这里

发现那个call前面的一堆push了吗?再拿出R4手册看看,对了,就是在执行Docmd函数的操作对照手册我写下了以上几行的注释,就是各个push的参数值。

现在把DeviceIoControl处的断点取消,在068D48C8 处从新下断点,在od中重新加载程序,在068D48C8 处断下了,F8跟出调用号,参考R4手册,第一次是找狗,第二次是打开狗,第三次是查找狗内的模块是否可读(顺序为7,8,9,如果7可读就不往下找了)。

ok,程序分析基本就到这里,知道程序只使用了简单的几个狗函数,咱就有办法,爆破之!

首先,让Ry4Com不返回错误,也就是让其每次返回0(无错误,错误代码参考R4手册),原代码如下:

1000765E   .  66:8B4424 10  mov     ax, word ptr [esp+10]
10007663   >  8B8C24 8C0200>mov     ecx, dword ptr [esp+28C]
1000766A   .  338C24 900200>xor     ecx, dword ptr [esp+290]

改为:

1000765E      66:B8 0000    mov     ax, 0
10007662      90            nop
10007663   >  8B8C24 8C0200>mov     ecx, dword ptr [esp+28C]
1000766A   .  338C24 900200>xor     ecx, dword ptr [esp+290]

好了,把Ry4Com另存一下,再用修改过的Ry4Com加载程序,先运行一下,还是显示没检测到狗,为什么呢?因为检查模块时我们没有返回7号模块可读!

好,再次用od把源程序加载,再次断在 068D48C8 处,先让其运行一次,看调用码,第一次是1,第二次是3,第三次是C(十进制的12),在第三次时跟进

068D48D5   .  E8 962A0000   call    068D7370



1000765E      66:B8 0000    mov     ax, 0
10007662      90            nop
10007663   >  8B8C24 8C0200>mov     ecx, dword ptr [esp+28C]
1000766A   .  338C24 900200>xor     ecx, dword ptr [esp+290]

处我们要修改代码把p2位置改为01,但是我们发现没地方写代码了,在程序内找块空地,比如0691F084及之后都是0000,挺好,将1000765E 处改为:

0691765E     /E9 217A0000   jmp     0691F084       ;我跳

我们跳到了0691F084 ,在这里想想我们要完成几件事,1、将p2参数改为01(显示所请求的模块是允许的),2、将eax改为0(错误代码为0,也就是没错误),知道我们要干嘛了就开工,可是我们怎么得到p2的地址呢?仔细观察cpu的寄存器,看到了吗?edi的值就是p2的位置!ok,我们的代码如下:

0691F084      8907          mov     dword ptr [edi], eax
0691F086      90            nop
0691F087      66:B8 0000    mov     ax, 0

ok,完成了我们的任务了下一步要返回原来的程序流程,代码如下:

0691F08B    ^\E9 D385FFFF   jmp     06917663

ok,咱把代码全部复制另存,接着把新版的Ry4Com.dll覆盖原有的Ry4Com.dll再次运行《铁路工程投资控制系统》。

ok,软件可以正常使用了。

相关文件见我的博客:liupeng.info

[课程]Android-CTF解题方法汇总!

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 86
活跃值: (1043)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
这软件加密一直这么差
2009-1-6 18:33
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
恩,我们业主要求统一用这个软件,给项目部节约了一点
2009-1-6 19:58
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
有用,收藏了再学习。
2009-4-9 00:36
0
游客
登录 | 注册 方可回帖
返回
//