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直播授课