首页
社区
课程
招聘
[原创]PEQueKe0.06花指令壳学习笔记[这壳太猛了]
发表于: 2011-6-16 12:20 16475

[原创]PEQueKe0.06花指令壳学习笔记[这壳太猛了]

2011-6-16 12:20
16475

这壳好像是一猛壳!
这个壳成功的运用了花指令生成引擎,小弟最终还是没能分析出OEP出来,我就给大家看下学习记录算了。
我分析到得保护技术:花指令,内存访问异常,花指令用的好成熟,好像还有调用堆栈执行代码异常终止。
花指令在于实践,所以大家一定要拿着OD弄一下,
程序以一个CALL 004050AA开始,然后就进行自定位,


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

上传的附件:
收藏
免费 7
支持
分享
最新回复 (19)
雪    币: 111
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
这壳是几年前的forgot发的那个吗,貌似看过.
花指令和堆栈执行代码,还有几处反调试,好像jmp eip就在这壳里吧.
这个壳代码不多,耐心点,还是可以单步跟过去的
2011-6-16 13:11
0
雪    币: 656
活跃值: (448)
能力值: ( LV12,RANK:360 )
在线值:
发帖
回帖
粉丝
3
00401020    55              push    ebp
00401021    89E5            mov     ebp, esp
00401023    6A FF           push    -1
00401025    68 10304000     push    403010
0040102A    68 28114000     push    401128
0040102F    64:FF35 0000000>push    dword ptr fs:[0]
00401036    64:8925 0000000>mov     dword ptr fs:[0], esp
0040103D    83EC 0C         sub     esp, 0C
00401040    53              push    ebx
00401041    56              push    esi
00401042    57              push    edi


这个是吗?
2011-6-16 13:29
0
雪    币: 1489
活跃值: (993)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
4
LZ好勤奋啊,这些花指令习惯就好,没啥的。
2011-6-16 13:32
0
雪    币: 656
活跃值: (448)
能力值: ( LV12,RANK:360 )
在线值:
发帖
回帖
粉丝
5
貌似很牛,有时间研究下
2011-6-16 13:35
0
雪    币: 111
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
只为给韬哥翻页..

004220AA                       5D              pop ebp                                  ; PEQuake.00422005
004220AB                       81ED 05000000   sub ebp,5
004220B1                       8D75 3D         lea esi,dword ptr ss:[ebp+3D]
004220B4                       56              push esi
004220B5                       FF55 31         call dword ptr ss:[ebp+31]               ; 获取kernel32模块基址
004220B8                       8DB5 81000000   lea esi,dword ptr ss:[ebp+81]
004220BE                       56              push esi
004220BF                       50              push eax
004220C0                       FF55 2D         call dword ptr ss:[ebp+2D]               ; 获取VirtualAlloc地址
004220C3                       8985 8E000000   mov dword ptr ss:[ebp+8E],eax
004220C9                       6A 04           push 4
004220CB                       68 00100000     push 1000
004220D0                       68 0F9C0000     push 9C0F
004220D5                       6A 00           push 0
004220D7                       FF95 8E000000   call dword ptr ss:[ebp+8E]               ; 申请一块buffer
004220DD                       50              push eax
004220DE                       8B9D 7D000000   mov ebx,dword ptr ss:[ebp+7D]
004220E4                       03DD            add ebx,ebp
004220E6                       50              push eax
004220E7                       53              push ebx
004220E8                       E8 04000000     call 004220F1                            ; Aplib解压.解压到刚才申请的buffer
004220ED                       5A              pop edx
004220EE                       55              push ebp
004220EF                       FFE2            jmp edx                                  ; 执行刚才解压出来的代码


00394781                       8D85 62194000   lea eax,dword ptr ss:[ebp+401962]
00394787                       50              push eax
00394788                       6A 00           push 0
0039478A                       FF7424 08       push dword ptr ss:[esp+8]
0039478E                       51              push ecx
0039478F                       6A 00           push 0
00394791                       6A 00           push 0
00394793                       FF95 30644000   call dword ptr ss:[ebp+406430]           ; 创建线程,检测调试器
00394799                       33F6            xor esi,esi
0039479B                       33FF            xor edi,edi


