-
-
脱pebundle时遇到的一个怪问题的简单解决
-
发表于: 2005-9-28 16:33 6411
-
pebundle的壳比较好脱,用大牛们都说了无数遍的EFP定律可直接搞定。停在host入口处时,用RecImport修复引入表,这时遇到如下情况:程序引用了advapi32.dll和kernel32.dll的一些API,前者的函数地址可全部获得,后者出现了间断。在RecImport中将这些间断的数据剪切掉,再修复原文件,结果无法运行。
用UltraEdit打开修复后的文件,来到FirstThunk(6000)处,是如下数据:
00006000h: 49 10 02 00 5C 10 02 00 6A 10 02 00 7B 10 02 00 ; I...\...j...{...
00006010h: 00 00 00 00 98 10 02 00 AD 10 02 00 B9 10 02 00 ; ....?..?..?..
00006020h: C7 10 02 00 DE 10 02 00 E6 10 02 00 F7 10 02 00 ; ?..?..?..?..
00006030h: 0D 11 02 00 22 11 02 00 30 11 02 00 3A 11 02 00 ; ...."...0...:...
00006040h: 53 11 02 00 63 11 02 00 72 11 02 00 85 11 02 00 ; S...c...r...?..
00006050h: 00 00 00 00 97 11 02 00 00 00 00 00 A4 11 02 00 ; S...?..r...?..
00006060h: AF 11 02 00 C5 11 02 00 D1 11 02 00 E4 11 02 00 ; ?..?..?..?..
00006070h: F8 11 02 00 13 12 02 00 2D 12 02 00 47 12 02 00 ; ?......-...G...
00006080h: 5F 12 02 00 78 12 02 00 87 12 02 00 96 12 02 00 ; _...x...?..?..
00006090h: A4 12 02 00 B2 12 02 00 BF 12 02 00 CD 12 02 00 ; ?..?..?..?..
000060a0h: D9 12 02 00 E8 12 02 00 F6 12 02 00 02 13 02 00 ; ?..?..?......
000060b0h: 0B 13 02 00 00 00 00 00 00 00 00 00 16 13 02 00 ; ....?..?......
000060c0h: 2C 13 02 00 3B 13 02 00 4A 13 02 00 5B 13 02 00 ; ,...;...J...[...
000060d0h: 6C 13 02 00 7D 13 02 00 8E 13 02 00 00 00 00 00 ; l...}...?......
注意看,在偏移6050,6058,60b4和60b8处的数据为0,造成程序加载时只有6050前的API地址正确导入,之后的被截断了。那这四个地方(也就是用RecImport修复时显示的可疑函数处)是什么呢?用OD加载未脱壳的文件,停在host入口处时,显示该处数据如下:
6050 0041505a
6058 004146d6
60b4 00414743
60b8 0041463e
是四个程序内部call的地址。按上述方法修改原文件,不但API获取不全,而且这四个地址也被清0,程序自然无法运行。
解决方法想到了几种,一是将RecImport修复后的文件该四处的00全部写为指向一个任意有效的API函数名的地址,让整个kernel32的引入表连续起来,再找出程序中所有调用这四处的代码,将CALL DWORD PTR[00406050]替换为CALL 0041505a;第二种方法,手工重建一个引入表。
后来想想,OD还开着呢,直接改吧(懒)。先在UE中将该四处的00全部写为指向一个任意有效的API函数名的地址,再在程序开始执行时添加代码将四处的值还原就OK了。
于是,修改程序入口为jmp 00405432,而空白处00405432处添中代码如下:
00405432 68 5A504100 push no3.0041505A ;加上push/pop将数值修正
00405437 8F05 50604000 pop dword ptr ds:[406050]
0040543D 68 D6464100 push no3.004146D6
00405442 8F05 58604000 pop dword ptr ds:[406058]
00405448 68 43474100 push no3.00414743
0040544D 8F05 B4604000 pop dword ptr ds:[4060B4]
00405453 68 3E464100 push no3.0041463E
00405458 8F05 B8604000 pop dword ptr ds:[4060B8]
0040545E 55 push ebp ;这三行是原程序入口处的代码
0040545F 8BEC mov ebp,esp
00405461 6A FF push -1
00405463 ^\E9 22C3FFFF jmp no3.0040178A
保存修改,程序运行正常。供遇到类似问题的朋友参考。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!