首页
社区
课程
招聘
Riijj系列之cm11(浮点运算)分析
发表于: 2013-1-28 16:32 10638

Riijj系列之cm11(浮点运算)分析

2013-1-28 16:32
10638

Riijj系列之cm11(浮点运算)分析
工具:WinDBG(调试程序)+IDA6.1(分析流程)+OD(修改程序)
系统:WinXP sp3
CM :下载 riijjcm11.zip

这个CM,首先要做的就是拿IDA载入看下CM大致流程,有什么特殊之处,浏览一遍会发现,创建主窗体之前有很多反调试,不信你可以试着运行下看。不过这次我们不一一解除这些反调试,换个方法绕过他们,
就是用WinDBG调试,为了绕过反调试可以直接先运行该CM,然后通过WinDBG附加功能调试,这时反调试的部分已经执行过了,所以会方便很多。
(如果你想仔细研究下反调试的部分,从程序开始处就分析,那么没关系之前已经有同志分析过这部分反调试代码了,你可以参考这篇文章http://bbs.pediy.com/showthread.php?s=&threadid=38125)
至于为什么不用OD调试,主要是对于WinDBG的仰慕已久,趁此机会仰慕一下而已。在使用WinDBG调试之前还需要做一件事,去除掉程序运行过程中的一处反调试检测。
一、分析开始
IDA载入后如图1

程序WinMain入口及各模块图示,WinMain下边的异常部分及异常处理就不说了,可以参考上边那个反调试分析的文章,图中标红部分为主要入口即call    sub_4019A0鼠标双击该处进入后可以看到熟悉的加载图标LoadIconA、加载光标LoadCurosrA、注册窗体类RegisterClassExA、创建窗体CreateDialogParamA以及下面的消息处理等函数。如图2


主要注意下注册窗体类RegisterClassExA和创建窗体CreateDialogParamA以及紧邻CreateDialogParamA下面的call sub_401B70这三个函数
1)拆除窗体处理函数中的反调试检测
RegisterClassExA函数中有个参数是窗体处理函数地址,进去看看这个函数做了哪些操作
上图第一处标黄的位置mov     [esp+64h+var_30.lpfnWndProc], offset sub_4016A0
双击sub_4016A0进入如图3

注意有个call    sub_401690调用,这个函数是在窗体运行过程中一直被调用的反调试函数,主要是通过定位PEB检测DebugProt端口是否被调试,以及ZwQueryProcessInformation调用查询进程ProcessDebugPort参数是否被调试。具体详细信息还是看上边那个文章吧。
在这里可以将这个CALL sub_401690用NOP指令填充掉,具体办法可以通过
用OD载入CM11,快捷键Ctrl+N打开调用函数在DestroyWindow函数上下断点后,通过断点窗口找到DestroyWindow的调用位置如图4:

在标红位置右键二进制->用NOP指令填充,复制到文件并保存为cm*_1.exe即可。
CreateDialogParamA窗口回调函数分析
双击图1中CreateDialogParamA的参数DialogFun进入函数如图5

为消息处理流程在比较了初始化对话框消息cmp eax,111h及cmp [esp+arg_8],3EA,是否点击注册按钮消息后进入第二个EnableWindow下面的call sub_401C50这个函数中明显能看到GetDlgItemTextA函数取对话框内容。取内容后转存没有做其他操作。具体在调试中分析
call sub_401B70分析
进入这个函数如图6:

调用建立定时器函数,看TimerFunc做了哪些操作,只是调用了call    sub_401880函数,继续进入后在每个CALL的地方点进去看下,没有发现什么信息,直到在2个call sub_401790和2个sub_401840后,有个call sub_4010F0这个就是算法部分了,点击去之后会发现有浮点运算以及调用sub_4012E0中存在大量浮点指令,具体还是在调试中分析。
注意IDA的分析主要是定位下,关键call 所在的地址位置,便于在调试时下断
用WinDBG调试
这时,运行修改过的cm*_1.exe,打开WinDBG的File->Attach to a Process在弹出的选择列表中选择进程点击确定一般是最后一个如图7

点击OK后程序就被调试器附加上了断在
ntdll!DbgBreakPoint:
7c92120e cc              int     3
位置这时如果按F5执行,CM就用运行起来,
输入
Name:AJISky
Serial:12345678
点击注册按钮后没有反应,因为没有下断,所以我们先点击(Break按钮或Ctrl+Break快捷键)暂停程序,
回到IDA中图5按空格键查看 call  sub_401C50所在地址
如.text:00401758                 call    sub_401C50
在WinDBG命令窗口中输入bp 401758回车
可以用bl查看断点列表显示下断成功如下
 0 e 00401758     0001 (0001)  0:**** riijjcm11sp2_1+0x1758
