首页
社区
课程
招聘
[求助]向大侠求助一段arm反汇编代码的意思
发表于: 2012-10-25 09:46 6783

[求助]向大侠求助一段arm反汇编代码的意思

2012-10-25 09:46
6783
.text:00294234 ; zonet::TranImp::send(void  const*, int)
 EXPORT _ZN8zonet15TranImp4sendEPKvi
 _ZN8zonet15TranImp4sendEPKvi ; CODE XREF: zonet::TranImp::send(void  const*,int)+4j
.text:00294234                 STMFD   SP!, {R4-R8,LR}
.text:00294238                 MOV     R5, R0
.text:0029423C                 MOV     R7, R1
.text:00294240                 LDR     R0, =(aCnettransfer_4 - 0x294254)
.text:00294244                 LDR     R1, =(aLenD - 0x294258)
.text:00294248                 MOV     R4, R2
.text:0029424C                 ADD     R0, PC, R0      ; "TranImp::send"
.text:00294250                 ADD     R1, PC, R1      ; "len:%d"
.text:00294254                 BL      _ZN8zolog3logEPKcS1_z ; zolog::log(char  const*,char  const*,...)
.text:00294258                 MOV     R0, #0x10
.text:0029425C                 BL      _Znwj           ; operator new(uint)
.text:00294260                 MOV     R1, R4
.text:00294264                 MOV     R6, R0
.text:00294268                 BL      _ZN8zokrnl7CBufferC1Ei ; zokrnl::CBuffer::CBuffer(int)
.text:0029426C                 MOV     R2, R4
.text:00294270                 MOV     R3, #0
.text:00294274                 MOV     R1, R7
.text:00294278                 MOV     R0, R6
.text:0029427C                 ADD     R7, R5, #0x44
.text:00294280                 BL      _ZN8zokrnl7CBuffer10attachBackEPKvii ; zokrnl::CBuffer::attachBack(void  const*,int,int)
.text:00294284                 MOV     R0, R7
.text:00294288                 BL      _ZN8zokrnl11CThreadSync4lockEv ; zokrnl::CThreadSync::lock(void)
.text:0029428C                 MOV     R0, #0xC
.text:00294290                 BL      _Znwj           ; operator new(uint)
.text:00294294                 CMN     R0, #8
.text:00294298                 STRNE   R6, [R0,#8]
.text:0029429C                 ADD     R1, R5, #0x3C
.text:002942A0                 BL      _ZNSt15_List_node_base4hookEPS_ ; std::_List_node_base::hook(std::_List_node_base*)
.text:002942A4                 MOV     R0, R7
.text:002942A8                 BL      _ZN8zokrnl11CThreadSync6signalEv ; zokrnl::CThreadSync::signal(void)
.text:002942AC                 MOV     R0, R7
.text:002942B0                 BL      _ZN8zokrnl11CThreadSync6unlockEv ; zokrnl::CThreadSync::unlock(void)
.text:002942B4                 MOV     R0, R4
.text:002942B8                 LDMFD   SP!, {R4-R8,PC}
.text:002942B8 ; End of function zonet::TranImp::send(void const*,int)


这段代码应该是网络通信函数,我看到里面有打日志,但是打出来的是发送的长度,我想打印出来的是要发送的内容,也就是第一个参数的值,我应该如何修改呢?

我理解的R0是进来的第一个参数,R1是第二个参数,不知道对不对,然后把R0和R1传到log函数打印,但是%d这个整数又是怎么传给log函数的呢?小弟对arm汇编还属于新手入门阶段,希望大侠们不吝赐教,谢谢

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 225
活跃值: (38)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
r0-r3 依次做参数 剩下的参数在stack
2012-10-25 14:12
0
雪    币: 113
活跃值: (628)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
多谢,可是调用Log函数时没见到有R3呢,那他的%d那个整数是如何传进去的呢?
2012-10-25 15:09
0
雪    币: 3758
活跃值: (3337)
能力值: ( 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, 可以参考我的注释
2012-10-27 07:38
0
雪    币: 3758
活跃值: (3337)
能力值: ( LV15,RANK:500 )
在线值:
发帖
回帖
粉丝
5
你要dump包内容需要先解析好包的格式,然后写函数,修改对这个函数的调用到自己的函数,自己的函数打印包的字段后,调用原函数返回。
2012-10-27 07:48
0
雪    币: 113
活跃值: (628)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
谢谢半仙大神,

现在假设 进来第一个参数是字符串,我想直接用函数体内的zolog函数打印出这个参数,
我猜应该是改“ADD     R1, PC, R1      ; "len:%d"”这一句,把"len:%d"改成这个参数
但是如果是这种情况应该如何改呢?改成“ADD R1,PC,R5”吗?
2012-10-27 16:29
0
雪    币: 3758
活跃值: (3337)
能力值: ( LV15,RANK:500 )
在线值:
发帖
回帖
粉丝
7
第一个参数是this,第二个是data,第三个是len。
假设data是null结尾的纯文本数据,应该在调用zolog之前,保存完r2后将data复制给r2,同时修改aLenD偏移指向的格式字符串从%d修改为%s。
你的改法是将format修改为this地址加上当前地址的偏移,这是完全不对的。修改为data更不对,format不允许传入第三方数据,因为这是可变数量参数,里面出现你无法预测的格式字符会引发堆栈失衡
2012-10-27 17:03
0
雪    币: 113
活跃值: (628)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
谢谢,有了思路就好办了,我去好好学习一下
2012-10-27 17:52
0
游客
登录 | 注册 方可回帖
返回
//