// 查找当前进程  反调试...
00394B33                       5E              pop esi
00394B34                       C706 28010000   mov dword ptr ds:[esi],128
00394B3A                       56              push esi
00394B3B                       53              push ebx
00394B3C                       FF95 1B664000   call dword ptr ss:[ebp+40661B]           ; Process32First
00394B42                       397E 08         cmp dword ptr ds:[esi+8],edi             ; 判断是否是当前进程
00394B45                       0F84 5C010000   je 00394CA7
00394B4B                       56              push esi
00394B4C                       53              push ebx


// 已经找到了当前进程,开始查找父进程
00394CA7                       FF76 18         push dword ptr ds:[esi+18]               ; 找到了当前进程
00394CAA                       5F              pop edi
00394CAB                       56              push esi
00394CAC                       53              push ebx
00394CAD                       FF95 1B664000   call dword ptr ss:[ebp+40661B]
00394CB3                       397E 08         cmp dword ptr ds:[esi+8],edi             ; 这里开始查找当前进程的父进程
00394CB6                       0F84 D5020000   je 00394F91

// 找到父进程了,开始检查父进程
00394F91                       8D76 24         lea esi,dword ptr ds:[esi+24]            ; 找到父进程了
00394F94                       56              push esi                                 ; 开始检查父进程名,不是explorer.exe就挂起
00394F95                       FF95 82644000   call dword ptr ss:[ebp+406482]
00394F9B                       03F0            add esi,eax
00394F9D                       56              push esi
00394F9E                       83EE 07         sub esi,7
00394FA1                       AD              lods dword ptr ds:[esi]
00394FA2                       25 5F5F5F5F     and eax,5F5F5F5F
00394FA7                       3D 434D442E     cmp eax,2E444D43
00394FAC                       0F84 60010000   je 00395112
00394FB2                       5E              pop esi


00395105                       AD              lods dword ptr ds:[esi]
00395106                       25 5F5F5F5F     and eax,5F5F5F5F
0039510B                       3D 4558504C     cmp eax,4C505845                         ; "expl"
00395110                     - 75 FE           jnz short 00395110                       ; 检查到父进程不是explorer就挂起了,jmp eip
00395112                       61              popad
00395113                       BB 46520000     mov ebx,5246
00395118                       833C2B 00       cmp dword ptr ds:[ebx+ebp],0


// 之后开始解压区段了