F5运行程序,输入用户名、序号点击注册按钮停在如下位置
00401758 e8f3040000      call    riijjcm11sp2_1+0x1c50 (00401c50)
按F11进入401c50
调试器是一行指令一行指令显示的,执行后显示下一条指令,可能看着不连贯。可以先用命令uf 401c50查看下如下

0:000> uf 401c50
riijjcm11sp2_1+0x1c50:
00401c50 8b0dd0dd4000    mov     ecx,dword ptr [riijjcm11sp2_1+0xddd0 (0040ddd0)]
00401c56 81ec10010000    sub     esp,110h
00401c5c 8d442400        lea     eax,[esp]
00401c60 56              push    esi
00401c61 8b35d8a04000    mov     esi,dword ptr [riijjcm11sp2_1+0xa0d8 (0040a0d8)]  ;;GetDlgItemTextA函数地址
00401c67 57              push    edi
00401c68 6a14            push    14h
00401c6a 50              push    eax
00401c6b 68e8030000      push    3E8h
00401c70 51              push    ecx
00401c71 ffd6            call    esi              ;GetDlgItemTextA取Name
00401c73 a1d0dd4000      mov     eax,dword ptr [riijjcm11sp2_1+0xddd0 (0040ddd0)]
00401c78 8d9424b4000000  lea     edx,[esp+0B4h]
00401c7f 6a50            push    50h
00401c81 52              push    edx
00401c82 68e9030000      push    3E9h
00401c87 50              push    eax
00401c88 ffd6            call    esi              ;GetDlgItemTextA取Serial
00401c8a 8d7c2408        lea     edi,[esp+8]            
00401c8e 83c9ff          or      ecx,0FFFFFFFFh
00401c91 33c0            xor     eax,eax
00401c93 f2ae            repne scas byte ptr es:[edi]          ;取Name长度Len_Name
00401c95 f7d1            not     ecx
00401c97 49              dec     ecx
00401c98 83f903          cmp     ecx,3
00401c9b 0f82db000000    jb      riijjcm11sp2_1+0x1d7c (00401d7c)      ;小于3退出

riijjcm11sp2_1+0x1ca1:
00401ca1 8dbc24b4000000  lea     edi,[esp+0B4h]
00401ca8 83c9ff          or      ecx,0FFFFFFFFh
00401cab f2ae            repne scas byte ptr es:[edi]          ;取Serial长度Len_Serial
00401cad f7d1            not     ecx
00401caf 49              dec     ecx
00401cb0 83f903          cmp     ecx,3              
00401cb3 0f82c3000000    jb      riijjcm11sp2_1+0x1d7c (00401d7c)      ;小于3退出  

