目标软件:天然码输入法(对应小球兄昨天的帖子)
目标文件:trm32.ime;getdiskserial.exe
加壳方式:UPX 1.03
使用工具:trw2000
Procdump
peditor
Imprec 1.3
URL: http://www.chinatrm.com/download/file/suggest/setup.exe
本文作者:leo_cyl
加密特点:在比较注册码前,先产生另外的进程调用vxd绕过window api读指纹盘,如果没有指纹盘就不比较注册码。其实这个软件是明码比较不用脱壳的,但对dll脱壳是很多初学者还没掌握的基本技能,所以还是多此一举把trm32.ime的壳脱了。(trm32.ime说穿了就是一个dll)dll壳脱的难点在于dll是动态加载的(废话!),所以不能用loader。那么我们只好在dll的entry point加上int 3的指令了。
用peditor装入windowssystemrm32.ime,可看到entry point = 0003D210;Image Base = 10000000;用peditor的FLC计算entry point(1003d210)的偏移为:00013610。再用二进制编辑器在偏移为00013610处机器码为80H的内容改为CC(即 int 3的机器码)。
现在运行trw2k,下命令“I3HERE ON”,打开任务条的输入法管理器。选天然码,点“属性”将激活trw2k,停在dll的入口处:017F:1003D210 CC INT3017F:1003D211 7C24 JL 1003D237 (NO JUMP)017F:1003D213 0801 OR [ECX],AL017F:1003D215 0F8581010000 JNZ NEAR 1003D39C017F:1003D21B 60 PUSHA017F:1003D21C BE00A00210 MOV ESI,1002A000“r eip eip-1”,“d eip”,将017F:1003D210处改为80H:017F:1003D210 807C240801 CMP BYTE [ESP+08],01017F:1003D215 0F8581010000 JNZ NEAR 1003D39C017F:1003D21B 60 PUSHA017F:1003D21C BE00A00210 MOV ESI,1002A000017F:1003D221 8DBE0070FDFF LEA EDI,[ESI+FFFD7000]017F:1003D227 57 PUSH EDIf10跟踪,来到这里:017F:1003D344 95 XCHG EAX,EBP017F:1003D345 8A07 MOV AL,[EDI]017F:1003D347 47 INC EDI 《===EDI为引入的函数名017F:1003D348 08C0 OR AL,AL017F:1003D34A 74DC JZ 1003D328017F:1003D34C 89F9 MOV ECX,EDI017F:1003D34E 57 PUSH EDI017F:1003D34F 48 DEC EAX017F:1003D350 F2AE REPNE SCASB017F:1003D352 55 PUSH EBP017F:1003D353 FF9634DA0300 CALL NEAR [ESI+0003DA34] 〈==getprocessaddress017F:1003D359 09C0 OR EAX,EAX017F:1003D35B 7407 JZ 1003D364017F:1003D35D 8903 MOV [EBX],EAX017F:1003D35F 83C304 ADD EBX,BYTE +04017F:1003D362 EBE1 JMP SHORT 1003D345以上代码为恢复引入表。继续f10跟踪,来到这里:017F:1003D38C EBE2 JMP SHORT 1003D370017F:1003D38E 240F AND AL,0F017F:1003D390 C1E010 SHL EAX,10017F:1003D393 668B07 MOV AX,[EDI]017F:1003D396 83C702 ADD EDI,BYTE +02017F:1003D399 EBE2 JMP SHORT 1003D37D017F:1003D39B 61 POPA 〈====很眼熟吧!017F:1003D39C E906BBFCFF JMP 10008EA7〈====OEP
所以OEP在10008EA7处。在10008EA7处DUMP出文件。先看一下trm32.ime的IMTE。“MOD32 TRM32.IME”可看到IMTE 为:xxxxxxxx;“PEDUMP C:TRM32.DLL xxxxxxxx”。并挂起进程“SUSPEND”。
回到window运行Imprec 1.3。在任务列表选rundll32.exe 点“pick dll”找到trm32.ime。输入OEP(8EA7)“get Imports”可修复IAT。再“fix dump”。将产生TRM32_.DLL,把它改名为trm32.ime 即可。到此脱壳完成。