软件地址: http://goldsun.ys168.com 对外公布\mjcs_ori_unpack.zip 1.5MB
文章出自:PeaceClub
工具: Ollydbg,kerberos API spy,Imprec,HideOD
情况说明:一个朋友让我检查一下此软件是否有后门,所以就拿来研究了一下.
分析:Peid一看是未知壳,而且是自创进程型的.用ollydbg载入,发现有anti,所以用了看雪的HideOD插件,运行
后主进程ExitProcess退出,CreateProcessA创建的子进程运行中.
POEP:
不知道什么壳,花指令多。
第一步:通过偷窥设法转单进程
想看看此软件到底通过什么标志来进行进程转换.所以偶用
kerberos API spy调入程序,运行后得到log:
C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\~temp0
哦,原来通过临时文件来做Flag.
我们在CreateProcessA往上看,找标志,强行转单进程
ollydbg载入,he 575d53 (GetCommandLineA后,要用硬件断点,壳本身检测5个长度的cc)
中断后向上观察:
HOHO,575d37这里就是Magic Jump,重来强行跳即可转为运行解码进程.
第二步: OEP :
通过观察代码确定是Delphi的程序,寻找OEP,我们he GetModuleHandleA
看堆栈esp处,当发现:
是从4066d9调用的时候,我们知道oep已经过了。
逐步返回
往上看,看到了add esp,-10,HOHO,可以确定4c80e0就是OEP了
Dump吧!
第三步: IAT处理
ollydbg重新载入,转成本进程运行,he 4c80e0 到了oep后,Imprec上场。
IAT检测范围为: RVA e218c Size 7B8
载入一看基本都识别不了,看来IAT做了处理。
到4e218c看看去!
通过观察,基本被指向了动态申请的内存区域 14xxxx
例如,结构如下:
00406604 -FF25 84224E00 JMP DWORD PTR DS:[4E2284]
=> 4e2284里的值为 145400
145400处代码为:
00145400 74 0E JE SHORT 00145410 ; JMP to kernel32.GetModuleHandleA
00145402 75 0C JNZ SHORT 00145410 ; JMP to kernel32.GetModuleHandleA
00145404 E8 1A32534E CALL 4E678623
00145409 A6 CMPS BYTE PTR DS:[ESI],BYTE PTR ES:[EDI]
0014540A 40 INC EAX
0014540B 009A A54000FF ADD BYTE PTR DS:[EDX+FF0040A5],BL
00145411 25 16541400 AND EAX,145416
00145416 29B5 807C0000 SUB DWORD PTR SS:[EBP+7C80],ESI
0014541C 0000 ADD BYTE PTR DS:[EAX],AL
0014541E 0000 ADD BYTE PTR DS:[EAX],AL
做了变形,所以得写代码修复。
找个区域写代码,我到140000处:
140000处新建EIP,在 14003e popad处设断点运行。
运行后,用imprec载入IAT,发现还有8个是坏的。
这8个壳做了特殊处理,因此我也来特殊处理 :)
找个delphi的程序把iat表保存下来和它对照一下,正确纠正这8个:
e21b0 57b942 GetTickCount
e21dc 57ba3a GetStartupInfoA
e21f4 57ba29 GetCommandLineA
e22dc 57bca8 SearchPathA
e2328 57b9ec GetVersionExA
e232c 57b942 GetVersion
e237c 57ba5a GetCurrentProcessId
e2380 57bba0 GetCurrentDirectoryA
第四步: 完工,优化:
这里可以手工把dump.exe文件里的壳section代码给去掉,然后根据offset删除垃圾代码,修理好以后就可以Imprec Fix IAT了.
好了,测试运行正常.
我写文章目的,是让大家一起探讨解壳思路,还请各路大侠指教几番.
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)