加壳程序是从<破解实例信息资源(豪华版)>上下载的
加壳对象是罗云彬书第四章的窗口程序
附件里是脱的记事本
初学脱壳,正在一个壳一个壳的脱着来,都是老壳,纯粹是学习的,高人让过噶,请多指教:
1)程序OD进入后申请一块内存,用得到的内存开始地址减去0040397D后把结果存入ebp里面,后面要用它来定位数据,把自身的代码移动到申请的内存后解码.
00403000 > 9C pushfd
00403001 60 pushad
00403002 BD BCF6FFFF mov ebp, -944
00403007 01AD 543A4000 add dword ptr [ebp+403A54], ebp
0040300D FFB5 503A4000 push dword ptr [ebp+403A50]
00403013 6A 40 push 40
00403015 FF95 883A4000 call dword ptr [ebp+403A88] ; kernel32.GlobalAlloc
0040301B 50 push eax
0040301C 50 push eax
0040301D 2D 7D394000 sub eax, 0040397D
00403022 8985 7E394000 mov dword ptr [ebp+40397E], eax
00403028 5F pop edi
00403029 8DB5 7D394000 lea esi, dword ptr [ebp+40397D]
0040302F B9 FC000000 mov ecx, 0FC
00403034 F3:A5 rep movs dword ptr es:[edi], dword ptr [e>
00403036 5F pop edi
00403037 FFE7 jmp edi ; 分配内存后把,程序搬到动态内存中执行
2)进入后在一个call 001529B4里面解密壳代码存到下面,完了又存回来,然后跳过去执行
00152988 BD 0BF0D4F>mov ebp, FFD4F00B
0015298D 8BF7 mov esi, edi
0015298F 81C6 60010>add esi, 160
00152995 81C7 EC030>add edi, 3EC
0015299B 57 push edi
0015299C 56 push esi
0015299D 57 push edi
0015299E 55 push ebp
0015299F 57 push edi
001529A0 56 push esi
001529A1 E8 0E00000>call 001529B4 ;这个就是执行解密代码循环的
001529A6 83C4 08 add esp, 8
001529A9 5D pop ebp
001529AA 91 xchg eax, ecx
001529AB 5E pop esi
001529AC 5F pop edi
001529AD F3:A4 rep movs byte ptr es:[edi], byte ptr [esi];存回来
001529AF E9 3401000>jmp 00152AE8 ;从这里开始的代码就是程序刚解密出来的代码
3)壳读取第一个段中的源程序数据进行解密,算法与前面的相同:
00152AE8 5F pop edi
00152AE9 8DB5 713C4>lea esi, dword ptr [ebp+403C71]
00152AEF 55 push ebp
00152AF0 57 push edi
00152AF1 56 push esi
00152AF2 AD lods dword ptr [esi]
00152AF3 0BC0 or eax, eax
00152AF5 74 3B je short 00152B32
00152AF7 92 xchg eax, edx
00152AF8 AD lods dword ptr [esi]
00152AF9 91 xchg eax, ecx
00152AFA 57 push edi
00152AFB 51 push ecx
00152AFC 8BF2 mov esi, edx
00152AFE F3:A4 rep movs byte ptr es:[edi], byte ptr [esi] ;把源程序读取进来
00152B20 52 push edx
00152B21 57 push edi
00152B22 E8 8DFEFFF>call 001529B4 ;解密源程序代码
4)把解密出来的源程序数据存到[004011DD]和[00402000]开始的地方去
00152B45 57 push edi
00152B46 56 push esi
00152B47 87DE xchg esi, ebx
00152B49 57 push edi
00152B4A 51 push ecx
00152B4B F3:A4 rep movs byte ptr es:[edi], byte ptr [esi]
00152B4D 59 pop ecx
00152B4E 5E pop esi
00152B4F 8BFA mov edi, edx
00152B51 F3:A4 rep movs byte ptr es:[edi], byte ptr [esi]
上面的两个循环存储指令就是了,下面程序会把第一个[004011DD]的数据又给覆盖了,只只保留[00402000]的那一份
5)输入表的处理就紧接着:
00152BBF 03F2 add esi, edx
00152BC1 52 push edx
00152BC2 56 push esi
00152BC3 E8 0F00000>call 00152BD7
00152BC8 72 0B jb short 00152BD5
Call里就调用LoadLibrary和GetProcAddress函数来填充源程序的IAT表
00152BA6 61 popad
00152BA7 9D popfd
00152BA8 BA 6311400>mov edx, 401163
00152BAD - FFE2 jmp edx ; pcsnk_Fi.00401163
输入表没有被破坏,壳直接就跳到OEP了,dump下来Import修复,一切搞定
还是传不上去
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)