能力值:
( LV2,RANK:10 )
|
-
-
2 楼
r0-r3 依次做参数 剩下的参数在stack
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
多谢,可是调用Log函数时没见到有R3呢,那他的%d那个整数是如何传进去的呢?
|
能力值:
( LV15,RANK:500 )
|
-
-
4 楼
.text:00294234 ; zonet::TranImp::send(void const*, int)
EXPORT _ZN8zonet15TranImp4sendEPKvi
_ZN8zonet15TranImp4sendEPKvi ; CODE XREF: zonet::TranImp::send(void const* data,int datalen)+4j
STMFD SP!, {R4-R8,LR}
MOV R5, R0 // r5 = a1
MOV R7, R1 // r7 = a2
LDR R0, =(aCnettransfer_4 - 0x294254)
LDR R1, =(aLenD - 0x294258)
MOV R4, R2 // r4 = a3
ADD R0, PC, R0 ; "TranImp::send"
ADD R1, PC, R1 ; "len:%d"
BL _ZN8zolog3logEPKcS1_z ; zolog::log(char const* domain,char const* format,...) // zolog("TranImp::send", "len:%d", a3);
MOV R0, #0x10 // r0 = sizeof CBuffer
BL _Znwj ; operator new(uint) // r0 = new char[16];
MOV R1, R4 // r1 = a3
MOV R6, R0 // r6 = newbuf16
BL _ZN8zokrnl7CBufferC1Ei ; zokrnl::CBuffer::CBuffer(int) // zokrnl::CBuffer::CBuffer(newbuf16, a3); // r0 = newbuf16(initalized)
MOV R2, R4 // r2 = a3
MOV R3, #0 // r3 = 0
MOV R1, R7 // r1 = a2
MOV R0, R6 // r0 = newbuf16
ADD R7, R5, #0x44 // r7 = &a1->lock44
BL _ZN8zokrnl7CBuffer10attachBackEPKvii ; zokrnl::CBuffer::attachBack(void const*,int,int) // zokrnl::CBuffer::attachBack(newbuf16, a2, a3, 0);
MOV R0, R7 // r0 = &a1->lock44
BL _ZN8zokrnl11CThreadSync4lockEv ; zokrnl::CThreadSync::lock(void) // zokrnl::CThreadSync::lock(&a1->lock44)
MOV R0, #0xC // r0 = sizeof list
BL _Znwj ; operator new(uint) // r0 = new char[12];
CMN R0, #8 // newlist != -8?
STRNE R6, [R0,#8] // if (newlist != -8) newlist->rev8 = newbuf16;
ADD R1, R5, #0x3C // r1 = &a1->nodebase3c
BL _ZNSt15_List_node_base4hookEPS_ ; std::_List_node_base::hook(std::_List_node_base*) // std::_List_node_base::hook(newlist, &a1->nodebase3c)
MOV R0, R7 // r0 = &a1->lock44
BL _ZN8zokrnl11CThreadSync6signalEv ; zokrnl::CThreadSync::signal(void) // zokrnl::CThreadSync::signal(&a1->lock44);
MOV R0, R7 // r0 = &a1->lock44
BL _ZN8zokrnl11CThreadSync6unlockEv ; zokrnl::CThreadSync::unlock(void) // zokrnl::CThreadSync::unlock(&a1->lock44);
MOV R0, R4 // return datalen;
LDMFD SP!, {R4-R8,PC}
.text:002942B8 ; End of function zonet::TranImp::send(void const*,int)
int zonet::TranImp::send(void const* data,int datalen)
{
zolog("TranImp::send", "len:%d", datalen);
CBuffer* newbuf16 = new CBuffer();
newbuf16->attachBack(data, datalen, 0);
this->lock44->lock();
listitem newlist12 = new listitem();
if (newlist12 != ERROR_ALLOC_NEG8) {
newlist12->buf8 = newbuf16;
}
this->list3c->insert(newlist12);
this->lock44->signal();
this->lock44->unlock();
return datalen;
}
是一个放进待发缓冲区的操作, 同时追加缓冲信息列表.
楼主理解可能有问题, r0和r1并不总是保持函数调用时候的参数, 第三个参数也并不是r3, 可以参考我的注释
|
能力值:
( LV15,RANK:500 )
|
-
-
5 楼
你要dump包内容需要先解析好包的格式,然后写函数,修改对这个函数的调用到自己的函数,自己的函数打印包的字段后,调用原函数返回。
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
谢谢半仙大神,
现在假设 进来第一个参数是字符串,我想直接用函数体内的zolog函数打印出这个参数,
我猜应该是改“ADD R1, PC, R1 ; "len:%d"”这一句,把"len:%d"改成这个参数
但是如果是这种情况应该如何改呢?改成“ADD R1,PC,R5”吗?
|
能力值:
( LV15,RANK:500 )
|
-
-
7 楼
第一个参数是this,第二个是data,第三个是len。
假设data是null结尾的纯文本数据,应该在调用zolog之前,保存完r2后将data复制给r2,同时修改aLenD偏移指向的格式字符串从%d修改为%s。
你的改法是将format修改为this地址加上当前地址的偏移,这是完全不对的。修改为data更不对,format不允许传入第三方数据,因为这是可变数量参数,里面出现你无法预测的格式字符会引发堆栈失衡
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
谢谢,有了思路就好办了,我去好好学习一下
|