003996D1  40 AE 80 7C 41 B7 80 7C 7B 1D 80 7C F1 9A 80 7C  @畝|A穩|{€|駳€|
003996E1  00 00 40 00 FC 55 00 00 FA 6A 00 00 F1 20 42 00  ..@.黆..鷍..?B.
003996F1  00 C0 00 00 00 10 00 00 00 2C 00 00 20 4D 01 00  .?.....,.. M.
00399701  E0 D2 00 00 E4 C7 00 00                          嘁..淝....



// 首先这是内存中的一块数据, 从第三行开始,保存的是区段信息


00395122                       53              push ebx
00395123                       6A 04           push 4
00395125                       68 00100000     push 1000
0039512A                       FF342B          push dword ptr ds:[ebx+ebp]
0039512D                       6A 00           push 0
0039512F                       FF95 32520000   call dword ptr ss:[ebp+5232]             ; 申请一块buffer
00395135                       5B              pop ebx


003953DA                       8B78 04         mov edi,dword ptr ds:[eax+4]             ; 取区段RVA,准备解压
003953DD                       03BD 36520000   add edi,dword ptr ss:[ebp+5236]
003953E3                       56              push esi
003953E4                       57              push edi
003953E5                       FF95 42520000   call dword ptr ss:[ebp+5242]             ; Aplib解压区段
003953EB                       8B0C2B          mov ecx,dword ptr ds:[ebx+ebp]
003953EE                       56              push esi
003953EF                       51              push ecx
003953F0                       C1E9 02         shr ecx,2
003953F3                       F3:A5           rep movs dword ptr es:[edi],dword ptr ds>; 将解压出来的数据拷贝回原位置
003953F5                       59              pop ecx
003953F6                       83E1 03         and ecx,3
003953F9                       F3:A4           rep movs byte ptr es:[edi],byte ptr ds:[>
003953FB                       5E              pop esi
003953FC                       53              push ebx
003953FD                       68 00800000     push 8000
00395402                       6A 00           push 0
00395404                       56              push esi
00395405                       FF95 D84D0000   call dword ptr ss:[ebp+4DD8]             ; 释放buffer
0039540B                       5B              pop ebx
0039540C                       83C3 0C         add ebx,0C				; 0xc是下一个区段信息,自定义的结构



// 检查区段是不是都已经解压完了
00395118                       833C2B 00       cmp dword ptr ds:[ebx+ebp],0             ; 判断是不是所有的区段都解压完了
0039511C                       0F84 F2020000   je 00395414				; 没完的话,下面又是重复一轮上面的循环
00395122                       53              push ebx
00395123                       6A 04           push 4
00395125                       68 00100000     push 1000
0039512A                       FF342B          push dword ptr ds:[ebx+ebp]
0039512D                       6A 00           push 0
0039512F                       FF95 32520000   call dword ptr ss:[ebp+5232]             ; 申请一块buffer


00399791  3C B0 00 00 0C 6B 65 72 6E 65 6C 33 32 2E 64 6C  <?..kernel32.dl
003997A1  6C 00 0E 00 00 00 08 52 65 61 64 46 69 6C 65 00  l....ReadFile.
003997B1  1A 57 72 69 74 65 50 72 69 76 61 74 65 50 72 6F  WritePrivatePro
003997C1  66 69 6C 65 53 74 72 69 6E 67 41 00 09 57 72 69  fileStringA..Wri
003997D1  74 65 46 69 6C 65 00 0B 56 69 72 74 75 61 6C 46  teFile.VirtualF
003997E1  72 65 65 00 0C 56 69 72 74 75 61 6C 41 6C 6C 6F  ree..VirtualAllo
003997F1  63 00 0E 53 65 74 46 69 6C 65 50 6F 69 6E 74 65  c.SetFilePointe
00399801  72 00 0D 52 74 6C 5A 65 72 6F 4D 65 6D 6F 72 79  r..RtlZeroMemory
00399811  00 0B 43 6C 6F 73 65 48 61 6E 64 6C 65 00 15 47  .CloseHandle.G
00399821  65 74 50 72 69 76 61 74 65 50 72 6F 66 69 6C 65  etPrivateProfile
00399831  49 6E 74 41 00 09 43 6F 70 79 46 69 6C 65 41 00  IntA..CopyFileA.
00399841  10 47 65 74 4D 6F 64 75 6C 65 48 61 6E 64 6C 65  GetModuleHandle
00399851  41 00 0B 47 65 74 46 69 6C 65 53 69 7A 65 00 0B  A.GetFileSize.
00399861  45 78 69 74 50 72 6F 63 65 73 73 00 0B 43 72 65  ExitProcess.Cre
00399871  61 74 65 46 69 6C 65 41 00 80 B0 00 00 0A 75 73  ateFileA.€?..us
00399881  65 72 33 32 2E 64 6C 6C 00 11 00 00 00 0A 53 68  er32.dll.....Sh

// 内存中有这么一段,导入表结构, 大概结构如下

struct
{
   DWORD dwIAT,
   BYTE  byDllNameLen;
   char *dllname;
   DWORD dwApiNums;   // 从当前DLL中导入的函数个数
   char *apiname;
}

反调试还有个PEB.BeingDebugged..掠了...

IAT处理部分貌似还是PE-Armor哪个版本的, 应该都差不多了,所以不看了


2011-6-16 14:53
0
雪    币: 278
活跃值: (709)
能力值: ( LV15,RANK:520 )
在线值:
发帖
回帖
粉丝
7
还是你厉害,膜拜一下,贴个教程上来嘛
2011-6-16 18:40
0
雪    币: 278
活跃值: (709)
能力值: ( LV15,RANK:520 )
在线值:
发帖
回帖
粉丝
8
再次看见酱油哥的真身
2011-6-16 18:40
0
雪    币: 278
活跃值: (709)
能力值: ( LV15,RANK:520 )
在线值:
发帖
回帖
粉丝
9
谢谢酱油哥指点
2011-6-16 18:41
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
10
‎2004‎年‎10‎月‎1‎日,‏‎15:21:22

快7年了啊
2011-6-16 22:20
0
雪    币: 278
活跃值: (709)
能力值: ( LV15,RANK:520 )
在线值:
发帖
回帖
粉丝
11
搞不定啊,花指令跟着跟着就没法跟了,太多花指令了
2011-6-17 12:16
0
雪    币: 1489
活跃值: (993)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
12
说明楼下的功夫还不够,建议多花花时间来搞。
2011-6-17 13:04
0
雪    币: 304
活跃值: (82)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
13
这么多年了, 还有人在研究你那小P壳, 有自豪感吧。
2011-6-22 11:23
0
雪    币: 79
活跃值: (40)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
14
00393C2C    E8 00000000     call    00393C31
00393C31    5D              pop     ebp
00393C32    81ED 89174000   sub     ebp, 401789
00393C38    8DB5 62194000   lea     esi, dword ptr [ebp+401962]
00393C3E    33C0            xor     eax, eax
00393C40    C706 30000000   mov     dword ptr [esi], 30
00393C46    C746 04 0302000>mov     dword ptr [esi+4], 203
00393C4D    C746 20 0200000>mov     dword ptr [esi+20], 2
00393C54    8946 0C         mov     dword ptr [esi+C], eax
00393C57    8946 10         mov     dword ptr [esi+10], eax
00393C5A    8946 18         mov     dword ptr [esi+18], eax
00393C5D    8946 1C         mov     dword ptr [esi+1C], eax
00393C60    8946 24         mov     dword ptr [esi+24], eax
00393C63    8946 2C         mov     dword ptr [esi+2C], eax
00393C66    50              push    eax
00393C67    FF95 13684000   call    dword ptr [ebp+406813]           ; kernel32.GetModuleHandleA



有的时候运气很重要
2011-6-22 15:13
0
雪    币: 421
活跃值: (60)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
15
虚心学习~
求全部教程
2011-6-22 17:08
0
雪    币: 278
活跃值: (709)
能力值: ( LV15,RANK:520 )
在线值:
发帖
回帖
粉丝
16
想研究很简单,只是发下学习记录而以,兄弟你貌似很厉害啊
2011-6-24 18:27
0
雪    币: 421
活跃值: (60)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
17
设置od为停止在自解压真正入口处可到401020处,脱壳后无法行,irc修复提示401020处无可用信息。脱壳失败。
2011-6-25 10:42
0
雪    币: 278
活跃值: (709)
能力值: ( LV15,RANK:520 )
在线值:
发帖
回帖
粉丝
18
,原来这样啊,看来单步对付 花指令+异常 还是不行啊
2011-6-25 12:57
0
雪    币: 19
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
。。都是高手啊,,支持了,,
2011-6-28 12:09
0
雪    币: 244
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
004050B1    8D75 3D         LEA ESI,DWORD PTR SS:[EBP+3D]   ; "Kernel32.dll"
004050B4    56              PUSH ESI                        ; Kernel32.dll的偏移地址
004050B5    FF55 31         CALL DWORD PTR SS:[EBP+31]      ; GetModuleHandleA,获得模块基址
004050B8    8DB5 81000000   LEA ESI,DWORD PTR SS:[EBP+81]   ; “VirtualAlloc”
004050BE    56              PUSH ESI                        ; VirtualAlloc的偏移地址
004050BF    50              PUSH EAX                        ; Kernel32.dll的模块基址
004050C0    FF55 2D         CALL DWORD PTR SS:[EBP+2D]      ; GetProcAddress获得函数地址
004050C3    8985 8E000000   MOV DWORD PTR SS:[EBP+8E],EAX   ; VirtualAlloc函数地址保存的地方
有一问题,就是偏移地址,这儿称为偏移地址是否妥当?它是相对谁的偏移地址?它的基址是多少?我没有看明白,请高人解惑一下.
2012-2-16 19:52
0
游客
登录 | 注册 方可回帖
返回
//