首页
社区
课程
招聘
[旧帖] [讨论] 一个算法分析的实例。 0.00雪花
发表于: 2012-1-14 14:14 1455

[旧帖] [讨论] 一个算法分析的实例。 0.00雪花

2012-1-14 14:14
1455

         在先前的 【讨论】cfg文件中的加密算法问题。求探讨!!! 帖子中有提到过这个。也有高手追踪到了算法,但是,他不告诉大家,于是,就自己来倒弄了。因为听过一句话,技术,藏着掖着就变臭了。所以,希望各位高手们,千万不要吝啬哦。也带带我们这些菜鸟吧。

     首先,咱们得安装一下这个最新版本的涉外上网助手1.2.9。下载地址
  
      安装好之后,我们用Peid查壳,看到是用aspack的压缩壳进行加壳的,至于加壳有什么作用,壳是干嘛用的,大家自己去百度吧。


       既然有壳,那我们就先脱壳吧,对于upx以及aspack的壳我们一般都可以用esp定律以及内存断点法来进行快速脱壳,或者,如果大家不嫌麻烦的话,可以试试单步跟踪的方法来试试。多练练总是好的。

    那么我们开始吧。这里我用的是esp定律法。(至于什么是ESP定律,大家还是去百度吧)

    OD载入之后

    F8单步到第一次ESP变化的值再下硬件访问断点,


      然后F9运行。来到这



     再次F8我们就来到OEP了,也就是程序的真是地址了。于是,我们就可以脱壳了。我们就用自带的ollydump脱壳调试进程来进行脱壳吧。之后,我们来运行一下脱完壳的程序,OK,可以运行。我们再来查一下壳



      可以看到,源程序是用VC++ 6.0写的。

    当然,大家可能会问,为什么要脱壳?脱壳有什么作用呢?在这里,我向大家推荐一款工具,用来更改一些软件的,比如reshack(资源黑客)、pexplorer等资源修改程序,当我们把带壳的程序和不带壳的程序进行对比的时候,可以明显的感觉到壳的作用。加壳的程序是查看不了程序所有的窗体、图片等资源的。而未加壳的,则没有限制。当然,如果是想aspack等的压缩壳,我们还可通过文件大小的对比来找到他们的区别,从而也可以知道壳的作用。

    好,既然脱壳了,之后我们要干嘛呢?对于一些初级的朋友来说,我们脱壳之后就可以改窗体名称了,改图片等资源来实现程序的个性化了(用Reshack等资源修改工具)。
但我们今天主要是想来追踪一下这个拨号端和pppoe.cfg的秘密。也就追踪他的算法,他是如何从pppoe.cfg中得到我们输入的账号以及密码的。他又是如何对我们输入的账号密码,进行加密保存的。(虽然在网上求助得到了高手的答复,知道了是3DES不规则加密的,也得到了解密的代码,但还是想自己追踪一下这个算法)

    首先,我们知道有pppoe.cfg这个文件,而且也知道在客户端拨号的时候会对这个文件进行访问,那么,我们的思路也就随之而来了。

     用OD载入,然后设置忽略所有异常,再按shift+F9,发现还是停下来了,看了下是000006D9异常,我们就忽略它吧。之后,用OD重新加载程序,下文件访问断点:bp CreateFileA  之后shift+F9进行忽略所有异常运行。这是我们要注意观察堆栈窗口,我们可以发现这个程序读取了哪些文件,当我们看到pppoe.cfg的时候,取消硬件断点,并且ALT+F9返回。

    来到这里:
0042341B    83F8 FF         cmp eax,-1
0042341E    75 28           jnz short 1.00423448
00423420    8B75 10         mov esi,dword ptr ss:[ebp+10]

     为了方便下次进入,我们记下这个首地址,或者下断点。
    同时我们也要观察一下pppoe.cfg中到底是是东西,别等下已经读取了我们还不知道,用winhex打开这个配置文件,把内容复制出来。

    我输入的账户是:Tracy 密码:111111  文件里是这些东西(16进制查看):
    DCA6662BEEAFD8A77F9509AE0DBA11C034736EEACF4AD4BA5F90D07602F766C33F0D793AB86754
   
      接着,F8单步走。
        这个时候,我们要注意观察所有窗口了。
   执行到
00402911    8BCA            mov ecx,edx

     时出现字符串Trac到

0040291B    8B50 FC         mov edx,dword ptr ds:[eax-4]

     时出现了完整的Tracy   同时,我们观察下载堆栈窗口中已经出现了我输入的用户名已经密码的明文了。也就是说,在0040291B这个偏移地址以前,程序就已经加载好了文件并且算出了账户密码。所以,我们再来一次,这次的范围可以缩小很多了。

    继续上面的操作,按下五次Shift+F9,然后Alt+F9返回。再继续刚才的操作

    第一个call:
