首页
社区
课程
招聘
[原创]两个cm的详细分析
发表于: 2011-11-5 09:57 6876

[原创]两个cm的详细分析

2011-11-5 09:57
6876

原cm见http://bbs.pediy.com/showthread.php?t=141100,此处不再传了
这是cm区某校比赛的两个小程序,都没有壳,也没有猥琐的反调试,没有复杂antidebug,而又有简单的算法,很适合拿来练手
        先来看第一个
        这程序非常简洁,winmain里只有一个DialogBoxParamA,顺藤摸瓜找到dialogproc,dialogproc只处理了三个消息
0x16 0x110 0x111查阅头文件得知这三个消息分别为WM_CLOSE WM_INITDIALOG WM_COMMAND
        程序结构有多简单就可想而知了,对话框过程还原伪代码如下
        

	int __stdcall DialogFunc(HWND hDlg, int uMsg, unsigned __int16 wParam, int lParam)
	{
	  if ( uMsg == WM_CLOSE )
	  {
	    rEndDialog(hDlg);
	  }
	  else
	  {
	    if ( uMsg == WM_INITDIALOG )
	      return sub_4011E0(hDlg);
	    if ( uMsg == WM_SYSCOMMAND )
	    {
	      sub_401230(hDlg, wParam);
	      return 0;
	    }
	  }
	  return 0;
	}
	.text:004010B0 ; DWORD __stdcall StartAddress(LPVOID)
	.text:004010B0 StartAddress    proc near               ; DATA XREF: sub_4011E0+27o
	.text:004010B0                 push    ebx
	.text:004010B1                 mov     ebx, ds:Sleep
	.text:004010B7                 push    ebp
	.text:004010B8                 mov     ebp, ds:ExitProcess
	.text:004010BE                 push    esi
	.text:004010BF                 push    edi
	.text:004010C0                 mov     edi, ds:GetModuleHandleA
	.text:004010C6
	.text:004010C6 loc_4010C6:                             ; CODE XREF: StartAddress+49j
	.text:004010C6                                         ; .text:004010FFj
	.text:004010C6                 push    0               ; lpModuleName
	.text:004010C8                 call    edi ; GetModuleHandleA
	.text:004010CA                 mov     ecx, [eax+3Ch]
	.text:004010CD                 xor     edx, edx
	.text:004010CF                 add     ecx, eax        ; ecx =
	.text:004010CF                                         ; imagebase + e_lfanew =
	.text:004010CF                                         ; pe_header
	.text:004010D1                 mov     dx, [ecx+14h]   ; dx = SizeOfOptionalHeader
	.text:004010D5                 mov     esi, [ecx-4]    ; esi = pe头前面的一个dword
	.text:004010D8                 lea     edx, [edx+ecx+18h] ; edx =
	.text:004010D8                                         ; SizeOfOptionalHeader + pe_header + 0x18 =
	.text:004010D8                                         ; sectionheader ;此时正好指向第一个section text段
	.text:004010DC                 mov     ecx, [edx+8]    ; ecx = text.VirtualSize
	.text:004010DF                 mov     edx, [edx+0Ch]  ; edx = VirtualAddress
	.text:004010E2                 add     edx, eax        ; edx =
	.text:004010E2                                         ; ImageBase + text.VirtualAddress =
	.text:004010E2                                         ; text.rva
	.text:004010E4                 push    ecx             ; text.VirtualSize
	.text:004010E5                 push    edx             ; text.rva
	.text:004010E6                 call    crc32
	.text:004010EB                 add     esp, 8
	.text:004010EE                 cmp     esi, eax        ; 判断crc32返回值是否等于预先存储的0x99397da
	.text:004010F0                 jnz     short loc_4010FB
	.text:004010F2                 push    5000            ; dwMilliseconds
	.text:004010F7                 call    ebx ; Sleep
	.text:004010F9                 jmp     short loc_4010C6
	.text:004010FB ; ---------------------------------------------------------------------------
	.text:004010FB
	.text:004010FB loc_4010FB:                             ; CODE XREF: StartAddress+40j
	.text:004010FB                 push    1               ; uExitCode
	.text:004010FD                 call    ebp ; ExitProcess
	BOOL __cdecl sub_401230(int a1, BOOL a2)
	{
	  BOOL result; // eax@1
	  int v3; // esi@2
	  CHAR String; // [sp+4h] [bp-100h]@1
	  char v5; // [sp+5h] [bp-FFh]@1
	  __int16 v6; // [sp+101h] [bp-3h]@1
	  char v7; // [sp+103h] [bp-1h]@1
	
	  String = 0;
	  memset(&v5, 0, 0xFCu);
	  v6 = 0;
	  v7 = 0;
	  result = a2;
	  if ( a2 == 1000 )
	  {
	    GetWindowTextA(hWnd, &String, 10);
	    v3 = sub_401110("Iceberg");
	    result = sub_401140(&String);
	    if ( v3 == result )
	      result = EnableWindow(hButtonSucess, 1);
	  }
	  return result;
	}
Appcall(0x401110, "int func(char *);" , "Iceberg")
	text:0040114C                 movsx   ecx, cl
	.text:0040114F                 lea     eax, [eax+eax*4]
	.text:00401152                 inc     edx
	.text:00401153                 lea     eax, [ecx+eax*2-30h]
	.text:00401157                 mov     cl, [edx]
	.text:00401159                 test    cl, cl
	.text:0040115B                 jnz     short loc_40114C
	 if ( uMsg == 1000 )
	  {
	    GetDlgItemTextA(hDlg, 1004, &pwd, 256);
	    sub_401140(&pwd, &b64pwd);
	    v3 = sub_4012D0(&b64pwd, &v4);
	    result = sub_401360(v3, v4);
	  }

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 6
支持
分享
最新回复 (12)
雪    币: 47
活跃值: (31)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
不 错   能不能把那2个cm给我发一份吧 我攒钱转正呢 谢了哈  lhwqqq@gmail.com
2011-11-5 11:35
0
雪    币: 69
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
已发送 123456
2011-11-5 11:56
0
雪    币: 630
活跃值: (570)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
我也求cm xudaoliang0910@sina.com  共同进步!
2011-11-5 13:19
0
雪    币: 630
活跃值: (570)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
饿 不用了已经看到了     慢慢学习
2011-11-5 13:20
0
雪    币: 69
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
可以到链接里的原帖下载
2011-11-5 16:41
0
雪    币: 85
活跃值: (87)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
看到原创求码贴我就进来了,然后点了下那个链接,之后发现原帖居然是我发的....
感谢LZ对这两个CM程序的分析.
P.S. LZ貌似没留下邮箱,那怎么收邀请码?顺便LZ教我下IDA的一些基本使用.(如果坛主没给邀请的话,我可以给LZ的)
2011-11-5 17:27
0
雪    币: 69
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
279375561@qq.com,可以加我qq
ida的问题随时可以问我 ,其实很简单 ,脚本也简单,就是插件比较难
2011-11-5 17:34
0
雪    币: 85
活跃值: (87)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
邀请码已发,15日内有效.
2011-11-6 10:58
0
雪    币: 69
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
10
收到,非常感谢,可以加qq以后有问题请教你比较方便
2011-11-6 13:33
0
雪    币: 27
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
是不错。
2011-11-6 15:04
0
雪    币: 69
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
12
谢谢。。。。
2011-11-7 08:39
0
雪    币: 106
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
谢谢楼主分享  学习了
2011-11-10 12:04
0
游客
登录 | 注册 方可回帖
返回
//