吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 20815|回复: 8
收起左侧

[原创] 破解NetKeeper本地密码读取

  [复制链接]
purpleroc 发表于 2013-11-7 00:16
本帖最后由 purpleroc 于 2013-11-7 00:44 编辑

原文来自:Tracy'Blog——【破解NetKeeper本地密码读取】

     有了在涉外混迹四年,写下的《校园网那些事》的经历后,写这篇文章似乎要比以前容易些。来重庆也有1个半月了,一直昏昏忽忽的,总提醒自己要打起精神来,却总打不起精神。可能是很久没什么能够刺激自己、给自己增加自信心吧,于是决定看看学校的客户端。
以前做过类似的事,于是,也就有些思维固定,不想再去做同类型的事了,属于眼高手低型。然而账号到期了,又想起了以前做过的事。那,来找找自信吧~~不过,这客户端比涉外的安腾高级了好几倍~~~~         
                             
       其实,先前也看过这个客户端,不过,一直想的是能够实现linux下拨号上网。好了,废话不多说了,进入正文吧。
先说目的:从文件中还原出我们拨号时输入的账号、密码。那先从文件看起,看看是哪个文件保存了这些信息。

      
       打开netkeeper的安装目录,看看每个文件是干嘛用的:


       这个应该是没可以理解的。那,保存密码的文件应该是在bin或者是config文件夹中了(省去推论文字,没看懂的可以先看看《校园网那些事》……)。其实,我们对比刚安装好程序,和拨号一次之后文件夹中的内容就可以清楚的看到,在bin文件中多了一个Credit文件。那,它很有可能就是我们要找的文件了。

       ok,我们拿出peid看看程序有没加壳,

       提示没找到,不过,看区段就知道vmp的壳。我等菜鸟是没想过要去挑战它的。那,带壳运行来调试吧。
       OD载入(忽略所有异常),直接对下断bp CreateFileA(分析见《校园网那些事》),F9跑起来,发现了类似如下call

0018785C   7266C4A4  つfr   /CALL 到 CreateFileA 来自 AcLayers.7266C4A100187860   00187CA0  爘.   |FileName = "\\.\Global\NPF_{C97F955E-E47F-4270-9432-764A2C7C41D3}"
       我们暂且把它当作是vmp壳对程序自解压时的一些操作吧(知道的还麻烦告知一声),这也是为什么在我们确定了读取文件的位置后不能直接对地址下断,而必须每次都跑完对类似这些|FileName = "\\.\Global\NPF_文件的操作的原因。我理解为,因为程序还没解压完,你直接下断,会引起程序解压出错,而导致程序出错。
       一直F9到FileName为C:\ChinaNetSn\时就要注意了。

       一下下的摁F9,到出现读取Credit文件:
      

img4.jpg

       取消断点,Alt+F9返回用户代码区。我看到的是非常乱的数据:


img5.jpg
       没关系,CTRL+A分析一下。就出现了我们可爱的反汇编代码了:


img6.jpg
       我们可以看到,刚才程序仅仅是访问Credit文件,而还没进行读取。以下是读取片段。


img7.jpg
       为了节省篇幅,直接复制代码吧:
[C] 纯文本查看 复制代码
0041B049   > \817C24 0C 8C1>cmp dword ptr ss:[esp+C],168C            ;  文件完整性校验
0041B051   .  74 17         je short NetKeepe.0041B06A
……
0041B06A   > \56            push esi                                 ; /hObject
0041B06B   .  FF15 30425000 call dword ptr ds:[504230]               ; \CloseHandle
0041B071   .  6A 00         push 0
0041B073   .  57            push edi
0041B074   .  8BCB          mov ecx,ebx
0041B076   .  E8 25000000   call NetKeepe.0041B0A0                   ;  加解密入口

       为什么判断0041B076时解密入口呢?你可以自己直接F8过去,然后看寄存器啊,内存啊,等等之类的变化来确定。好吧,主题来了,我们要解决的就是这个call。
先看反汇编代码以及我的注释:(有点长,放到最后附录一中。想看的忍一忍看完吧!)
这里解释下主要代码段:


       这段标准的代码中,我们可以看出,解密有三个步骤,第一和第三步是进行移位操作,第二部才是真正的各种转换。
我们要进行解密,也就是把这段代码换成我们的C语言,来进行解密。在解密入口处写了个xinlides,其实我也不知道他是不是用的des。目测不是吧:
附上C程序解密代码。(见附录二)
这里解释下主要代码段:

[C] 纯文本查看 复制代码
void encode(char *buffer, int len)
{
   char *p;
   while (len)
   {
       p = encode1(buffer);//位置交换
       encode2(buffer, p);//解密
       encode3(buffer);//顺序改回
       len = len - 8;
       buffer = buffer + 8;
   }
}


       最难的问题应该在于第二步了,为了偷懒,少写点代码,就直接用C语言嵌套asm来实现。
