能力值:
( LV4,RANK:55 )
|
-
-
26 楼
LoadMethod 可以直接使用结构体
// 267K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3q4G2M7%4m8^5M7X3g2X3i4K6u0W2j5$3!0E0i4K6u0r3j5h3&6V1M7X3!0A6k6q4)9J5k6o6p5I4i4K6u0W2x3q4)9J5k6e0m8Q4y4h3k6J5x3U0q4Q4x3V1k6^5M7X3g2X3i4K6u0r3j5i4u0@1i4K6u0r3L8r3W2T1k6r3g2^5k6X3W2D9k6g2)9J5c8X3c8W2P5q4)9J5c8X3c8W2P5q4)9#2k6X3k6A6L8r3g2Q4x3X3g2Z5i4K6t1K6z5o6p5@1
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_;
};
// 29eK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3q4G2M7%4m8^5M7X3g2X3i4K6u0W2j5$3!0E0i4K6u0r3j5h3&6V1M7X3!0A6k6q4)9J5k6o6p5I4i4K6u0W2x3q4)9J5k6e0m8Q4y4h3k6J5x3U0q4Q4x3V1k6^5M7X3g2X3i4K6u0r3j5i4u0@1i4K6u0r3L8r3W2T1k6r3g2^5k6X3W2D9k6g2)9J5c8X3c8W2P5q4)9J5c8X3y4D9j5i4y4K6i4K6g2X3j5h3y4U0k6i4y4K6L8%4u0Q4x3X3g2Z5i4K6t1K6x3K6V1`.
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;
};
}; 使用 // 122K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3q4G2M7%4m8^5M7X3g2X3i4K6u0W2j5$3!0E0i4K6u0r3j5h3&6V1M7X3!0A6k6q4)9J5k6o6p5I4i4K6u0W2x3q4)9J5k6e0m8Q4y4h3k6J5x3U0q4Q4x3V1k6^5M7X3g2X3i4K6u0r3j5i4u0@1i4K6u0r3M7Y4g2F1N6r3W2E0k6g2)9J5c8X3y4D9j5i4y4K6i4K6g2X3L8r3W2F1K9$3g2J5i4K6u0W2j5$3y4Q4x3@1k6J5i4K6y4p5i4K6t1$3j5h3#2H3i4K6y4n7L8h3!0Q4x3@1b7I4y4K6l9@1x3o6y4Q4x3U0k6S2L8i4m8Q4x3@1u0X3K9g2)9K6c8o6x3^5y4K6W2Q4x3U0x3K6z5o6M7&6
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 可以直接使用结构体// 8cdK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3q4G2M7%4m8^5M7X3g2X3i4K6u0W2j5$3!0E0i4K6u0r3j5h3&6V1M7X3!0A6k6q4)9J5k6o6p5I4i4K6u0W2x3q4)9J5k6e0m8Q4y4h3k6J5x3U0q4Q4x3V1k6^5M7X3g2X3i4K6u0r3j5i4u0@1i4K6u0r3L8r3W2T1k6r3g2^5k6X3W2D9k6g2)9J5c8R3`.`. ...
可以的,使用结构体会方便许多
|
能力值:
( 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 楼
厉害
|
|
|