00423266    E8 BCFAFFFF     call 1.00422D27
0042326B    8B4D F4         mov ecx,dword ptr ss:[ebp-C]
      出来之后,发现,没什么作用于是,下次可以忽略这个CALL
     一直跟进,来到这个地方
00402852    E8 DD0D0200     call 1.00423634
     F8下去,来到这里
0042363F    FF50 28         call dword ptr ds:[eax+28]         ; 1.004234DC
     继续跟进
    看到了
004234EA    FF15 10024300   call dword ptr ds:[<&kernel32.SetF>
; kernel32.SetFilePointer

     看到这个.SetFilePointer,大家应该要引起重视了。
注:VC声明
  DWORD SetFilePointer(
                  HANDLE hFile, // 文件句柄
                    LONG lDistanceToMove, // 偏移量(低位)
                  PLONG lpDistanceToMoveHigh, // 偏移量(高位)
                 DWORD dwMoveMethod // 基准位置FILE_BEGIN:文件开始位置 FILE_CURRENT:文件当前位置 FILE_END:文件结束位置
  说明:移动一个打开文件的指针

    再跟进去
    我们发现。堆栈中的值:
0012DC90   004234F0  ?B.   CALL 到 SetFilePointer 来自 1.004234EA
0012DC94   00000084  ?..   |hFile = 00000084 (window)
0012DC98   00000000  ....   |OffsetLo = 0
0012DC9C   00000000  ....   |pOffsetHi = NULL
0012DCA0   00000001   ...  \Origin = FILE_CURRENT

      于是,我们下意识的知道,程序开始读取文件了。
    结果发现,跟了一圈,还是没作用……/pz,下次又可以过掉这里了。
    好吧,那我们继续下一个call。(破解,是需要耐心了,我这么安慰自己)

0042364C    FF50 28         call dword ptr ds:[eax+28]         ; 1.004234DC
     当我们第二次遇到

004234EA    FF15 10024300   call dword ptr ds:[<&kernel32.SetFilePointer>]   ;

     的时候,大家都犹豫了,没办法,跟进去吧,看有什么不同。然后,我们发现了一个很大的跳转,跳到了这里:(这是第一次没有的)

    7C810C93    13C7            adc eax,edi

     但是,还是没有作用。。。继续……

    又发现一个Call。。。

00423658    FF50 28         call dword ptr ds:[eax+28]         ; 1.004234DC

     我们还是先都F8过掉吧。来到了这里

00402893    E8 58100000     call 1.004038F0

     咱们先不跟进去,用F7,过了之后发现堆栈中出现了用户名和密码。那我们可以确定,这个是关键跳转。以后,我们再过来的时候,可以直接把前面的全部过掉。好,咱们现在跟进去。
之后,看到了这个。

0040392E    E8 9D000000     call 1.004039D0

跟进去,来到这里再F7跟进去

得到了第一段算法。虽然不知道是干嘛用的,但是还是记一下吧。这个call 1.004039D0里面的算法是这样的:

00403DA5    8BD0            mov edx,eax
00403DA7    8AC8            mov cl,al
00403DA9    C1FA 03         sar edx,3    //EDX向右移3位,移出的最低位放到cf中。
00403DAC    80E1 07         and cl,7                 //cl与上7
00403DAF    8A143A         mov dl,byte ptr ds:[edx+edi]   //0herolibamtium0中的位数进行操作

00403DB2    D2FA           sar dl,cl     //将EDX中向右移ECX位
00403DB4    80E2 01         and dl,1      //EDX与上1
00403DB7    881428          mov byte ptr ds:[eax+ebp],dl
00403DBA    40              inc eax      // eax加1
00403DBB    3BC6           cmp eax,esi        //如果减数大于被减数,此时有借位。则将cf位置1,否则置0.
00403DBD  ^ 7C E6           jl short 1.00403DA5    //当cf为0的时候不跳转

从这个循环看。随着EAX的增加 EDX慢慢的增加。当eax大于40的时候,跳出循环。
将最后得到的”h0D”放入edi中。
之后跟着跟着就跟丢了。。。
跟了两天了……头晕。。。上来求救。。。

懂的大家一起来分析。相互学习。

[课程]FART 脱壳王!加量不加价!FART作者讲授!

收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 329
活跃值: (230)
能力值: ( LV13,RANK:320 )
在线值:
发帖
回帖
粉丝
2
自己再给自己顶起来。。。

         虽然笔记写的比较差。看不太清楚,但  还是希望有朋友能够帮忙啊。
2012-1-15 12:44
0
游客
登录 | 注册 方可回帖
返回
//