【文章标题】: 菜鸟之[彩虹显IP v2.71]IP全显,不伦不类讲解.
【文章作者】: Neworld
【作者邮箱】: Neworld@H..M....Com
【作者主页】: http://www.911.com
【软件名称】: 彩虹显IP v2.71
【软件大小】: ?(KB)
【下载地址】: 自己搜索下载
【加壳方式】: N/A
【保护方式】: 隐藏使用功能
【编写语言】: Microsoft Visual C++ v7.1 DLL
【使用工具】: OD
【操作平台】: 正版非标准XPsp3
【软件介绍】: 看标题吧.
【作者声明】: 只是感兴趣.有生以来第一帖破文,希望将来可以看着这篇文章笑自己,失误之处敬请诸位大侠赐教,2009-1-11 20:05!
【详细过程】: 解密真是涉及到很多,真不懂得如何”菜鸟之”,或许这个标题是写给自己的!
///////////////////////////////////////////////////////////////////////////////////////
//修改版,实在是不知道怎么写,全部是一堆乱字符看上去眼花缭乱,写文章的功底是0啊,希望慢慢成长.//
///////////////////////////////////////////////////////////////////////////////////////
准备出征.
  准备工具,"OllyICE","IceSword","IDA",下载地址请BAIDU.COM.
  安装好"彩虹显IP v2.71",通过"彩虹显IP v2.71"启动QQ并登陆.