riijjcm11sp2_1+0x1cb9:
00401cb9 b13a            mov     cl,3Ah              ;放入Mem1[1]
00401cbb 32c0            xor     al,al
00401cbd 884c241d        mov     byte ptr [esp+1Dh],cl
00401cc1 884c2451        mov     byte ptr [esp+51h],cl          ;:放入Mem2[1]
00401cc5 8844241e        mov     byte ptr [esp+1Eh],al
00401cc9 88442452        mov     byte ptr [esp+52h],al
00401ccd 83c9ff          or      ecx,0FFFFFFFFh
00401cd0 8d7c2408        lea     edi,[esp+8]
00401cd4 33c0            xor     eax,eax
00401cd6 53              push    ebx
00401cd7 f2ae            repne scas byte ptr es:[edi]
00401cd9 f7d1            not     ecx
00401cdb 2bf9            sub     edi,ecx
00401cdd 8d542420        lea     edx,[esp+20h]
00401ce1 8bd9            mov     ebx,ecx
00401ce3 8bf7            mov     esi,edi
00401ce5 83c9ff          or      ecx,0FFFFFFFFh
00401ce8 8bfa            mov     edi,edx
00401cea c644242065      mov     byte ptr [esp+20h],65h          ;e放入Mem1[0]
00401cef 8d542454        lea     edx,[esp+54h]
00401cf3 f2ae            repne scas byte ptr es:[edi]
00401cf5 8bcb            mov     ecx,ebx
00401cf7 4f              dec     edi
00401cf8 c1e902          shr     ecx,2
00401cfb f3a5            rep movs dword ptr es:[edi],dword ptr [esi]      ;Name 4字节倍数部分放入Mem1[2]
00401cfd 8bcb            mov     ecx,ebx
00401cff c64424546c      mov     byte ptr [esp+54h],6Ch          ;l放入Mem2[0]
00401d04 83e103          and     ecx,3
00401d07 f3a4            rep movs byte ptr es:[edi],byte ptr [esi]      ;Name 不足4字节倍数部分放入Mem1[Len_Name/4*4+2]
00401d09 83c9ff          or      ecx,0FFFFFFFFh            ;即连接e:Name[0]
00401d0c 8dbc24b8000000  lea     edi,[esp+0B8h]
00401d13 f2ae            repne scas byte ptr es:[edi]
00401d15 f7d1            not     ecx
00401d17 2bf9            sub     edi,ecx
00401d19 8bf7            mov     esi,edi
00401d1b 8bd9            mov     ebx,ecx
00401d1d 8bfa            mov     edi,edx
00401d1f 83c9ff          or      ecx,0FFFFFFFFh
00401d22 f2ae            repne scas byte ptr es:[edi]
00401d24 8bcb            mov     ecx,ebx
00401d26 4f              dec     edi
00401d27 c1e902          shr     ecx,2
00401d2a f3a5            rep movs dword ptr es:[edi],dword ptr [esi]      ;Serial 4字节倍数部分放入Mem2[2]
00401d2c 8bcb            mov     ecx,ebx
00401d2e 5b              pop     ebx
00401d2f 83e103          and     ecx,3
00401d32 f3a4            rep movs byte ptr es:[edi],byte ptr [esi]      ;Serial 不足4字节倍数部分放入Mem2[Len_Serial/4*4+2]
00401d34 8d7c241c        lea     edi,[esp+1Ch]            ;即连接l:Serial[0]
00401d38 83c9ff          or      ecx,0FFFFFFFFh
00401d3b f2ae            repne scas byte ptr es:[edi]
00401d3d f7d1            not     ecx
00401d3f 2bf9            sub     edi,ecx
00401d41 8bc1            mov     eax,ecx
00401d43 8bf7            mov     esi,edi
00401d45 8b3dd8dd4000    mov     edi,dword ptr [riijjcm11sp2_1+0xddd8 (0040ddd8)]
00401d4b c1e902          shr     ecx,2
00401d4e f3a5            rep movs dword ptr es:[edi],dword ptr [esi]      ;转存l:Serial[0]
00401d50 8bc8            mov     ecx,eax
00401d52 33c0            xor     eax,eax
00401d54 83e103          and     ecx,3
00401d57 f3a4            rep movs byte ptr es:[edi],byte ptr [esi]      ;不足4Byte倍数部分
00401d59 8d7c2450        lea     edi,[esp+50h]
00401d5d 83c9ff          or      ecx,0FFFFFFFFh
00401d60 f2ae            repne scas byte ptr es:[edi]
00401d62 f7d1            not     ecx
00401d64 2bf9            sub     edi,ecx
00401d66 8bd1            mov     edx,ecx
00401d68 8bf7            mov     esi,edi
00401d6a 8b3ddcdd4000    mov     edi,dword ptr [riijjcm11sp2_1+0xdddc (0040dddc)]  ;转存e:Name[0]
00401d70 c1e902          shr     ecx,2
00401d73 f3a5            rep movs dword ptr es:[edi],dword ptr [esi]
00401d75 8bca            mov     ecx,edx
00401d77 83e103          and     ecx,3
00401d7a f3a4            rep movs byte ptr es:[edi],byte ptr [esi]      ;不足4Byte倍数部分

riijjcm11sp2_1+0x1d7c:
00401d7c 5f              pop     edi
00401d7d 5e              pop     esi
00401d7e 81c410010000    add     esp,110h
00401d84 c3              ret

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 6
支持
分享
最新回复 (9)
雪    币: 269
活跃值: (906)
能力值: ( LV12,RANK:345 )
在线值:
发帖
回帖
粉丝
2
自己顶下先,发现自娱自乐还好,完了再用文字写出来真是令人抓狂的事情,自己搞可能只要2个小时,而写出来就不是几个小时可以搞定的了,尤其这个浮点数!
2013-1-28 16:50
0
雪    币: 89
活跃值: (53)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
大致看了一遍,看到结尾发现 每人回复,我是沙发吗
2013-1-28 16:55
0
雪    币: 403
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
自己搞可能只要2个小时 ,   我什么时候才能达到这个境界
2013-1-28 19:01
0
雪    币: 1919
活跃值: (901)
能力值: ( LV9,RANK:490 )
在线值:
发帖
回帖
粉丝
5
强悍哟,学习了
2013-1-28 22:31
0
雪    币: 42
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
额 咋直接就11了 CM10楼主不发了吗?
2013-1-28 22:33
0
雪    币: 269
活跃值: (906)
能力值: ( LV12,RANK:345 )
在线值:
发帖
回帖
粉丝
7
话说cm10,也是浮点数操作,之前修改个跳转就爆破了,就略过没有分析算法,等cm14后看情况再发吧
2013-1-28 22:40
0
雪    币: 97697
活跃值: (200829)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
8
Thanks for share.
2013-1-30 03:24
0
雪    币: 61
活跃值: (160)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
9
有毅力啊。学习了
2013-2-8 15:42
0
雪    币: 76
活跃值: (114)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
膜拜,大牛。
2013-2-8 20:19
0
游客
登录 | 注册 方可回帖
返回
//