- UID
- 31120
注册时间2007-5-1
阅读权限10
最后登录1970-1-1
周游历练
该用户从未签到
|
发表于 2008-4-30 19:16:54
|
显示全部楼层
OD载入,忽略所有异常及C000001E (INVALID LOCK SEQUENCE)如果不忽略这个会有很多异常。
不要隐藏OD,发现隐藏了之后断不下来
01058000 > 60 PUSHAD
01058001 E8 00000000 CALL sol.01058006
01058006 5D POP EBP
下断he GetModuleHandleA+5,shift+f9
7C80B6A6 837D 08 00 CMP DWORD PTR SS:[EBP+8],0
7C80B6AA 74 18 JE SHORT kernel32.7C80B6C4
7C80B6AC FF75 08 PUSH DWORD PTR SS:[EBP+8]
7C80B6AF E8 C0290000 CALL kernel32.7C80E074
7C80B6B4 85C0 TEST EAX,EAX
7C80B6B6 74 08 JE SHORT kernel32.7C80B6C0
7C80B6B8 FF70 04 PUSH DWORD PTR DS:[EAX+4]
7C80B6BB E8 7D2D0000 CALL kernel32.GetModuleHandleW
********************************************************************************************
1.
000794FC /0007EC44
00079500 |00BB6DF3 返回到 00BB6DF3 来自 kernel32.GetModuleHandleA
00079504 |00BCBC1C ASCII "kernel32.dll"
00079508 |00BCCEC4 ASCII "VirtualAlloc" //此时的堆栈,shift+f9
2.
000794FC /0007EC44
00079500 |00BC6E10 返回到 00BC6E10 来自 kernel32.GetModuleHandleA
00079504 |00BDBC1C ASCII "kernel32.dll"
00079508 |00BDCEB8 ASCII "VirtualFree" //此时的堆栈,shift+f9
3.
00079260 /00079500
00079264 |00BB5CE1 返回到 00BB5CE1 来自 kernel32.GetModuleHandleA
00079268 |000793B4 ASCII "kernel32.dll" //判断返回的标记
第一个断点完成,在菜单选调试->硬件断点->删除断点alt+f9返回。
********************************************************************************************
00BA5CE1 8B0D AC40BD00 MOV ECX,DWORD PTR DS:[BD40AC] //返回到这(有时候重载OD到这地址会是00BB5CE1,我觉得是壳加密的
原因,而且每个人机器和系统不一样的话地址应该不一样的吧,似乎5CE1这里是一样的。见寂寞的季节的贴子)
00BA5CE7 89040E MOV DWORD PTR DS:[ESI+ECX],EAX
00BA5CEA A1 AC40BD00 MOV EAX,DWORD PTR DS:[BD40AC]
00BA5CEF 391C06 CMP DWORD PTR DS:[ESI+EAX],EBX
00BA5CF2 75 16 JNZ SHORT 00BA5D0A
00BA5CF4 8D85 B4FEFFFF LEA EAX,DWORD PTR SS:[EBP-14C]
00BA5CFA 50 PUSH EAX
00BA5CFB FF15 BC62BC00 CALL DWORD PTR DS:[BC62BC] ; kernel32.LoadLibraryA
00BA5D01 8B0D AC40BD00 MOV ECX,DWORD PTR DS:[BD40AC]
00BA5D07 89040E MOV DWORD PTR DS:[ESI+ECX],EAX
00BA5D0A A1 AC40BD00 MOV EAX,DWORD PTR DS:[BD40AC]
00BA5D0F 391C06 CMP DWORD PTR DS:[ESI+EAX],EBX
00BA5D12 0F84 2F010000 JE 00BA5E47 //magic jump改为jmp记下地址
00BA5D18 33C9 XOR ECX,ECX
00BA5D1A 8B07 MOV EAX,DWORD PTR DS:[EDI]
00BA5D1C 3918 CMP DWORD PTR DS:[EAX],EBX
00BA5D1E 74 06 JE SHORT 00BA5D26
00BA5D20 41 INC ECX
00BA5D21 83C0 0C ADD EAX,0C
00BA5D24 ^ EB F6 JMP SHORT 00BA5D1C
00BA5D26 8BD9 MOV EBX,ECX
00BA5D28 C1E3 02 SHL EBX,2
00BA5D2B 53 PUSH EBX
00BA5D2C E8 63F20100 CALL 00BC4F94 ; JMP to msvcrt.operator new
00BA5D31 8B0D A440BD00 MOV ECX,DWORD PTR DS:[BD40A4]
00BA5D37 89040E MOV DWORD PTR DS:[ESI+ECX],EAX
改完magic jump下断bp GetCurrentThreadId,shift+f9观察堆栈
7C809728 > 64:A1 18000000 MOV EAX,DWORD PTR FS:[18] //停在这里了
7C80972E 8B40 24 MOV EAX,DWORD PTR DS:[EAX+24]
7C809731 C3 RETN
********************************************************************************************
1.
00078B24 73391E36 /CALL 到 GetCurrentThreadId 来自 73391E30
00078B28 00000001
00078B2C 73391C1A 返回到 73391C1A 来自 73391DE2
00078B30 73391B60 返回到 73391B60 来自 73391B8C
2.再shift+f9
00078B04 7339353F /CALL 到 GetCurrentThreadId 来自 73393539
3.shift+f9
出错了,一片红色
0007205C 00BD7898 ASCII "RALB294AEC2"
00072060 00BB1846 返回到 00BB1846 来自 00BACC9F
不知道是什么原因,想了一下会不会是magic jump那呢?
重新来过,到第二步的时候ctrl+g找到00BA5D12改回来shift+f9运行
0007F6F8 00BA60EC /CALL 到 GetCurrentThreadId 来自 00BA60E6
看过黑鹰的教程说是感觉缓存比较大的时候是返回时机,我是从这来看的
前面两个堆栈都是7339而这个比较不同,跨度也大,所以我决定在这返回。
alt+b把断点取消掉,alt+f9返回
********************************************************************************************
00BA60EC 50 PUSH EAX //返回到这里了,f8进入吧。
00BA60ED FF75 FC PUSH DWORD PTR SS:[EBP-4]
00BA60F0 E8 05000000 CALL 00BA60FA //这个call我用f8过的后来试过用f7过的话,走下去程序就运行了
按道理这应该算是个近call,请大虾指点。
00BA60F5 83C4 0C ADD ESP,0C
00BA60F8 C9 LEAVE
00BA60F9 C3 RETN //程序跳转
00BBF5F6 33DB XOR EBX,EBX //来到这里
00BBF5F8 53 PUSH EBX
00BBF5F9 E8 95CBFEFF CALL 00BAC193
00BBF5FE 59 POP ECX
00BBF5FF BE 98FABC00 MOV ESI,0BCFA98
00BBF604 8BCE MOV ECX,ESI
00BBF606 E8 3393FDFF CALL 00B9893E
00BBF60B 84C0 TEST AL,AL
00BBF60D 75 09 JNZ SHORT 00BBF618
00BBF60F 6A 01 PUSH 1
00BBF611 8BCE MOV ECX,ESI
00BBF613 E8 D2E2FDFF CALL 00B9D8EA
00BBF618 C705 E0C0BC00 D>MOV DWORD PTR DS:[BCC0E0],0BCCFD8
00BBF622 B9 00ECBC00 MOV ECX,0BCEC00
00BBF627 E8 312EFDFF CALL 00B9245D
00BBF62C 53 PUSH EBX
00BBF62D E8 2B2EFDFF CALL 00B9245D
00BBF632 59 POP ECX
00BBF633 33D2 XOR EDX,EDX
00BBF635 8955 DC MOV DWORD PTR SS:[EBP-24],EDX
00BBF638 895D FC MOV DWORD PTR SS:[EBP-4],EBX
00BBF63B A0 BC00BD00 MOV AL,BYTE PTR DS:[BD00BC]
00BBF640 8845 C8 MOV BYTE PTR SS:[EBP-38],AL
00BBF643 84C0 TEST AL,AL
00BBF645 75 4D JNZ SHORT 00BBF694
00BBF647 A1 E400BD00 MOV EAX,DWORD PTR DS:[BD00E4]
00BBF64C 8B88 88000000 MOV ECX,DWORD PTR DS:[EAX+88]
00BBF652 894D C4 MOV DWORD PTR SS:[EBP-3C],ECX
00BBF655 894D D0 MOV DWORD PTR SS:[EBP-30],ECX
00BBF658 8B0D FC00BD00 MOV ECX,DWORD PTR DS:[BD00FC] ; sol.01000000
00BBF65E 894D C0 MOV DWORD PTR SS:[EBP-40],ECX
00BBF661 8B70 6C MOV ESI,DWORD PTR DS:[EAX+6C]
00BBF664 3370 60 XOR ESI,DWORD PTR DS:[EAX+60]
00BBF667 3370 54 XOR ESI,DWORD PTR DS:[EAX+54]
00BBF66A 03F1 ADD ESI,ECX
00BBF66C 8975 D4 MOV DWORD PTR SS:[EBP-2C],ESI
00BBF66F 8B98 90000000 MOV EBX,DWORD PTR DS:[EAX+90]
00BBF675 3358 7C XOR EBX,DWORD PTR DS:[EAX+7C]
00BBF678 3358 44 XOR EBX,DWORD PTR DS:[EAX+44]
00BBF67B 895D A8 MOV DWORD PTR SS:[EBP-58],EBX
00BBF67E 8D4D D0 LEA ECX,DWORD PTR SS:[EBP-30]
00BBF681 E8 7A19FDFF CALL 00B91000
00BBF686 33D2 XOR EDX,EDX
00BBF688 F7F3 DIV EBX
00BBF68A 03D6 ADD EDX,ESI
00BBF68C 8955 CC MOV DWORD PTR SS:[EBP-34],EDX
00BBF68F 8B12 MOV EDX,DWORD PTR DS:[EDX]
00BBF691 8955 DC MOV DWORD PTR SS:[EBP-24],EDX
00BBF694 834D FC FF OR DWORD PTR SS:[EBP-4],FFFFFFFF
00BBF698 EB 11 JMP SHORT 00BBF6AB
00BBF69A 6A 01 PUSH 1
00BBF69C 58 POP EAX
00BBF69D C3 RETN
00BBF69E 8B65 E8 MOV ESP,DWORD PTR SS:[EBP-18]
00BBF6A1 834D FC FF OR DWORD PTR SS:[EBP-4],FFFFFFFF
00BBF6A5 8B7D 08 MOV EDI,DWORD PTR SS:[EBP+8]
00BBF6A8 8B55 DC MOV EDX,DWORD PTR SS:[EBP-24]
00BBF6AB A1 E400BD00 MOV EAX,DWORD PTR DS:[BD00E4]
00BBF6B0 3190 88000000 XOR DWORD PTR DS:[EAX+88],EDX
00BBF6B6 A1 E400BD00 MOV EAX,DWORD PTR DS:[BD00E4]
00BBF6BB 3190 88000000 XOR DWORD PTR DS:[EAX+88],EDX
00BBF6C1 A1 E400BD00 MOV EAX,DWORD PTR DS:[BD00E4]
00BBF6C6 8B88 90000000 MOV ECX,DWORD PTR DS:[EAX+90]
00BBF6CC 3348 2C XOR ECX,DWORD PTR DS:[EAX+2C]
00BBF6CF 3348 18 XOR ECX,DWORD PTR DS:[EAX+18]
00BBF6D2 030D FC00BD00 ADD ECX,DWORD PTR DS:[BD00FC] ; sol.01000000
00BBF6D8 8B17 MOV EDX,DWORD PTR DS:[EDI]
00BBF6DA 85D2 TEST EDX,EDX
00BBF6DC 75 1B JNZ SHORT 00BBF6F9
00BBF6DE FF77 18 PUSH DWORD PTR DS:[EDI+18]
00BBF6E1 FF77 14 PUSH DWORD PTR DS:[EDI+14]
00BBF6E4 FF77 10 PUSH DWORD PTR DS:[EDI+10]
00BBF6E7 8B90 90000000 MOV EDX,DWORD PTR DS:[EAX+90]
00BBF6ED 3350 40 XOR EDX,DWORD PTR DS:[EAX+40]
00BBF6F0 3350 04 XOR EDX,DWORD PTR DS:[EAX+4]
00BBF6F3 2BCA SUB ECX,EDX
00BBF6F5 FFD1 CALL ECX
00BBF6F7 /EB 20 JMP SHORT 00BBF719
00BBF6F9 |83FA 01 CMP EDX,1
00BBF6FC |75 1E JNZ SHORT 00BBF71C
00BBF6FE |FF77 04 PUSH DWORD PTR DS:[EDI+4]
00BBF701 |FF77 08 PUSH DWORD PTR DS:[EDI+8]
00BBF704 |6A 00 PUSH 0
00BBF706 |FF77 0C PUSH DWORD PTR DS:[EDI+C]
00BBF709 |8B90 90000000 MOV EDX,DWORD PTR DS:[EAX+90]
00BBF70F |3350 40 XOR EDX,DWORD PTR DS:[EAX+40]
00BBF712 |3350 04 XOR EDX,DWORD PTR DS:[EAX+4]
00BBF715 |2BCA SUB ECX,EDX
00BBF717 |FFD1 CALL ECX //从这里进去,再继续f8程序就运行了
00BBF719 \8945 E4 MOV DWORD PTR SS:[EBP-1C],EAX
00BBF71C 8B45 E4 MOV EAX,DWORD PTR SS:[EBP-1C]
00BBF71F 8B4D F0 MOV ECX,DWORD PTR SS:[EBP-10]
00BBF722 64:890D 0000000>MOV DWORD PTR FS:[0],ECX
00BBF729 5F POP EDI
00BBF72A 5E POP ESI
00BBF72B 5B POP EBX
00BBF72C C9 LEAVE
00BBF72D C3 RETN
01005F85 6A 70 PUSH 70
01005F87 68 F8120001 PUSH sol.010012F8 //这里就是oep了
01005F8C E8 DF010000 CALL sol.01006170
01005F91 33DB XOR EBX,EBX
01005F93 53 PUSH EBX
01005F94 8B3D 98100001 MOV EDI,DWORD PTR DS:[1001098] ; kernel32.GetModuleHandleA
01005F9A FFD7 CALL EDI
01005F9C 66:8138 4D5A CMP WORD PTR DS:[EAX],5A4D
01005FA1 75 1F JNZ SHORT sol.01005FC2
01005FA3 8B48 3C MOV ECX,DWORD PTR DS:[EAX+3C]
01005FA6 03C8 ADD ECX,EAX
01005FA8 8139 50450000 CMP DWORD PTR DS:[ECX],4550
01005FAE 75 12 JNZ SHORT sol.01005FC2
01005FB0 0FB741 18 MOVZX EAX,WORD PTR DS:[ECX+18]
01005FB4 3D 0B010000 CMP EAX,10B
总结一下:刚开始我已经过了这了,因为对照语言特征点看不出这是OEP而后面有个call edi。记得黑鹰高级班教程里的是call edi进的,所以
又走了进去,程序就运行了。结合之前f8 "00BBF717 |FFD1 CALL ECX"这一句后程序运行,然后再对照了xp系统中原始程序发现
原来这就是oep。从代码来看,它是压栈后调用程序而且在这之后程序运行说明原代码的入口就在这了,我理解的就是看到这样push然后下一句
再call的地方就要特别注意了,另外就是语言特征点。 |
|