整了快一星期,不得要领

,望各位大牛指点一下

。
A.exe
|_B.dll
|_C.dll
1.B.dll 和C.dll都被加TMD的1.9.1.0壳
2.先脱C.dll壳,用带壳的B.dll,运行A.exe时出现TMD的信息:cannot find C.dll.plz re-install.
3.用OD载入B.dll时总失败,此时用的是脱壳后的C.dll。
4.只好用带壳C.dll,脱掉B.dll的壳。
5.用OD载入脱壳后的B.dll失败,此时用的是脱壳后的C.dll。
6.看了一下B.dll的OEP,发现有两处有问题。
100EAE86 /$ 55 PUSH EBP
100EAE87 |. 8BEC MOV EBP,ESP
100EAE89 |. 83EC 10 SUB ESP,10
100EAE8C |. A1 882C1410 MOV EAX,DWORD PTR DS:[10142C88]
100EAE91 |. 8365 F8 00 AND DWORD PTR SS:[EBP-8],0
100EAE95 |. 8365 FC 00 AND DWORD PTR SS:[EBP-4],0
100EAE99 |. 53 PUSH EBX
100EAE9A |. 57 PUSH EDI
100EAE9B |. BF 4EE640BB MOV EDI,BB40E64E
100EAEA0 |. 3BC7 CMP EAX,EDI
100EAEA2 |. BB 0000FFFF MOV EBX,FFFF0000
100EAEA7 |. 74 0D JE SHORT 3GPIProx.100EAEB6
100EAEA9 |. 85C3 TEST EBX,EAX
100EAEAB |. 74 09 JE SHORT 3GPIProx.100EAEB6
100EAEAD |. F7D0 NOT EAX
100EAEAF |. A3 8C2C1410 MOV DWORD PTR DS:[10142C8C],EAX
100EAEB4 |. EB 60 JMP SHORT 3GPIProx.100EAF16
100EAEB6 |> 56 PUSH ESI
100EAEB7 |. 8D45 F8 LEA EAX,DWORD PTR SS:[EBP-8]
100EAEBA |. 50 PUSH EAX ; /pFileTime
100EAEBB |. FF15 B8F15510 CALL DWORD PTR DS:[<&kernel32.GetSystemT>; \GetSystemTimeAsFileTime
100EAEC1 |. 8B75 FC MOV ESI,DWORD PTR SS:[EBP-4]
100EAEC4 |. 3375 F8 XOR ESI,DWORD PTR SS:[EBP-8]
100EAEC7 |. FF15 24F15510 CALL DWORD PTR DS:[<&kernel32.GetCurrent>; [GetCurrentProcessId
100EAECD |. 33F0 XOR ESI,EAX
100EAECF |. FF15 80F65510 CALL DWORD PTR DS:[<&C.#214>] ; C.#214
100EAED5 |. 33F0 XOR ESI,EAX
100EAED7 |. FF15 E8F55510 CALL DWORD PTR DS:[<&C.#64>] ; C.#64
省略
对比正常的VC8的OEP,上面的100EAECF 和100EAED7处应该调用下面2个
KERNEL32.GetCurrentThreadId
KERNEL32.GetTickCount
用OD跟了一下C.dll的#64
10006097 55 PUSH EBP
10006098 8BEC MOV EBP,ESP
10006060 60 PUSHAD
10006061 9C PUSHFD
10006078 A1 B8D70110 MOV EAX,DWORD PTR DS:[1001D7B8]
1000607D A3 50EF0110 MOV DWORD PTR DS:[1001EF50],EAX
100060D6 9D POPFD
100060D7 61 POPAD
100060D8 5D POP EBP
100060D9 FF35 50EF0110 PUSH DWORD PTR DS:[1001EF50]
100060DF 51 PUSH ECX
100060E0 50 PUSH EAX
100060E1 53 PUSH EBX
100060E2 8B1D BCA20110 MOV EBX,DWORD PTR DS:[1001A2BC]
100060E8 8B8B D8D10110 MOV ECX,DWORD PTR DS:[EBX+1001D1D8]
100060EE 5B POP EBX
100060EF 8B048D B0E70110 MOV EAX,DWORD PTR DS:[ECX*4+1001E7B0]
100060F6 8BC8 MOV ECX,EAX
100060F8 58 POP EAX
100060F9 314C24 04 XOR DWORD PTR SS:[ESP+4],ECX
100060FD 59 POP ECX
100060FE 50 PUSH EAX
100060FF 51 PUSH ECX
10006100 8B0D BCA20110 MOV ECX,DWORD PTR DS:[1001A2BC]
10006106 83C1 04 ADD ECX,4
10006109 8B81 D8D10110 MOV EAX,DWORD PTR DS:[ECX+1001D1D8]
1000610F 59 POP ECX
10006110 314424 04 XOR DWORD PTR SS:[ESP+4],EAX
10006114 58 POP EAX
10006115 C3 RETN
在上面的RETN处出现的是KERNEL32.GetTickCount
不考虑壳的种类,各位见过这种父子DLL加壳方法吗?有没有好的脱壳思路。
我的思路:
1.把B.dll的OEP处的2个C.dll的API调用强改成KERNEL32的API调用。
可是B.dll的庞大IAT里没有上述KERNEL32的两个API,手工追加很容易破坏原有IAT

。
2.发现B.dll的TMD处理API时,最先处理C.dll的API,其次是KERNEL32的API。脱壳后的
B.dll并不先装载C.dll,这可能是出错的原因?如何让C.dll最先装载,这样的话B.dll的OEP
能执行。
---------------------
望大牛指导!!!!!
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课