lal978112 发表于 2010-6-1 13:46:25

某工程造价软件微狗脱壳

某工程造价软件微狗脱壳
高手飘过!

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

pjaaa 发表于 2010-6-1 19:03:35

好深奥,现在还看不懂

ldlsgd 发表于 2010-6-1 19:26:21

学习一下破狗!

nuojiya8 发表于 2010-6-4 19:57:34

看不懂呀。支持了。、

309350785 发表于 2010-7-25 19:24:24

{:2_156:}先回复下。再看

flyzhouyc 发表于 2010-7-25 23:43:13

确实是很难看懂啊,也没有图啊

flyzhouyc 发表于 2010-7-27 19:43:33

简直是值得学习的

bohaileon 发表于 2011-2-18 13:23:50

很难看懂啊,也没有值得学习的

rszmyc 发表于 2011-3-16 08:16:03

确实是很难看懂啊,也没有图啊

buyaojuzi 发表于 2012-4-13 10:18:44

值得学习
页: [1] 2
查看完整版本: 某工程造价软件微狗脱壳