tElock v0.92a 脱壳手记
本帖最后由 小鸡拜拜 于 2009-11-2 22:49 编辑004E567D >^\E9 7EE9FFFF jmp Hzbit.004E4000 //OD载入
004E5682 0000 add byte ptr ds:,al//F7跟进
004E5684 0000 add byte ptr ds:,al
004E5686 0000 add byte ptr ds:,al
004E5688 0000 add byte ptr ds:,al
004E568A 0000 add byte ptr ds:,al
004E568C C8 560E00 enter 0xE56,0x0
004E4000 FC cld //F7到达这里
004E4001 60 pushad
004E4002 E8 02000000 call Hzbit.004E4009 //F8走到这一步执行ESP定律
004E4007 E8 00E80000 call Hzbit.004F280C //F9运行后会出现文件效验失败的对话框如图1
004E400C 0000 add byte ptr ds:,al
004E400E 5E pop esi
紧跟着F12暂停后,接着按ait+f9返回到用户代码,此时点对话框上的确定按钮
004E4D81 6A 00 push 0x0 //停在了这里 接着向上找一句可以跳过的地址 来跳过错误
004E4D83 FF5424 E0 call dword ptr ss:
004E4D87 8B95 66B34000 mov edx,dword ptr ss:
004E4D8D 0195 32B34000 add dword ptr ss:,edx
004E4D93 0195 42B34000 add dword ptr ss:,edx
004E4D07 /0F85 9C000000 jnz Hzbit.004E4DA9 //向上找后发现这一句可以跳过下面的错误
004E4D0D |8B95 66B34000 mov edx,dword ptr ss://现在我们来寻找一种新方法来避开错误
004E4D13 |0195 32B34000 add dword ptr ss:,edx//从新载入程序 切记删除我们刚下的硬件断点
004E4D19 |0195 3EB34000 add dword ptr ss:,edx
004E4D1F |6A 30 push 0x30
004E4D21 |53 push ebx
004E567D >^\E9 7EE9FFFF jmp Hzbit.004E4000 //程序从载后停在这里
004E5682 0000 add byte ptr ds:,al//ait+m打开内存镜像
004E5684 0000 add byte ptr ds:,al//接着在数据段 DATA段下内存写入断点
004E5686 0000 add byte ptr ds:,al
004E5688 0000 add byte ptr ds:,al
004E568A 0000 add byte ptr ds:,al
Memory map, 条目 21 //在这里下内存写入断点
地址=004A4000 //接着shift+f9运行程序
大小=00003000 (12288.)
属主=Hzbit 00400000
区段=DATA
包含=数据
类型=Imag 01001002
访问=R
初始访问=RWE
004E4894 AA stos byte ptr es: //程序停在了这里
004E4895 69D2 A5B0CD4B imul edx,edx,0x4BCDB0A5 //取消内存写入断点
004E489B F9 stc //在次打开内存镜像 在CODE段下断
004E489C 72 02 jb short Hzbit.004E48A0
004E489E CD20 D1C269DB vxdjump 0xDB69C2D1
004E48A4 70 1F jo short Hzbit.004E48C5
Memory map, 条目 20 //在这里F2下断 接着shift+f9运行程序
地址=00401000
大小=000A3000 (667648.)
属主=Hzbit 00400000
区段=CODE
类型=Imag 01001002
访问=R
初始访问=RWE
004A301C 55 push ebp //这里就是OEP 发现此程序为DELPHI编写
004A301D 8BEC mov ebp,esp //loadpe把程序转存
004A301F 83C4 EC add esp,-0x14 //接着importRCE修复IAT指针
004A3022 53 push ebx //发现有422个指针是无效的 如图2
004A3023 33C0 xor eax,eax //在这里我们可以使用importRCE的等级跟踪3或者插件去进行逐一修复指针 但是我们
今天的目的就是直接寻找他的magic jump 所以选中其中一个无效的指针如图3 复制其RVA的地址 并将其地址与该目标程序的基址相加
004A3025 8945 EC mov dword ptr ss:,eax//找到我们要的地址之后我们继续重新载入程序
004A3028 B8 CC2B4A00 mov eax,Hzbit.004A2BCC
004A302D E8 8E3BF6FF call Hzbit.00406BC0
004A3032 33C0 xor eax,eax
004A3034 55 push ebp
004A3035 68 9B314A00 push Hzbit.004A319B
000AC1CC+00400000=004AC1CC
004E567D >^\E9 7EE9FFFF jmp Hzbit.004E4000 //从载程序之后 我们在命令行输入
004E5682 0000 add byte ptr ds:,al
004E5684 0000 add byte ptr ds:,al
004E5686 0000 add byte ptr ds:,al
004E5688 0000 add byte ptr ds:,al
004E568A 0000 add byte ptr ds:,al
004E568C C8 560E00 enter 0xE56,0x0
数据窗口
004AC1CC3CFACB5B //这里就是第一个无效指针的地址
004AC1D0D83F499E //右键下硬件访问断点 接着shift+f9运行
004AC1D45AC4CA71
004AC1D8583426A9
004AC1DCE8C81F8A
004E40A3 90 nop //当运行2次之后出现了错误提示框
004E40A4 90 nop //一开始就是下了硬件访问断点之后被检测出来的
004E40A5 33DB xor ebx,ebx //继续重载程序在第一次运行时去查找错误的地址将它跳过
004E40A7 F7F3 div ebx //找到我们刚找的跳过错误地址004E4D07
004E40A9 64:67:8F06 0000pop dword ptr fs:
004E40AF 83C4 04 add esp,0x4
004E4D07 68 FE5E3D0F push 0xF3D5EFE //此时发现我们的程序并未解码
004E4D0C 38B8 78192CC8 cmp byte ptr ds:,bh //删除所有的断点包括硬件访问
004E4D12 94 xchg eax,esp //在一次从新载入程序
004E4D13 3F aas
004E4D14 E3 6C jecxz short Hzbit.004E4D82
004E567D >^\E9 7EE9FFFF jmp Hzbit.004E4000 //程序再一次重载之后
004E5682 0000 add byte ptr ds:,al //在次打开内存镜像
004E5684 0000 add byte ptr ds:,al //同样在DATA段下内存写入断点
004E5686 0000 add byte ptr ds:,al
004E5688 0000 add byte ptr ds:,al
004E568A 0000 add byte ptr ds:,al
Memory map, 条目 21 //在这里下内存写入断点
地址=004A4000 //接着shift+f9运行程序
大小=00003000 (12288.)
属主=Hzbit 00400000
区段=DATA
包含=数据
类型=Imag 01001002
访问=R
初始访问=RWE
004E4894 AA stos byte ptr es: //程序停在这里我们将内存断点删除
004E4895 69D2 A5B0CD4B imul edx,edx,0x4BCDB0A5 //在次查找我们可以跳过错误的地址
004E489B F9 stc //Ctrl+g查找004E4D07
004E489C 72 02 jb short Hzbit.004E48A0
004E489E CD20 D1C269DB vxdjump 0xDB69C2D1
004E4CF8 /0F85 AB000000 jnz Hzbit.004E4DA9 //在这里F2下断
004E4CFE |53 push ebx
004E4CFF |FF95 BCB24000 call dword ptr ss:
004E4D05 |85C0 test eax,eax
004E4D07 |0F85 9C000000 jnz Hzbit.004E4DA9 //在这里也F2下断
004E4D0D 8B95 66B34000 mov edx,dword ptr ss: //因为这两句都可以跳过下面的错误提示
004E4D13 0195 32B34000 add dword ptr ss:,edx
004E4D19 0195 3EB34000 add dword ptr ss:,edx
004E4DB5 60 pushad //这里以下就开始逐一取出我们的IAT指针
004E4DB6 33C9 xor ecx,ecx
004E4DB8 2AF6 sub dh,dh
004E4DBA 8A13 mov dl,byte ptr ds:
004E4DBC F6C2 40 test dl,0x40
004E4DBF 74 03 je short Hzbit.004E4DC4
004E4DC1 80E2 5F and dl,0x5F
004E4DC4 0AD2 or dl,dl
004E4DC6 74 1E je short Hzbit.004E4DE6
004E4DC8 43 inc ebx
004E4DC9 FEC6 inc dh
004E4DCB 41 inc ecx
004E4DCC 3A5408 FF cmp dl,byte ptr ds: //在这里逐一比较需要加密与否
004E4DD0^ 74 E8 je short Hzbit.004E4DBA
004E4DD2 3A5408 08 cmp dl,byte ptr ds:
004E4DD6^ 74 E2 je short Hzbit.004E4DBA
004E4DD8 3A5408 12 cmp dl,byte ptr ds:
004E4DDC^ 74 DC je short Hzbit.004E4DBA
004E4DDE 3A5408 1D cmp dl,byte ptr ds:
004E4DE2^ 74 D6 je short Hzbit.004E4DBA
004E4DE4^ EB D0 jmp short Hzbit.004E4DB6
004E4DE9 C685 5EAC4000 00 mov byte ptr ss:,0x0 //这里就是相当于比较EBP+0040AC5E是否为0。如果为0则不加密 如
果不为0则加密
004E4DF0 74 07 je short Hzbit.004E4DF9 //们走到这一句时会发现他是不跳的 则是加密指针 同时在寄存器窗口可以
发现他准备开始加密KERNE32模块的指针 所以可以判断得出这里就是magic jump 是必须跳的 我们二进制复制下标志0A F6 61
004E4DF2 808D 5EAC4000 01 or byte ptr ss:,0x1
004E5024 43 inc
004E5025 3803 cmp byte ptr ds:,al //到了这里就可以从头在来开始完整的脱壳
004E5027^ 75 F9 jnz short Hzbit.004E5022
004E5029 8385 52B34000 04 add dword ptr ss:,0x4
004E5030^ E9 D4FDFFFF jmp Hzbit.004E4E09
004E5035 83C6 14 add esi,0x14
004E5038 8B95 66B34000 mov edx,dword ptr ss:
004E503E^ E9 92FCFFFF jmp Hzbit.004E4CD5 //这里开始循环上去执行加密
004E567D >^\E9 7EE9FFFF jmp Hzbit.004E4000 //程序再一次重载之后
004E5682 0000 add byte ptr ds:,al //在次打开内存镜像
004E5684 0000 add byte ptr ds:,al //同样在DATA段下内存写入断点
004E5686 0000 add byte ptr ds:,al
004E5688 0000 add byte ptr ds:,al
004E568A 0000 add byte ptr ds:,al
Memory map, 条目 21 //在这里下内存写入断点
地址=004A4000 //接着shift+f9运行程序
大小=00003000 (12288.)
属主=Hzbit 00400000
区段=DATA
包含=数据
类型=Imag 01001002
访问=R
初始访问=RWE
004E4894 AA stos byte ptr es: //程序停在这里 CTRL+B二进制查找0A F6 61
004E4895 69D2 A5B0CD4B imul edx,edx,0x4BCDB0A5
004E489B F9 stc
004E489C 72 02 jb short Hzbit.004E48A0
004E489E CD20 D1C269DB vxdjump 0xDB69C2D1
004E48A4 70 1F jo short Hzbit.004E48C5
004E4DE9 C685 5EAC4000 00 mov byte ptr ss:,0x0
004E4DF0 74 07 je short Hzbit.004E4DF9 //改成JMP
004E4DF2 808D 5EAC4000 01 or byte ptr ss:,0x1//并且再次打开内存镜像 在CODE断F2下断
004E4DF9 33C0 xor eax,eax
Memory map, 条目 20 //在这里F2下断 接着shift+f9运行程序
地址=00401000
大小=000A3000 (667648.)
属主=Hzbit 00400000
区段=CODE
类型=Imag 01001002
访问=R
初始访问=RWE
004A301C 55 push ebp //停在OEP 此时我们输入刚被加密IAT的地址看看
004A301D 8BEC mov ebp,esp //我们在命令行输入d 004AC1CC 发现指针全部回来啦
004A301F 83C4 EC add esp,-0x14 //此时用OD自带的DUMP插件把程序DUMP即可 也不用修复了
004A3022 53 push ebx
004A3023 33C0 xor eax,eax
004A3025 8945 EC mov dword ptr ss:,eax
004A3028 B8 CC2B4A00 mov eax,Hzbit.004A2BCC
004AC1CC7C93188Antdll.RtlDeleteCriticalSection
004AC1D07C9210EDntdll.RtlLeaveCriticalSection
004AC1D47C921005ntdll.RtlEnterCriticalSection
004AC1D87C809F11kernel32.InitializeCriticalSection
004AC1DC7C809B04kernel32.VirtualFree
004AC1E07C809A71kernel32.VirtualAlloc
//脱壳后的文件 和未脱壳的文件 鸡大形象玉照
图文并茂,好鸡好鸡
恭喜鸡大,现在荣升爆破鸡,脱壳鸡 无法学习,只能膜拜 :lol这个得好好学习下了。谢谢楼主了~ 学习啦,强啊,最近么多大作 進來學習一下小鸡拜拜版主對于指針的處理. 好文,學習手動查找IAT的好辦法 :curse:
太强大啦 JJ长的还真的够快的 学习好文好名小鸡拜拜 鸡= =
那是只什么鸡啊