|
发表于 2008-10-30 18:56:51
|
显示全部楼层
天无意中发现了这个东东,试了一下很简单的,适合我等新手练习练习。
点击浏览该文件
第一步:寻找OEP
用IsDebug 1.4插件去掉Ollydbg的调试器标志,设置Ollydbg忽略除了“内存访问异常”之外的所有异常选项。
F9运行,程序中断在异常处,然后按4次Shift+F9跳过异常
003C27278B00MOV EAX,DWORD PTR DS:[EAX]//第一次异常
003C14BC /7C 03 JL SHORT 003C14C1 //第二次异常
003C2AF36285 F4290000 BOUND EAX,QWORD PTR SS:[EBP+29F4] //第三次异常
0040D46F8700XCHG DWORD PTR DS:[EAX],EAX //第四次异常,够了,再按一次程序就运行了!
这是看看堆栈的内容
0012FF94 00000206指针到下一个 SEH 记录
0012FF98 0040D06ESE 句柄 //不用说了吧,就去这里下断吧。
0012FF9C 0040F41CUnpackMe.0040F41C
在0040D06E处下断,Shift+F9来到此处
0040D06E8B5C24 0C MOV EBX,DWORD PTR SS:[ESP+C]
0040D07281AB B8000000 2>SUB DWORD PTR DS:[EBX+B8],24//Context.eip-24,此时堆栈值0040D46F-24=0040D44B
0040D07C33C0XOR EAX,EAX //表示已修复,可以从异常处继续执行
0040D07EC3RETN //系统取Context内容,下一步将从Context.eip处执行。
0040D07281AB B8000000 2>SUB DWORD PTR DS:[EBX+B8],24//减法指令
运行到这一行,你就可以看到DS:[EBX+B8]的值为0040D46F,执行这条指令后,不就是0040D46F-24=0040D44B
注意这里千万不能返回,因为这个RET并非是一个CALL的结束,它的作用是返回系统异常执行处理程序里,系统取堆栈里的
Context环境结构内容,使线程继续执行。
好了,剩下的内容大家都知道怎么做了吧。
去往0040D44B处断,F9运行
不用慢慢手动步过,命令行下命令
Tc eip<40D000
呵,停在Oep处。
0040D44BB8 55010000 MOV EAX,155
0040D45056PUSH ESI
0040D4518DB5 80000000 LEA ESI,DWORD PTR SS:[EBP+80]
0040D457B9 CB030000 MOV ECX,3CB
0040D45C3006XOR BYTE PTR DS:[ESI],AL
0040D45E46INC ESI
0040D45F^ E2 FB LOOPD SHORT UnpackMe.0040D45C
0040D4615EPOP ESI
0040D462^ E9 19FCFFFF JMP UnpackMe.0040D080//往上跳
0040D08064:8F05 0000000>POP DWORD PTR FS:[0] //条到这里,以下全用F8带过
0040D08783C4 04 ADD ESP,4
0040D08A8DB5 50060000 LEA ESI,DWORD PTR SS:[EBP+650]
0040D09056PUSH ESI
0040D091FF95 38060000 CALL DWORD PTR SS:[EBP+638]
0040D0970BC0OR EAX,EAX
0040D09975 07 JNZ SHORT UnpackMe.0040D0A2
0040D09B56PUSH ESI
0040D09CFF95 3C060000 CALL DWORD PTR SS:[EBP+63C]
0040D0A250PUSH EAX
0040D0A38D9D B8040000 LEA EBX,DWORD PTR SS:[EBP+4B8]
0040D0A953PUSH EBX
0040D0AA50PUSH EAX
0040D0ABFF95 34060000 CALL DWORD PTR SS:[EBP+634]
0040D0B18985 C6040000 MOV DWORD PTR SS:[EBP+4C6],EAX
0040D0B758POP EAX
0040D0B850PUSH EAX
0040D0B98D9D CA040000 LEA EBX,DWORD PTR SS:[EBP+4CA]
0040D0BF53PUSH EBX
0040D0C050PUSH EAX
0040D0C1FF95 34060000 CALL DWORD PTR SS:[EBP+634]
0040D0C78985 E0040000 MOV DWORD PTR SS:[EBP+4E0],EAX
0040D0CD58POP EAX
0040D0CE50PUSH EAX
0040D0CF8D9D E4040000 LEA EBX,DWORD PTR SS:[EBP+4E4]
0040D0D553PUSH EBX
0040D0D650PUSH EAX
0040D0D7FF95 34060000 CALL DWORD PTR SS:[EBP+634]
0040D0DD8985 F0040000 MOV DWORD PTR SS:[EBP+4F0],EAX
0040D0E358POP EAX
0040D0E450PUSH EAX
0040D0E58D9D F4040000 LEA EBX,DWORD PTR SS:[EBP+4F4]
0040D0EB53PUSH EBX
0040D0EC50PUSH EAX
0040D0EDFF95 34060000 CALL DWORD PTR SS:[EBP+634]
0040D0F38985 FD040000 MOV DWORD PTR SS:[EBP+4FD],EAX
0040D0F958POP EAX
0040D0FA8D9D 11050000 LEA EBX,DWORD PTR SS:[EBP+511]
0040D10053PUSH EBX
0040D10150PUSH EAX
0040D102FF95 34060000 CALL DWORD PTR SS:[EBP+634]
0040D1088985 20050000 MOV DWORD PTR SS:[EBP+520],EAX
0040D10E8DB5 AD040000 LEA ESI,DWORD PTR SS:[EBP+4AD]
0040D11456PUSH ESI
0040D115FF95 38060000 CALL DWORD PTR SS:[EBP+638]
0040D11B0BC0OR EAX,EAX
0040D11D75 07 JNZ SHORT UnpackMe.0040D126
0040D11F56PUSH ESI
0040D120FF95 3C060000 CALL DWORD PTR SS:[EBP+63C]
0040D1268D9D 01050000 LEA EBX,DWORD PTR SS:[EBP+501]
0040D12C53PUSH EBX
0040D12D50PUSH EAX
0040D12EFF95 34060000 CALL DWORD PTR SS:[EBP+634]
0040D1348985 0D050000 MOV DWORD PTR SS:[EBP+50D],EAX
0040D13A8D9D 4C050000 LEA EBX,DWORD PTR SS:[EBP+54C]
0040D14053PUSH EBX
0040D141FF95 C6040000 CALL DWORD PTR SS:[EBP+4C6]
0040D1478B85 91040000 MOV EAX,DWORD PTR SS:[EBP+491]
0040D14D83F8 01 CMP EAX,1
0040D1500F85 D7000000 JNZ UnpackMe.0040D22D//跳了
0040D22D33C0XOR EAX,EAX//跳到这里,继续按F8带过
0040D22F8B8D 74050000 MOV ECX,DWORD PTR SS:[EBP+574]
0040D2358BB5 70050000 MOV ESI,DWORD PTR SS:[EBP+570]
0040D23B03B5 71040000 ADD ESI,DWORD PTR SS:[EBP+471]
0040D2418D4481 43 LEA EAX,DWORD PTR DS:[ECX+EAX*4+43]
0040D2453006XOR BYTE PTR DS:[ESI],AL
0040D247D40AAAM
0040D24946INC ESI
0040D24A^ E2 F5 LOOPD SHORT UnpackMe.0040D241 //循环
0040D24CE8 F9000000 CALL UnpackMe.0040D34A //按F4来到这里
0040D2516A 04 PUSH 4
0040D25368 00100000 PUSH 1000
0040D25868 00100000 PUSH 1000
0040D25D6A 00 PUSH 0
0040D25FFF95 44060000 CALL DWORD PTR SS:[EBP+644]
0040D2658985 89040000 MOV DWORD PTR SS:[EBP+489],EAX
0040D26B8BB5 79040000 MOV ESI,DWORD PTR SS:[EBP+479]
0040D27103B5 71040000 ADD ESI,DWORD PTR SS:[EBP+471]
0040D2778B3EMOV EDI,DWORD PTR DS:[ESI]
0040D27985FFTEST EDI,EDI
0040D27B0F84 8B000000 JE UnpackMe.0040D30C
0040D28103BD 71040000 ADD EDI,DWORD PTR SS:[EBP+471]
0040D28783C6 05 ADD ESI,5
0040D28A56PUSH ESI
0040D28BFF95 38060000 CALL DWORD PTR SS:[EBP+638]
0040D29185C0TEST EAX,EAX
0040D29375 07 JNZ SHORT UnpackMe.0040D29C
0040D29556PUSH ESI
0040D296FF95 3C060000 CALL DWORD PTR SS:[EBP+63C]
0040D29C8985 85040000 MOV DWORD PTR SS:[EBP+485],EAX
0040D2A246INC ESI
0040D2A38A0EMOV CL,BYTE PTR DS:[ESI]
0040D2A584C9TEST CL,CL
0040D2A7^ 75 F9 JNZ SHORT UnpackMe.0040D2A2//循环
0040D2A946INC ESI//按F4下来
0040D2AA8A0EMOV CL,BYTE PTR DS:[ESI]
0040D2AC0AC9OR CL,CL
0040D2AE75 0A JNZ SHORT UnpackMe.0040D2BA
0040D2B08A4E 03 MOV CL,BYTE PTR DS:[ESI+3]
0040D2B380F9 80 CMP CL,80
0040D2B674 02 JE SHORT UnpackMe.0040D2BA
0040D2B8EB 4C JMP SHORT UnpackMe.0040D306
0040D2BA8B06MOV EAX,DWORD PTR DS:[ESI]
0040D2BC3D 00000080 CMP EAX,80000000
0040D2C176 0B JBE SHORT UnpackMe.0040D2CE
0040D2C325 FFFFFF0F AND EAX,0FFFFFFF
0040D2C850PUSH EAX
0040D2C983C6 04 ADD ESI,4
0040D2CCEB 08 JMP SHORT UnpackMe.0040D2D6
0040D2CE56PUSH ESI
0040D2CF46INC ESI
0040D2D08A0EMOV CL,BYTE PTR DS:[ESI]
0040D2D284C9TEST CL,CL
0040D2D4^ 75 F9 JNZ SHORT UnpackMe.0040D2CF//循环
0040D2D6FFB5 85040000 PUSH DWORD PTR SS:[EBP+485] //按F4下来
0040D2DCFF95 34060000 CALL DWORD PTR SS:[EBP+634]
0040D2E28B8D 89040000 MOV ECX,DWORD PTR SS:[EBP+489]
0040D2E8890FMOV DWORD PTR DS:[EDI],ECX
0040D2EAC601 B8 MOV BYTE PTR DS:[ECX],0B8
0040D2ED41INC ECX
0040D2EE8901MOV DWORD PTR DS:[ECX],EAX
0040D2F083C1 04 ADD ECX,4
0040D2F366:C701 FFE0MOV WORD PTR DS:[ECX],0E0FF
0040D2F883C1 02 ADD ECX,2
0040D2FB898D 89040000 MOV DWORD PTR SS:[EBP+489],ECX
0040D30183C7 04 ADD EDI,4
0040D304^ EB A3 JMP SHORT UnpackMe.0040D2A9 //向上跳,又是一个大循环,仔细观察发现0040D2B8处可
跳出这个循环
0040D30646INC ESI //按F4下来
0040D307^ E9 6BFFFFFF JMP UnpackMe.0040D277//继续循环,发现0040D27B处可跳出此循环
0040D30C6A 00 PUSH 0 //按F4下来
0040D30E54PUSH ESP
0040D30F6A 04 PUSH 4
0040D31168 00100000 PUSH 1000
0040D316FFB5 71040000 PUSH DWORD PTR SS:[EBP+471]
0040D31CFF95 20050000 CALL DWORD PTR SS:[EBP+520]
0040D32283C4 04 ADD ESP,4
0040D3258B85 71040000 MOV EAX,DWORD PTR SS:[EBP+471]
0040D32B8B58 3C MOV EBX,DWORD PTR DS:[EAX+3C]
0040D32E03D8ADD EBX,EAX
0040D33083C3 16 ADD EBX,16
0040D33366:810B 0020OR WORD PTR DS:[EBX],2000
0040D33861POPAD //哈哈,见到阳光了
0040D3398B85 75040000 MOV EAX,DWORD PTR SS:[EBP+475]
0040D33F5DPOP EBP
0040D34050PUSH EAX
0040D341C3RETN//返回004010CC
004010CC55PUSH EBP//这里就是OEP了。因为这个壳会修改PE头,只好用LordPE DUMP了
004010CD8BECMOV EBP,ESP
004010CF83EC 44 SUB ESP,44
004010D256PUSH ESI
004010D3FF15 E4634000 CALL DWORD PTR DS:[4063E4]
004010D98BF0MOV ESI,EAX
004010DB8A00MOV AL,BYTE PTR DS:[EAX]
004010DD3C 22 CMP AL,22
004010DF75 1B JNZ SHORT UnpackMe.004010FC
004010E156PUSH ESI
004010E2FF15 F4644000 CALL DWORD PTR DS:[4064F4]
004010E88BF0MOV ESI,EAX
第二步:修复
至于修复最简单的就是用ImporREC了,用追踪层次3可以全部修复指针。
当然也可以手动修复,下断
bp GetProcAddress
慢慢往下跟就会发现MOV [EDI],ECX等这几行代码,此时EAX中是GetProcAddress返回地址,EDI是指向IAT,将其改为MOV
[EDI],EAX,这样外壳就会将正确的地址填充到IAT结构中。
脱壳后的程序过大,用FileScan优化一下就行了。 |
|