能力值:
( LV4,RANK:55 )
|
-
-
26 楼
LoadMethod 可以直接使用结构体
// http://aospxref.com/android-11.0.0_r21/xref/art/libdexfile/dex/dex_file.h#814
class DexFile {
public:
void* virutal_table_;
uint8_t* begin_;
size_t size_;
uint8_t* data_begin_;
size_t data_size_;
std::string location_;
uint32_t location_checksum_;
};
// http://aospxref.com/android-11.0.0_r21/xref/art/libdexfile/dex/class_accessor.h#39
class ClassAccessor {
public:
class BaseItem {
public:
const DexFile* dex_file_;
const uint8_t *ptr_pos_ = nullptr;
const uint8_t *hiddenapi_ptr_pos_ = nullptr;
uint32_t index_ = 0u;
uint32_t access_flags_ = 0u;
uint32_t hiddenapi_flags_ = 0u;
};
class Method : public BaseItem {
public:
bool is_static_or_direct_ = true;
uint32_t code_off_ = 0u;
};
}; 使用 // http://aospxref.com/android-11.0.0_r21/xref/art/runtime/class_linker.cc?r=&mo=170403&fi=3879#3879
void LoadMethod_R(void* thiz, const DexFile* dex_file, ClassAccessor::Method& method, const void* klass, void* dest)
{
DLOGD("enter LoadMethod_R hook1");
g_originLoadMethod_R(thiz, dex_file, method, klass, dest);
std::string location = dex_file->location_;
int idx = dexNumber(&location);
uint8_t* begin = dex_file->begin_;
if (location.find("base.apk") == std::string::npos)
return;
if (method.code_off_ == 0) {
return;
}
uint8_t* codeAddr = dex_file->begin_ + method.code_off_ + 16;
uint16_t firstDvmCode = *((uint16_t*)(codeAddr));
if (firstDvmCode != 0x0012 && firstDvmCode != 0x0016 && firstDvmCode != 0x000e)
{
return;
}
// 改写保护
if (!MultiDexCode::getInstance()->hasProtect(idx))
{
changeDexProtect(begin, location.c_str(), dex_file->data_size_, idx);
}
std::string sCode;
uint32_t offsetOfDex = 0;
DLOGD("dexIdx: %d", idx-1);
if (!MultiDexCode::getInstance()->getCode(idx-1, method.index_, sCode, offsetOfDex))
{
return;
}
if (method.code_off_ != (offsetOfDex - 16)) {
return;
}
DLOGD("method_index: %d, code_off: %d, myCode_off: %d", method.index_, method.code_off_, offsetOfDex);
memcpy(codeAddr, sCode.c_str(), sCode.size());
}
|
能力值:
( LV9,RANK:140 )
|
-
-
27 楼
evilbeast
我看楼主加了android 11中 hook MapFileAtAddress的代码,我测试没有成功的原因 代码中的的符号少写个E , 地址dpt-shell/dp ...
这个符号确实写错了,后来也发现了,不过改正后也没能正常hook,所以没有推上去。至于dobby 框架的bug,能力有限,没能修复。或许可以根据你提供的最大参数为8个来进行修改。
|
能力值:
( LV9,RANK:140 )
|
-
-
28 楼
evilbeast
LoadMethod 可以直接使用结构体// http://aospxref.com/android-11.0.0_r21/xref/art/libdexfile/ ...
可以的,使用结构体会方便许多
|
能力值:
( LV3,RANK:24 )
|
-
-
29 楼
大佬,inline hook不稳定,可否考虑使用got hook的框架呢?
|
能力值:
( LV9,RANK:140 )
|
-
-
30 楼
WeiFire
大佬,inline hook不稳定,可否考虑使用got hook的框架呢?
got hook没法hook到
|
能力值:
( LV2,RANK:10 )
|
-
-
31 楼
大佬niu~~~~
|
能力值:
( LV5,RANK:60 )
|
-
-
32 楼
其实这个是一个假的抽取壳,虽然函数抽取壳确实是将dex文件中的函数代码给nop,然后在运行时再把字节码给填回,但是不会填回内存中原dex位置,是填回内存中的一个解析后的结构体,比如梆梆加固,普通的工具是dump不到dex的。 这个解析后的结构体,有人知道是什么吗
|
能力值:
( LV1,RANK:0 )
|
-
-
33 楼
请问可以放一些测试成功的样例出来吗
|
能力值:
( LV1,RANK:0 )
|
-
-
34 楼
真的强
|
能力值:
( LV1,RANK:0 )
|
-
-
35 楼
请教下壳可以动态混淆吗
最后于 2023-8-16 17:36
被HugoHu编辑
,原因:
|
能力值:
( LV2,RANK:10 )
|
-
-
36 楼
mark一下 说不定以后产品用得上。
|
能力值:
( LV1,RANK:0 )
|
-
-
37 楼
感谢分享
|
能力值:
( LV2,RANK:10 )
|
-
-
38 楼
好东西
|
能力值:
( LV9,RANK:140 )
|
-
-
39 楼
|
能力值:
( LV1,RANK:0 )
|
-
-
40 楼
厉害
|
|
|