开始战斗.
  1,打开"IceSword",选择已登陆的QQ进程,选择"Module Information"(IceSword英文版的名称),点击路径进行排序,这时你会发现有两个路径是"彩虹显IP v2.71"所在目录下的,用记事本记录这两个DLL的名称,去BAIDU分别搜索下,或许这个时候你能确认你的目标是"CaiHong.dll".(如果不知道什么是DLL,请BAIDU).
  2,选择"OllyICE"加载"CaiHong.dll",如果不知道如何加载请BAIDU,"OD入门".
  3,请单击OD(这里用所写了,不知道什么是OD请BAIDU,"OllyICE所写")的汇编部分(CPU)窗口,点击右键,使用"Search for -> All referenced text strings" 或 "查找 -> 所有参考文本串"等待结果....
  (所写->缩写)2009-1-14 8:03;
  4,在文本搜索结果窗口单击右键"复制到剪贴板->整个表",粘贴复制结果到记事本,启动记事本搜索功能,搜索"*.*",这是你会问为什么搜索这个,因为我之前使用了彩虹的功能,我发现被隐藏的IP后面是"*.*",这个时候你会发现有两个"*.*"这里我们选择"%d.%d.*.*",为什么选择这个呢,因为实现有编程的经验,如果你没有编程的经验你可以这样想,这个似乎跟"127.1.*.*"更像.\
  (实现->事先)2009-1-14 8:03;
  5,现在我们定位到一个标记了"1004BC81"(如果不知道这个地址怎么来的,请先看"OD入门"),现在我们定位到程序头部(不知道如何定位头部,这个...我BAIDU了下,不知道关键字).
  6,鼠标单击CPU窗口"1004BC60"这行,在看看本地调用,似乎有5个,单击显示行右键可以跳转到指定子程序,然后粗略看一下在回来(不知道如何回来请看"OD入门").
  7,假设我们跳转到"1004B8E3",先不要动,让我们看看这个CALL前后都做了什么,似乎进行了两个PUSH(不知道请看汇编书籍),接着看CALL下面,我们发现有一个"add esp, 8"(具体含义看书籍),通过"1004B8E3"前后的操作,我们似乎发现这是"_cdecl调用方式"(以后不写了,不明白请BAIDU.),当你了解调用方式以后你会明白参数的入栈顺序以及确认参数个数的方法(这里可能还是涉及到一些知识).
  8,现在我们回到"1004BC60"("OD入门")开始分析下面的汇编代码(不会请参考书籍),接着9就是代码的备注了.
  9

  1004BC60  /$  55            push    ebp
  1004BC61  |.  8BEC          mov     ebp, esp
  1004BC63  |.  83EC 70       sub     esp, 70
  1004BC66  |.  A1 30CD0910   mov     eax, dword ptr [1009CD30]
  ---------------------------------------------------------上面掠过,具体函数请看书.(函数->含义)2009-1-21 18:33;  
  1004BC6B  |.  8945 FC       mov     [local.1], eax
  ---------------------------------------------------------上面,转移IP数值到变量(这里是不是用了高级语言的描述方法?,我不太懂哈)(什么是IP数值?我如何确认这里是IP数值,因为我知道用OD挂QQ调试了一下,希望不用我讲解如何调试,第一个问题可以BAIDU.).
  1004BC6E  |.  8B45 08       mov     eax, [arg.1]  //提取变量内容到EAX为计算做准备.
  1004BC71  |.  C1E8 10       shr     eax, 10    //右移EAX,具体命令含义请参考书籍,这里说下为什么要右移,因为这涉及到将IP数值转换成文本的算法,具体请BAIDU.
  1004BC74  |.  25 FF000000   and     eax, 0FF    //IP数值转换算法需求.
  1004BC79  |.  50            push    eax      //把第一次的结果压入,为打印结果做准备.
  ---------------------------------------------------------上面是参数,处理过程,为什么是二而不是一呢?具体请看参考函数调用方式的相关资料,例如上面提到"_cdecl".
  1004BC7A  |.  8B4D 08       mov     ecx, [arg.1]  //同楼上,这里只是用了ECX.
  1004BC7D  |.  C1E9 18       shr     ecx, 18    //同楼上.
  1004BC80  |.  51            push    ecx      //同楼上.
  ---------------------------------------------------------上是参数.
  1004BC81  |.  68 3CC50810   push    1008C53C  ;  ASCII "%d.%d.*.*"//这里一会我们要替换掉,为什么要替换掉一会修改的代码中加备注.
  ---------------------------------------------------------上面是__snprintf()需要的参数,需要了解该函数的含义需要了解__snprintf()如何使用,至于如何确定是__snprintf()函的参数具体下面说.
  1004BC86  |.  6A 64         push    64
  ---------------------------------------------------------同上.
  1004BC88  |.  8D55 90       lea     edx, [local.28]
  1004BC8B  |.  52            push    edx
  ---------------------------------------------------------同上.
  1004BC8C  |.  E8 79A30000   call    1005600A    //call __snprintf,通过IDA分析得到是这个函数,IDA如何使用请BAIDU,MSDN确认该函数用法,如何确认这个函数,如何确认函数的使用方法是这篇文章中最重要的了,而似乎要讲解又要写一些奇怪的东西,具体可以看看IDA入门教程.
  1004BC91  |.  83C4 14       add     esp, 14    //恢复,为什么要恢复,请了解函数调用方式,这里现在是14,为什么以后我们修改要改成1C不知道如何回答了,如果前面的那些书资料你都吃透就不用问了,下面的备注我也不用写了.
  1004BC94  |.  8D45 90       lea     eax, [local.28]
  1004BC97  |.  50            push    eax
  1004BC98  |.  8B4D 0C       mov     ecx, [arg.2]
  1004BC9B  |.  E8 001CFCFF   call    1000D8A0    //不知道干嘛的,没去看,估计有保存信息显示信息什么的吧.
  1004BCA0  |.  8B4D FC       mov     ecx, [local.1]
  1004BCA3  |.  E8 99840000   call    10054141    //不知道干嘛的,没去看,估计有保存信息显示信息什么的吧.
  1004BCA8  |.  8BE5          mov     esp, ebp
  1004BCAA  |.  5D            pop     ebp
  1004BCAB  \.  C3            retn
  ------------------------------------------------
  修改如下
  1004BC60  /$  55            push    ebp
  1004BC61  |.  8BEC          mov     ebp, esp
  1004BC63  |.  83EC 70       sub     esp, 70
  1004BC66  |.  A1 30CD0910   mov     eax, dword ptr [1009CD30]
  ----------------------------------------------------------------
  1004BC6B  |.  E9 9CA60300   jmp     1008630C      //修改这行,为什么修改这行是因为觉得这里漂亮哈,记住JMP的指令长度是2会导致覆盖下一行代码,要先记住下面的代码是什么哦,回头要恢复的.
  1004BC70  |?  90            nop          //这里的NOP是由于上面导致的,现在我们到1008630C进行分析,为什么是"1008630C"这是我在文件末尾找到的一个空白区域,用来写文件补丁,如何找空白区域或如何把这里修改成JMP请参考OD的帮助手册或者入门文章.
  ----------------------------------------------------------------
  1004BC71  |.  C1E8 10       shr     eax, 10    
  1004BC74  |.  25 FF000000   and     eax, 0FF
  1004BC79  |.  50            push    eax
  ----------------------------------------------------------------上面的代码不完整了,因为被JMP覆盖掉了一行,后面会恢复.
  1004BC7A  |.  8B4D 08       mov     ecx, [arg.1]
  1004BC7D  |.  C1E9 18       shr     ecx, 18
  1004BC80  |.  51            push    ecx
  ----------------------------------------------------------------参数
  1004BC81  |.  68 00630810   push    10086300    ;  ASCII "%d.%d.%d.%d" //这里与原文有出入了,为什么这里是 push 10086300看书吧.
  ----------------------------------------------------------------参数
  1004BC86  |.  6A 64         push    64
  ----------------------------------------------------------------参数
  1004BC88  |.  8D55 90       lea     edx, [local.28]
  1004BC8B  |.  52            push    edx
  ----------------------------------------------------------------参数
  1004BC8C  |.  E8 79A30000   call    1005600A
  1004BC91  |.  83C4 1C       add     esp, 1C      //恢复,这里要增加,因为我们根据__snprintf()的使用方法修改了汇编代码,这里要修改恢复大小,不然会崩溃哦.
  1004BC94  |.  8D45 90       lea     eax, [local.28]
  1004BC97  |.  50            push    eax
  1004BC98  |.  8B4D 0C       mov     ecx, [arg.2]
  1004BC9B  |.  E8 001CFCFF   call    1000D8A0
  1004BCA0  |.  8B4D FC       mov     ecx, [local.1]
  1004BCA3  |.  E8 99840000   call    10054141
  1004BCA8  |.  8BE5          mov     esp, ebp
  1004BCAA  |.  5D            pop     ebp
  1004BCAB  \.  C3            retn


  //自己编写的代码.
  ----------------------------------------------------------------
  10086300   .  25 64 2E 25 6>ascii   "%d.%d.%d.%d",0        //我们自己的常量(高级语言描述方法?).
  ----------------------------------------------------------------//上面是自己添加的常量,如何添加看"OD入门"
  1008630C      8945 FC       mov     dword ptr [ebp-4], eax  
  1008630F      8B45 08       mov     eax, dword ptr [ebp+8]
  10086312      25 FF000000   and     eax, 0FF
  10086317      50            push    eax
  ----------------------------------------------------------------//上面是第一个参数,为什么这里没有进行SHR操作,请看如何转换数值IP的资料吧.
  10086318      8B45 08       mov     eax, dword ptr [ebp+8]
  1008631B      C1E8 08       shr     eax, 8      //不想写了.
  1008631E      25 FF000000   and     eax, 0FF
  10086323      50            push    eax
  ----------------------------------------------------------------参数.
  10086324      8B45 08       mov     eax, dword ptr [ebp+8]  //这里这条是原地址1004BC6B的内容,因为我们用JMP跳转过来的,根据指令长度导致下面这行被覆盖了,这里恢复下.
  10086327    ^ E9 4559FCFF   jmp     1004BC71      //回到正常工作区.

