某工程造价软件微狗脱壳
某工程造价软件微狗脱壳高手飘过!
00DB43AE > $60 pushad ;载入停在这里 F8单步!
00DB43AF .55 push ebp ;此时下 hr ESP断点!F9运行!
00DB43B0 .8BEC mov ebp, esp
00DB43B2 .81EC 34040000 sub esp, 434
00DB43B8 .53 push ebx
00DB43B9 .56 push esi
00DB43BA .57 push edi
00DB43BB .C685 B8FEFFFF>mov byte ptr , 0
00DB43C2 .C685 B9FEFFFF>mov byte ptr , 0
00DB43C9 .C685 BAFEFFFF>mov byte ptr , 0
00DB43D0 .C685 BBFEFFFF>mov byte ptr , 0
00DB43D7 .8DBD BCFEFFFF lea edi, dword ptr
00DB43DD .33C0 xor eax, eax
00DB5636 >-/FF25 0861DB00 jmp dword ptr ;停在这里,F8单步!
00DB563C . |C3 retn
00DB563D |90 nop
00DB563E |90 nop
00DB563F |90 nop
00DB5640 |90 nop
00DB5641 |90 nop
00DB5642 |90 nop
00DB5643/$ |55 push ebp
00DB5644|. |8BEC mov ebp, esp
00DB5646|. |83EC 28 sub esp, 28
007AF742 55 push ebp ; 来到这里!这里就是真正的狗壳了!
007AF743 8BEC mov ebp, esp
007AF745 81EC D4030000 sub esp, 3D4
007AF74B 53 push ebx
007AF74C 56 push esi
007AF74D 57 push edi
007AF74E 56 push esi
007AF74F 57 push edi
007AF750 52 push edx
007AF751 51 push ecx
007AF752 53 push ebx
007AF753 50 push eax
007AF754 833D 68047E00 0>cmp dword ptr , 1
007AF75B 0F85 9D170000 jnz 007B0EFE
由于无狗会有提示,找不到加密狗,那么就可以下bp MessageBoxA断点
77D507EA >8BFF mov edi, edi ; 这里断下,取消断点返回
77D507EC 55 push ebp
77D507ED 8BEC mov ebp, esp
77D507EF 833D BC14D777 0>cmp dword ptr , 0
77D507F6 74 24 je short 77D5081C
返回到这里
007B08FF C8 100000 enter 10, 0
007B0903 71 00 jno short 007B0905
007B0905 0000 add byte ptr , al
007B0907 90 nop
007B0908 817D FC E903000>cmp dword ptr , 3E9 ; 在这里下硬件执行断点!
007B090F 74 68 je short 007B0979 ; 这里可以跳过!
007B0911 A1 A4097E00 mov eax, dword ptr
007B0916 48 dec eax
007B0917 6BC0 66 imul eax, eax, 66
007B091A 05 CCFE7D00 add eax, 007DFECC
007B091F 8985 84FDFFFF mov dword ptr , eax
007B0925 833D 8AFE7D00 0>cmp dword ptr , 0
007B092C 74 20 je short 007B094E
007B092E A1 58047E00 mov eax, dword ptr
007B0933 8985 E8FDFFFF mov dword ptr , eax
007B0939 6A 40 push 40
007B093B 68 8EFE7D00 push 007DFE8E
007B0940 FFB5 84FDFFFF push dword ptr
007B0946 6A 00 push 0
007B0948 FF95 E8FDFFFF call dword ptr ; 这个CALL提示找不到加密狗!
007B094E C705 68047E00 0>mov dword ptr , 2 ; 返回到这里!
007B0958 833D AC097E00 0>cmp dword ptr , 0
007B095F 74 09 je short 007B096A
007B0961 6A 01 push 1
007B0963 E8 313B0000 call 007B4499 ; 这里退出了!
007B0968 EB 0F jmp short 007B0979
007B096A 6A 01 push 1
重新来过,在007B0908下硬件执行断点
007B0903 /71 00 jno short 007B0905
007B0905 \0000 add byte ptr , al
007B0907 90 nop
007B0908 817D FC E903000>cmp dword ptr , 3E9 ; 停在这里!此时看的值
堆栈 ss:==0000000B
可见此时的值不等于3E9,所以没有跳走,就出现找不到加密狗了
因此,直接把的值改为3E9,让程序跳走执行。
然后往下拉,直到这里下F2断点
007B0EFE 58 pop eax
007B0EFF 5B pop ebx
007B0F00 59 pop ecx
007B0F01 5A pop edx
007B0F02 5F pop edi
007B0F03 5E pop esi
007B0F04 C9 leave
007B0F05^ FF25 88F87D00 jmp dword ptr ; 在这里下断点
007B0F0B 5F pop edi
007B0F0C 5E pop esi
007B0F0D 5B pop ebx
007B0F0E C9 leave
007B0F0F C3 retn
断下来了,F8单步就到OEP了。
007A9A60 55 push ebp ; 这里就是OEP
007A9A61 8BEC mov ebp, esp
007A9A63 B9 09000000 mov ecx, 9
007A9A68 6A 00 push 0
007A9A6A 6A 00 push 0
007A9A6C 49 dec ecx
007A9A6D^ 75 F9 jnz short 007A9A68
007A9A6F 51 push ecx
007A9A70 53 push ebx
007A9A71 56 push esi
007A9A72 57 push edi
007A9A73 B8 288E7A00 mov eax, 007A8E28
007A9A78 E8 13DCC5FF call 00407690
007A9A7D 33C0 xor eax, eax
可见是Delphi程序,现在可以DUMP了。
接下来是找IAT
007A9A71 56 push esi
007A9A72 57 push edi
007A9A73 B8 288E7A00 mov eax, 007A8E28
007A9A78 E8 13DCC5FF call 00407690 ; 在这里回车跟进!
来到这里
00407690 53 push ebx
00407691 8BD8 mov ebx, eax
00407693 33C0 xor eax, eax
00407695 A3 10477D00 mov dword ptr , eax
0040769A 6A 00 push 0
0040769C E8 2BFFFFFF call 004075CC ; 正常情况下这里应该就是GetModuleHandleA函数!
跟进这个CALL
004075CC 90 nop
004075CD E9 08AE3B00 jmp 007C23DA ; 在来到这里,在这里新建EIP,跟进!
004075D2 8BC0 mov eax, eax
004075D4 90 nop
004075D5 E9 09AE3B00 jmp 007C23E3
007C23DA E8 ECCAFEFF call 007AEECB ; 来到这里!
007C23DF FB sti
007C23E0 A6 cmps byte ptr , by>
程序调用call 007AEECB代码如下
007AEECB 55 push ebp
007AEECC 8BEC mov ebp, esp
007AEECE 53 push ebx
007AEECF 56 push esi
007AEED0 57 push edi
007AEED1 50 push eax
007AEED2 53 push ebx
007AEED3 51 push ecx
007AEED4 52 push edx
007AEED5 56 push esi
007AEED6 57 push edi
007AEED7 8B5D 04 mov ebx, dword ptr
007AEEDA 8BC3 mov eax, ebx
007AEEDC 25 FFFF0000 and eax, 0FFFF
007AEEE1 8B1B mov ebx, dword ptr
007AEEE3 2BD8 sub ebx, eax
007AEEE5 8B03 mov eax, dword ptr ;执行到这里时出现函数 kernel32.GetModuleHandleA
ds:=7C80B741 (kernel32.GetModuleHandleA)
eax=000023DF
007AEEE7 8945 04 mov dword ptr , eax
007AEEEA 5F pop edi
007AEEEB 5E pop esi
007AEEEC 5A pop edx
007AEEED 59 pop ecx
007AEEEE 5B pop ebx
007AEEEF 58 pop eax
007AEEF0 C9 leave
007AEEF1 C3 retn
数据窗口跟随007E831C发现这里就是IAT了,上下找一下IAT的开始和结束处。
007E81F000000000 ;这里开始
007E81F47C93137Antdll.RtlDeleteCriticalSection
007E81F87C9210E0ntdll.RtlLeaveCriticalSection
007E81FC7C921000ntdll.RtlEnterCriticalSection
007E82007C809F91kernel32.InitializeCriticalSection
007E82047C809B84kernel32.VirtualFree
...............
007E91B876B14E4Fwinmm.timeGetTime
007E91BC76B2A8BFwinmm.PlaySoundA
007E91C000000000
007E91C401C50424access.LockupFile
007E91C800000000
007E91CC7C809866kernel32.MulDiv
007E91D000000000 ;这里结束
好了,现在知道了OEP,IAT及IAT大小,就可以DUMP和修复了。
下面是找OEP脚本!
VAR addr
FindOEP:
STI
MOV addr,esp
BPHWS addr, "r"
run
BPHWS 007B0908, "x"
run
mov ,3E9
BPHWS 007B0F05, "x"
RUN
STI
BPHWCALL
MSG"这里就是传说中的OEP了,呵呵!"
ret 好深奥,现在还看不懂 学习一下破狗! 看不懂呀。支持了。、 {:2_156:}先回复下。再看 确实是很难看懂啊,也没有图啊 简直是值得学习的 很难看懂啊,也没有值得学习的 确实是很难看懂啊,也没有图啊 值得学习
页:
[1]
2