不过这样做的最困难的地方应该在于,保护现场以及,匹配好各传入参数。我们来对比一下C和反汇编的代码。


       在反汇编代码中,进行第二步加密中 mov eax, dword ptr [ecx]前,push了以下参数:

[C] 纯文本查看 复制代码
00404256  |.  68 80755400   push NetKeepe.00547580                   ;  要用到的pass
0040425B  |.  52            push edx                                 ;  放入地址
0040425C  |.  E8 DF000000   call NetKeepe.00404340                   ;  解密第二步
               00404340  /$  51            push ecx
               00404341  |.  8B4C24 08     mov ecx,dword ptr ss:[esp+8]
               00404345  |.  53            push ebx
               00404346  |.  55            push ebp
               00404347  |.  56            push esi

       那么,我们要做的就是,弄清楚这些push进去的东西,是什么,在后面用不用得上。
       通过分析可以得到00404256处push的是要用到的解密矩阵。0040425B是什么要解密的内容(已被第一步解密的内容)。00404340是push此次要解密的最后一位数的地址。其实可以看作保护现场。00404341是把0040425B处放入的内容弹出,即ecx中保存的是实际上要进行解密的那四个字符。后面连续三个push是为了保护现场。
       所以,在进行代码嵌套的时候,我们要想这段反汇编代码能够按我们的想法运行,我们就要给他创造好条件。所以,在开头,我们构造如下:
[C] 纯文本查看 复制代码
void encode2(char *buffer, char *key)
{
   __asm
   {
       lea eax, key
       push [eax]   //生成的key的地址压栈  0018fe1c
       lea eax, pass
       push eax   //把pass的地址压栈   0018fe18
       lea eax, buffer
       push [eax]    //剩余的要解密的内容入栈   0018fe14
       mov ecx, dword ptr [esp+8]   //把key给ecx
       push ebx   //10
       push ebp   //0c
       push esi   //08
       mov eax, dword ptr [ecx]
       mov edx, dword ptr [ecx+4]
       mov ecx, eax
       mov esi, edx
       shr ecx, 4
       and ecx, 0x0F0F0F0F
       and esi, 0x0F0F0F0F
       xor ecx, esi
     ……
       xor esi, eax               //esi中为解密后,前四个字节
       mov eax, dword ptr [esp+0x6C]   //将buffer的地址给eax    重点是,是否成功得到buffer地址
       xor edx, ecx              //edx中为解密后,后四位字节
       mov dword ptr [eax], esi    //写入解密后的前四位字符
       pop esi
       pop ebp
       mov dword ptr [eax+4], edx  //写入解密后的后四位字符
       pop ebx
       pop edx
       pop ecx
       pop ecx//后来自己加上去的(不然,弹出的esp恢复不了)
    }
}

       当然,要嵌套好反汇编的asm为自己所用,你必须自己单步去一一调试,对比每一步得到的结果。有差异,就更改~~~

       其中还有个很有趣的代码如下:

       原反汇编代码中所有的类似如下的内存赋值:

[AppleScript] 纯文本查看 复制代码
 mov ebp,dword ptr ds:[ebx*4+536408]

       均被替换为:
[AppleScript] 纯文本查看 复制代码
push ecx
lea ecx, key3
mov ebp, dword ptr [ebx*4+ecx]
pop ecx

       很巧妙的用到了堆栈作为临时存储点。

       代码实现的功能是:

       把Credit文件中的所有账号密码解密后取出,以明文形式保存到Credit.txt文件中。
       好了,就写到这,大家,看得懂的给点点评,看不懂的碰个人场吧。
       下一步要做的,尽量找到心跳包原理,希望能够完全脱离netkeeper吧,动态用户名的生成算法网上已经有了。我也拿了分,不过,暂时没用上,有想研究的,可以联系我,一起努力把。                                             
       最后,感谢monsterok,文中代码是基于他的帖子中给出的代码做的更改:http://bbs.pediy.com/showthread.php?t=136534&highlight=%E9%97%AA%E8%AE%AF。
###############################################################################################################

代码见附件。。。     http://pan.baidu.com/s/17UNU1
若由于排版问题带来阅读不舒适,还请见谅,附上html文件。
——Tracy_梓朋   2013-10-29

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

hu007 发表于 2013-11-10 09:27
学习了,谢谢分享
℡Black星辰 发表于 2013-11-10 09:24
luoenlai 发表于 2013-11-7 00:39
ljhspeed 发表于 2013-11-10 09:36
支持一记``````
huachemeng 发表于 2013-11-11 15:20
表示没看懂啊,最后的破解效果是什么的呢?
294223423 发表于 2013-11-17 20:03
表示没看懂啊,最后的破解效果是什么的呢?
luower 发表于 2013-11-17 22:01
虽然没太看明白,不过还是顶一下
 楼主| purpleroc 发表于 2013-12-26 11:14
294223423 发表于 2013-11-17 20:03
表示没看懂啊,最后的破解效果是什么的呢?

效果是可从cfg文件中还原出里面保存的用户名和密码。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 14:41

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表