总结下还是标题中的"【详细过程】",真不知道如何写一个易懂的文章,也不知道看不懂的人为什么不懂,或许每个人都有不同的原因,也很难全部讲解,细致讲解,标题的不伦不类或许就是因为我开始写的很复杂导致我这样起的名字,现在似乎是名副其实了.
///////////////////////////////////////////////////////////
下面是未修改的文章.

--------------------------------------------------------------------------------
过程:OD载入,"CaiHong.dll",文本定位法,"%d.%d.*.*",如何找文本,请论坛找OD的使用教程吧.
1004BC60  /$  55            push    ebp
1004BC61  |.  8BEC          mov     ebp, esp
1004BC63  |.  83EC 70       sub     esp, 70
1004BC66  |.  A1 30CD0910   mov     eax, dword ptr [1009CD30]
---------------------------------------------------------下面,转移数值IP.
1004BC6B  |.  8945 FC       mov     [local.1], eax
---------------------------------------------------------下面参数
1004BC6E  |.  8B45 08       mov     eax, [arg.1]
1004BC71  |.  C1E8 10       shr     eax, 10
1004BC74  |.  25 FF000000   and     eax, 0FF
1004BC79  |.  50            push    eax
---------------------------------------------------------下面参数
1004BC7A  |.  8B4D 08       mov     ecx, [arg.1]
1004BC7D  |.  C1E9 18       shr     ecx, 18
1004BC80  |.  51            push    ecx
---------------------------------------------------------下面参数
1004BC81  |.  68 3CC50810   push    1008C53C                         ;  ASCII "%d.%d.*.*"  //通过字符串定位第一次定位到这里,根据对汇编的了解,找到程序的开头处开始分析.
---------------------------------------------------------下面参数
1004BC86  |.  6A 64         push    64
1004BC88  |.  8D55 90       lea     edx, [local.28]
---------------------------------------------------------下面参数
1004BC8B  |.  52            push    edx
---------------------------------------------------------参数
1004BC8C  |.  E8 79A30000   call    1005600A    //call __snprintf,通过IDA分析得到是这个函数,MSDN确认该函数用法.
1004BC91  |.  83C4 14       add     esp, 14    //恢复.
1004BC94  |.  8D45 90       lea     eax, [local.28]
1004BC97  |.  50            push    eax
1004BC98  |.  8B4D 0C       mov     ecx, [arg.2]
1004BC9B  |.  E8 001CFCFF   call    1000D8A0
1004BCA0  |.  8B4D FC       mov     ecx, [local.1]
1004BCA3  |.  E8 99840000   call    10054141
1004BCA8  |.  8BE5          mov     esp, ebp
1004BCAA  |.  5D            pop     ebp
1004BCAB  \.  C3            retn

