void LoadMethod(void
*
thiz, void
*
self
, const void
*
dex_file, const void
*
it, const void
*
method,
void
*
klass, void
*
dst) {
if
(g_originLoadMethod25 !
=
nullptr
|| g_originLoadMethod28 !
=
nullptr
|| g_originLoadMethod29 !
=
nullptr) {
uint32_t location_offset
=
getDexFileLocationOffset();
uint32_t begin_offset
=
getDataItemCodeItemOffset();
callOriginLoadMethod(thiz,
self
, dex_file, it, method, klass, dst);
ClassDataItemReader
*
classDataItemReader
=
getClassDataItemReader(it,method);
uint8_t
*
*
begin_ptr
=
(uint8_t
*
*
) ((uint8_t
*
) dex_file
+
begin_offset);
uint8_t
*
begin
=
*
begin_ptr;
/
/
vtable(
4
|
8
)
+
prev_fields_size
std::string
*
location
=
(reinterpret_cast<std::string
*
>((uint8_t
*
) dex_file
+
location_offset));
if
(location
-
>find(
"base.apk"
) !
=
std::string::npos) {
/
/
code_item_offset
=
=
0
说明是native方法或者没有代码
if
(classDataItemReader
-
>GetMethodCodeItemOffset()
=
=
0
) {
DLOGW(
"native method? = %s code_item_offset = 0x%x"
,
classDataItemReader
-
>MemberIsNative() ?
"true"
:
"false"
,
classDataItemReader
-
>GetMethodCodeItemOffset());
return
;
}
uint16_t firstDvmCode
=
*
((uint16_t
*
)(begin
+
classDataItemReader
-
>GetMethodCodeItemOffset()
+
16
));
if
(firstDvmCode !
=
0x0012
&& firstDvmCode !
=
0x0016
&& firstDvmCode !
=
0x000e
){
NLOG(
"this method has code no need to patch"
);
return
;
}
uint32_t dexSize
=
*
((uint32_t
*
)(begin
+
0x20
));
int
dexIndex
=
dexNumber(location);
auto dexIt
=
dexMap.find(dexIndex
-
1
);
if
(dexIt !
=
dexMap.end()) {
auto dexMemIt
=
dexMemMap.find(dexIndex);
if
(dexMemIt
=
=
dexMemMap.end()){
changeDexProtect(begin,location
-
>c_str(),dexSize,dexIndex);
}
auto codeItemMap
=
dexIt
-
>second;
int
methodIdx
=
classDataItemReader
-
>GetMemberIndex();
auto codeItemIt
=
codeItemMap
-
>find(methodIdx);
if
(codeItemIt !
=
codeItemMap
-
>end()) {
CodeItem
*
codeItem
=
codeItemIt
-
>second;
uint8_t
*
realCodeItemPtr
=
(uint8_t
*
)(begin
+
classDataItemReader
-
>GetMethodCodeItemOffset()
+
16
);
memcpy(realCodeItemPtr,codeItem
-
>getInsns(),codeItem
-
>getInsnsSize());
}
}
}
}
}