首页
论坛
课程
招聘
脱pebundle时遇到的一个怪问题的简单解决
2005-9-28 16:33 5256

脱pebundle时遇到的一个怪问题的简单解决

2005-9-28 16:33
5256
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
    保存修改,程序运行正常。供遇到类似问题的朋友参考。

[2022冬季班]《安卓高级研修班(网课)》月薪两万班招生中~

收藏
点赞0
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回