修改如下.
----------------------------------------------------------------
1004BC60  /$  55            push    ebp
1004BC61  |.  8BEC          mov     ebp, esp
1004BC63  |.  83EC 70       sub     esp, 70
1004BC66  |.  A1 30CD0910   mov     eax, dword ptr [1009CD30]
1004BC6B  |.  E9 9CA60300   jmp     1008630C      //在文件末尾找的空白处.
1004BC70  |?  90            nop
1004BC71  |.  C1E8 10       shr     eax, 10
1004BC74  |.  25 FF000000   and     eax, 0FF
1004BC79  |.  50            push    eax
----------------------------------------------------------------参数
1004BC7A  |.  8B4D 08       mov     ecx, [arg.1]
1004BC7D  |.  C1E9 18       shr     ecx, 18
1004BC80  |.  51            push    ecx
----------------------------------------------------------------参数
1004BC81  |.  68 00630810   push    10086300        //在文件末尾找的空白处.                   ;  ASCII "%d.%d.%d.%d"
----------------------------------------------------------------参数
1004BC86  |.  6A 64         push    64
----------------------------------------------------------------参数
1004BC88  |.  8D55 90       lea     edx, [local.28]
1004BC8B  |.  52            push    edx
----------------------------------------------------------------参数
1004BC8C  |.  E8 79A30000   call    1005600A
1004BC91  |.  83C4 1C       add     esp, 1C      //恢复,这里要增加,因为我们根据__snprintf(),的使用方法修改了汇编代码,这里要修改恢复大小.
1004BC94  |.  8D45 90       lea     eax, [local.28]
1004BC97  |.  50            push    eax
1004BC98  |.  8B4D 0C       mov     ecx, [arg.2]
1004BC9B  |.  E8 001CFCFF   call    1000D8A0
1004BCA0  |.  8B4D FC       mov     ecx, [local.1]
1004BCA3  |.  E8 99840000   call    10054141
1004BCA8  |.  8BE5          mov     esp, ebp
1004BCAA  |.  5D            pop     ebp
1004BCAB  \.  C3            retn

