大家好  
我是s9un  
传说中的squn的弟弟




今天给大家带来一个全程分析一个超简单壳的教程




这个壳是一个叫做zapline的写的，是吾爱的超级版主
不过这个壳算是一点技术含量都没有啊





好了，废话不多说了
开始 fuckzapline






这是一个加壳后的记事本






PEID显示 未知
然后看区段，有一个fuckximo区段

据说ximo是zapline的师傅，也是吾爱的超级版主






加壳后的记事本的入口点  就在这个fuckximo区段

这个区段就是传说中的 外壳shell区段  也就相当于 lorder了




好  OD  载入





入口就是一个jmp

细心观察会发现这个jmp后面跟的是一些字

哈哈 又是fuckximo






接下来一个call  call了下一行

这个是用来重定位的，也有一定的防单步的作用



ESI就是 那一行指令在内存中的地址了

然后通过减法可以得到一个偏移

0040D0FF - 004010FF  =  C000  就得到了这个偏移
 放在ESI中
 
 
 ESI+401164   得到的就是编程时
 相对放在401164的东西
 在程序加载后所处的位置
 
 
我们看看  401164 + C000 = 0040D164


 GetModuleHandleA
 是这个字符串
 


判断获取成功没有



0040D030
/*40D030*/  push    esi
/*40D031*/  xor     eax, eax
/*40D033*/  mov     eax, dword ptr fs:[eax+30]
/*40D037*/  mov     eax, dword ptr ds:[eax+C]
/*40D03A*/  mov     esi, dword ptr ds:[eax+1C]
/*40D03D*/  lods    dword ptr ds:[esi]
/*40D03E*/  mov     eax, dword ptr ds:[eax+8]
/*40D041*/  pop     esi
/*40D042*/  retn

这个CALL很经典 

作用是获取程序 kernel32.dll的基址

从程序的 PEB/TEB下手  获得kernel32.dll的基址

kernel32.dll的基址   作用是什么  我们接着看下去



参数1：函数名字符串的地址
参数2：kernel32.dll的基址 


0040D050
/*40D050*/  push    ebx
/*40D051*/  push    ebp
/*40D052*/  push    esi
/*40D053*/  mov     esi, dword ptr ss:[esp+10]
/*40D057*/  xor     edx, edx
/*40D059*/  push    edi
/*40D05A*/  test    esi, esi
/*40D05C*/  je      NotePad_.0040D0E6
/*40D062*/  mov     eax, dword ptr ss:[esp+18]
/*40D066*/  test    eax, eax
/*40D068*/  je      short NotePad_.0040D0E6
/*40D06A*/  cmp     word ptr ds:[esi], 5A4D
/*40D06F*/  jnz     short NotePad_.0040D0E6
/*40D071*/  mov     eax, dword ptr ds:[esi+3C]
/*40D074*/  add     eax, esi
/*40D076*/  cmp     dword ptr ds:[eax], 4550
/*40D07C*/  jnz     short NotePad_.0040D0E6
/*40D07E*/  mov     eax, dword ptr ds:[eax+78]
/*40D081*/  add     eax, esi
/*40D083*/  cmp     eax, esi
/*40D085*/  je      short NotePad_.0040D0E6
/*40D087*/  mov     edi, dword ptr ds:[eax+20]
/*40D08A*/  mov     ecx, dword ptr ds:[eax+1C]
/*40D08D*/  mov     ebp, dword ptr ds:[eax+24]
/*40D090*/  mov     ebx, dword ptr ds:[eax+18]
/*40D093*/  add     edi, esi
/*40D095*/  add     ecx, esi
/*40D097*/  add     ebp, esi
/*40D099*/  mov     eax, ebx
/*40D09B*/  dec     ebx
/*40D09C*/  mov     dword ptr ss:[esp+14], ecx
/*40D0A0*/  test    eax, eax
/*40D0A2*/  je      short NotePad_.0040D0E6
/*40D0A4*/  mov     eax, dword ptr ds:[edi]
/*40D0A6*/  mov     ecx, dword ptr ss:[esp+18]
/*40D0AA*/  add     eax, esi
/*40D0AC*/  push    ecx
/*40D0AD*/  push    eax
/*40D0AE*/  call    NotePad_.0040D000
/*40D0B3*/  add     esp, 8
/*40D0B6*/  test    eax, eax
/*40D0B8*/  je      short NotePad_.0040D0D0
/*40D0BA*/  add     edi, 4
/*40D0BD*/  add     ebp, 2
/*40D0C0*/  mov     edx, ebx
/*40D0C2*/  dec     ebx
/*40D0C3*/  test    edx, edx
/*40D0C5*/  jnz     short NotePad_.0040D0A4
/*40D0C7*/  pop     edi
/*40D0C8*/  pop     esi
/*40D0C9*/  pop     ebp
/*40D0CA*/  xor     eax, eax
/*40D0CC*/  pop     ebx
/*40D0CD*/  retn    8
/*40D0D0*/  mov     ecx, dword ptr ss:[esp+14]
/*40D0D4*/  xor     eax, eax
/*40D0D6*/  mov     ax, word ptr ss:[ebp]
/*40D0DA*/  pop     edi
/*40D0DB*/  mov     eax, dword ptr ds:[ecx+eax*4]
/*40D0DE*/  add     eax, esi
/*40D0E0*/  pop     esi
/*40D0E1*/  pop     ebp
/*40D0E2*/  pop     ebx
/*40D0E3*/  retn    8
/*40D0E6*/  pop     edi
/*40D0E7*/  pop     esi
/*40D0E8*/  pop     ebp
/*40D0E9*/  mov     eax, edx
/*40D0EB*/  pop     ebx
/*40D0EC*/  retn    8

这个CALL同样很经典

相当于 GetProcAddress
也就是获得函数的地址

通过kernel32.dll的基址 和 函数名

来获取函数的地址    从而调用这个函数



ctrl+F9


这里，我们得到了
 GetModuleHandleA
 这个函数的地址
 
 
 
 
 判断获取成功没有
 
 
 
 
 
 参数为0  调用这个函数
 
 也就是得到这个程序进程自己的基址
 
 
 
 再判断获取成功没有
 
 
 
 
 
 
 从程序文件的偏移 20h的地方
 
 读了一个值  存在堆栈中   004010CC  这个是读取到的值
 
 
 
 
 从IMAGE_DOS_HEADER得到 elanw的值
 
 加上基址，就是 IMAGE_NT_HEADER的地址
 
 
 
 得到代码区段的 IMAGE_SECTION_HEADERS的地址
 
 从中
得到 区段起始地址  放在ECX   1000
得到  区段大小  放在EDX       4000

ECX+EAX  得到在内存中的地址    00401000



判断大小是否为0



循环的  将区段的内容 
与0x2B异或
解密区段




解密完毕
把开始存在堆栈的地址  004010CC拿出来

再用call  跳转过去

004010CC就是OEP了

到此， 这个壳就解决完毕了




如果要写完美静态脱壳机
只需要
1，把区段与0x2B异或解密
2，从文件的 20h偏移得到 OEP的地址
3，删除fuckximo区段




好了 这个教程就做完了

膜拜一下zapline  膜拜一下fuckximo