//自己编写的代码.
----------------------------------------------------------------
10086300   .  25 64 2E 25 6>ascii   "%d.%d.%d.%d",0    //我们自己的常量.
----------------------------------------------------------------
1008630C      8945 FC       mov     dword ptr [ebp-4], eax
1008630F      8B45 08       mov     eax, dword ptr [ebp+8]
10086312      25 FF000000   and     eax, 0FF
10086317      50            push    eax
----------------------------------------------------------------参数.
10086318      8B45 08       mov     eax, dword ptr [ebp+8]
1008631B      C1E8 08       shr     eax, 8
1008631E      25 FF000000   and     eax, 0FF
10086323      50            push    eax
----------------------------------------------------------------参数.
10086324      8B45 08       mov     eax, dword ptr [ebp+8]  //这里这条是原地址1004BC6B的内容,因为我们用JMP跳转过来的,根据指令长度导致下面这行被覆盖了,这里恢复下.
10086327    ^ E9 4559FCFF   jmp     1004BC71      //回到正常工作区.

----------------------------------------------------------------
中间还有用OD挂QQ,调试了下哈,由于已经确认了,这里就不写了哈.
等待了24小时,结果"论坛维护一下,需要数分钟".

16楼有前辈给了精简版的修改方法写的非常棒,建议看完文章去学习下哈.

  • 标 题:答复
  • 作 者:tashika
  • 时 间:2009-01-26 03:09:12

花了十分钟
数据就把 两个*改成%d
代码看下面 改动代码大小刚好 一个子也不少 
改后文件发出来让大家参考

代码:
1004BC60:  55                         PUSH    EBP
1004BC61:  8BEC                       MOV     EBP,ESP
1004BC63:  83EC 70                    SUB     ESP,70
1004BC66:  A1 30CD0910                MOV     EAX,[1009CD30]
1004BC6B:  8945 FC                    MOV     [EBP-4],EAX
1004BC6E:  8B45 08                    MOV     EAX,[EBP+8]
-----------------------以下为修改后的代码-----------------------
1004BC71:  0FB6C8                     MOVZX   ECX,AL
1004BC74:  51                         PUSH    ECX
1004BC75:  8ACC                       MOV     CL,AH
1004BC77:  51                         PUSH    ECX
1004BC78:  C1E8 10                    SHR     EAX,10
1004BC7B:  8AC8                       MOV     CL,AL
1004BC7D:  51                         PUSH    ECX
1004BC7E:  8ACC                       MOV     CL,AH
-----------------------以上为修改后的代码-----------------------
1004BC80:  51                         PUSH    ECX
1004BC81:  68 3CC50810                PUSH    1008C53C
1004BC86:  6A 64                      PUSH    64
1004BC88:  8D55 90                    LEA     EDX,[EBP-70]
1004BC8B:  52                         PUSH    EDX
1004BC8C:  E8 79A30000                CALL    1005600A
1004BC91:  83C4 1C                    ADD     ESP,1C
1004BC94:  8D45 90                    LEA     EAX,[EBP-70]
1004BC97:  50                         PUSH    EAX
1004BC98:  8B4D 0C                    MOV     ECX,[EBP+C]
1004BC9B:  E8 001CFCFF                CALL    1000D8A0
1004BCA0:  8B4D FC                    MOV     ECX,[EBP-4]
1004BCA3:  E8 99840000                CALL    10054141
1004BCA8:  8BE5                       MOV     ESP,EBP
1004BCAA:  5D                         POP     EBP
1004BCAB:  C3                         RETN