Skip to content

Commit 8cedb02

Browse files
committed
Remove prop log and filter vma for logcat
1 parent 6539183 commit 8cedb02

File tree

3 files changed

+52
-45
lines changed

3 files changed

+52
-45
lines changed

logcat/logcat.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ class Logcat : public PaserPlugin {
123123
}};
124124

125125
public:
126-
bool debug = false;
126+
bool debug = true;
127127
bool is_compat;
128128
Logcat(std::shared_ptr<Swapinfo> swap);
129129
~Logcat();

logcat/logcatS.cpp

+38-31
Original file line numberDiff line numberDiff line change
@@ -82,43 +82,33 @@ ulong LogcatS::parser_logbuf_addr(){
8282

8383
size_t LogcatS::get_logbuf_addr_from_vma(){
8484
int index = 0;
85+
fprintf(fp, "Found logbuf addr from %zu vma \n", rw_vma_list.size());
8586
for (const auto& vma_ptr : rw_vma_list) {
8687
if (debug){
87-
std::cout << "check vma:[" << std::dec << index << "]"
88-
<< "[" << std::hex << vma_ptr->vm_start
89-
<< "~" << std::hex << vma_ptr->vm_end << "]"
90-
<< std::endl;
88+
fprintf(fp, "check vma:[%d][%lx~%lx]\n", index, vma_ptr->vm_start, vma_ptr->vm_end);
9189
}
9290
long stdlist_addr = check_ChunkList_in_vma(vma_ptr,vma_ptr->vm_start);
93-
if (debug){
94-
if (stdlist_addr == -1) {
95-
std::cout << "Result: " << stdlist_addr << "\n" << std::endl;
96-
} else {
97-
std::cout << "Result: " << std::showbase << std::hex << stdlist_addr << "\n" << std::endl;
98-
}
99-
}
10091
index++;
10192
if (stdlist_addr == -1){
10293
continue;
10394
}
95+
if (debug){
96+
fprintf(fp, "stdlist maybe at %lx \n", stdlist_addr);
97+
}
10498
bool is_match = true;
10599
for (size_t i = 1; i < ALL; i++){
106100
long check_addr = stdlist_addr + g_size.stdlist_node_size * i;
107101
if (debug){
108-
std::cout << "check Log[" << std::dec << i << "] from " << std::hex << check_addr << std::endl;
102+
fprintf(fp, "check LogBuf:[%zu] from %lx\n", i, check_addr);
109103
}
110104
long list_addr = check_ChunkList_in_vma(vma_ptr,check_addr);
111-
if (debug){
112-
if (list_addr == -1) {
113-
std::cout << "Result: " << list_addr << "\n" << std::endl;
114-
} else {
115-
std::cout << "Result: " << std::showbase << std::hex << list_addr << "\n" << std::endl;
116-
}
117-
}
118105
if (list_addr == -1 || list_addr != check_addr){
119106
is_match = false;
120107
break;
121108
}
109+
if (debug){
110+
fprintf(fp, "stdlist maybe at %lx \n", list_addr);
111+
}
122112
}
123113
if (is_match){
124114
return static_cast<size_t>(stdlist_addr);
@@ -128,6 +118,8 @@ size_t LogcatS::get_logbuf_addr_from_vma(){
128118
}
129119

130120
void LogcatS::get_rw_vma_list(){
121+
field_init(vm_area_struct, anon_name);
122+
field_init(anon_vma_name, name);
131123
for (auto &vma_addr : for_each_vma(tc_logd->task)){
132124
void *vma_buf = read_struct(vma_addr, "vm_area_struct");
133125
if (!vma_buf) {
@@ -139,10 +131,33 @@ void LogcatS::get_rw_vma_list(){
139131
continue;
140132
}
141133
ulong vm_flags = ULONG(vma_buf + field_offset(vm_area_struct, vm_flags));
134+
if (vm_flags & VM_EXEC) {
135+
FREEBUF(vma_buf);
136+
continue;
137+
}
142138
if (!(vm_flags & VM_READ) || !(vm_flags & VM_WRITE)) {
143139
FREEBUF(vma_buf);
144140
continue;
145141
}
142+
std::string vma_name = "";
143+
ulong anon_name = ULONG(vma_buf + field_offset(vm_area_struct, anon_name));
144+
if (is_kvaddr(anon_name)){ // // kernel 5.15 in kernelspace
145+
if (field_offset(anon_vma_name, name) != -1) {
146+
vma_name = read_cstring(anon_name + field_offset(anon_vma_name, name),page_size,"anon_name");
147+
}else{
148+
vma_name = read_cstring(anon_name,page_size,"anon_name");
149+
}
150+
}else if (is_uvaddr(anon_name,tc_logd) && swap_ptr.get() != nullptr){ // kernel 5.4 in userspace
151+
#if defined(ARM64)
152+
anon_name &= (USERSPACE_TOP - 1);
153+
#endif
154+
vma_name = swap_ptr->uread_cstring(tc_logd->task,anon_name, page_size, "anon_name");
155+
}
156+
if (vma_name.find("alloc") == std::string::npos){
157+
FREEBUF(vma_buf);
158+
continue;
159+
}
160+
fprintf(fp, "vma_name: %s \n",vma_name.c_str());
146161
ulong vm_start = ULONG(vma_buf + field_offset(vm_area_struct, vm_start));
147162
ulong vm_end = ULONG(vma_buf + field_offset(vm_area_struct, vm_end));
148163
FREEBUF(vma_buf);
@@ -184,11 +199,7 @@ long LogcatS::check_ChunkList_in_vma(std::shared_ptr<rw_vma> vma_ptr,ulong list_
184199
continue;
185200
}
186201
if (debug){
187-
std::cout << "addr:" << std::hex << stdlist_addr
188-
<< " tail_node:" << std::hex << tail_node
189-
<< " next_node:" << std::hex << next_node
190-
<< " list_size:" << std::dec << list_size
191-
<< std::endl;
202+
fprintf(fp, " addr:%zu tail_node:%zu next_node:%zu list_size:%zu\n",stdlist_addr,tail_node,next_node,list_size);
192203
}
193204
if (list_size > 5000){
194205
continue;
@@ -219,11 +230,7 @@ long LogcatS::check_ChunkList_in_vma(std::shared_ptr<rw_vma> vma_ptr,ulong list_
219230
break;
220231
}
221232
if (debug){
222-
std::cout << " [" << std::dec << index << "]"
223-
<< "addr:" << std::hex << next_node_addr
224-
<< " prev_node:" << std::hex << prev_node
225-
<< " next_node:" << std::hex << next_node
226-
<< std::endl;
233+
fprintf(fp, " [%d]addr:%zu prev_node:%zu next_node:%zu \n",index, next_node_addr,prev_node,next_node);
227234
}
228235
if (prev_node != prev_node_addr){
229236
break;
@@ -326,13 +333,13 @@ void LogcatS::parser_SerializedLogChunk(LOG_ID log_id, ulong vaddr){
326333
}
327334
size_t const rBuffSize = ZSTD_getFrameContentSize(compressed_log, compressed_size);
328335
if (rBuffSize == ZSTD_CONTENTSIZE_ERROR || rBuffSize == ZSTD_CONTENTSIZE_UNKNOWN) {
329-
std::cout << "Error determining the content size of the compressed data." << std::endl;
336+
fprintf(fp, "Error determining the content size of the compressed data.\n");
330337
return;
331338
}
332339
std::vector<char> buffer(rBuffSize);
333340
size_t const dSize = ZSTD_decompress(buffer.data(), buffer.size(), compressed_log, compressed_size);
334341
if (ZSTD_isError(dSize)) {
335-
std::cout << "Failed to decompress data: " << ZSTD_getErrorName(dSize) << std::endl;
342+
fprintf(fp, "Failed to decompress data: %s \n",ZSTD_getErrorName(dSize));
336343
return;
337344
}
338345
// std::cout << std::string(buffer.begin(), buffer.end()) << std::endl;

property/propinfo.cpp

+13-13
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ bool PropInfo::parser_propertys(){
146146
init_datatype_info();
147147
size_t pa_size_addr = swap_ptr->get_var_addr_by_bss("pa_size_", tc_init->task, symbol_file);
148148
if (!is_uvaddr(pa_size_addr,tc_init)){
149-
fprintf(fp, "pa_size: %#zx is not invaild !\n",pa_size_addr);
149+
// fprintf(fp, "pa_size: %#zx is not invaild !\n",pa_size_addr);
150150
return false;
151151
}
152152
if (is_compat){
@@ -158,7 +158,7 @@ bool PropInfo::parser_propertys(){
158158

159159
size_t pa_data_size_addr = swap_ptr->get_var_addr_by_bss("pa_data_size_", tc_init->task, symbol_file);
160160
if (!is_uvaddr(pa_data_size_addr,tc_init)){
161-
fprintf(fp, "pa_data_size: %#zx is not invaild !\n",pa_data_size_addr);
161+
// fprintf(fp, "pa_data_size: %#zx is not invaild !\n",pa_data_size_addr);
162162
return false;
163163
}
164164
if (is_compat){
@@ -169,7 +169,7 @@ bool PropInfo::parser_propertys(){
169169
if(debug)fprintf(fp, "pa_data_size:%#zx --> %zu \n",pa_data_size_addr, pa_data_size);
170170
size_t system_prop_addr = swap_ptr->get_var_addr_by_bss("system_properties", tc_init->task, symbol_file);
171171
if (!is_uvaddr(system_prop_addr,tc_init)){
172-
fprintf(fp, "system_properties: %#zx is not invaild !\n",system_prop_addr);
172+
// fprintf(fp, "system_properties: %#zx is not invaild !\n",system_prop_addr);
173173
return false;
174174
}
175175
if(debug)fprintf(fp, "system_properties: %#zx \n",system_prop_addr);
@@ -181,7 +181,7 @@ bool PropInfo::parser_propertys(){
181181
contexts_addr = swap_ptr->uread_ulong(tc_init->task, contexts_addr, "read Contexts");
182182
}
183183
if (!is_uvaddr(contexts_addr,tc_init)){
184-
fprintf(fp, "ContextsSerialized: %#zx is not invaild !\n",contexts_addr);
184+
// fprintf(fp, "ContextsSerialized: %#zx is not invaild !\n",contexts_addr);
185185
return false;
186186
}
187187
if(debug)fprintf(fp, "ContextsSerialized: %#zx \n",contexts_addr);
@@ -196,21 +196,21 @@ bool PropInfo::parser_propertys(){
196196
serial_prop_area_addr = swap_ptr->uread_ulong(tc_init->task, contexts_addr + g_offset.ContextsSerialized_serial_prop_area_, "read serial_prop_area_");
197197
}
198198
if (!is_uvaddr(serial_prop_area_addr,tc_init)){
199-
fprintf(fp, "serial_prop_area: %#zx is not invaild !\n",serial_prop_area_addr);
199+
// fprintf(fp, "serial_prop_area: %#zx is not invaild !\n",serial_prop_area_addr);
200200
return false;
201201
}
202202
if(debug)fprintf(fp, "serial_prop_area: %#zx \n",serial_prop_area_addr);
203203
// parser_prop_area(serial_prop_area_addr);
204204

205205
if (!is_uvaddr(context_nodes_addr,tc_init)){
206-
fprintf(fp, "context_nodes: %#zx is not invaild !\n",context_nodes_addr);
206+
// fprintf(fp, "context_nodes: %#zx is not invaild !\n",context_nodes_addr);
207207
return false;
208208
}
209209
if(debug)fprintf(fp, "context_nodes base: %#zx cnt:%zu\n",context_nodes_addr,num_context_nodes);
210210
for (size_t i = 0; i < num_context_nodes; i++){
211211
size_t node_addr = context_nodes_addr + i * g_size.ContextNode;
212212
if (!is_uvaddr(node_addr,tc_init)){
213-
fprintf(fp, "ContextNode: %#zx is not invaild !\n",node_addr);
213+
// fprintf(fp, "ContextNode: %#zx is not invaild !\n",node_addr);
214214
continue;
215215
}
216216
size_t prop_area_addr,context_addr,filename_addr;
@@ -235,17 +235,17 @@ bool PropInfo::parser_propertys(){
235235

236236
bool PropInfo::parser_prop_area(size_t area_vaddr){
237237
if (!is_uvaddr(area_vaddr,tc_init)){
238-
fprintf(fp, "prop_area: %#zx is not invaild !\n",area_vaddr);
238+
// fprintf(fp, "prop_area: %#zx is not invaild !\n",area_vaddr);
239239
return false;
240240
}
241241
char prop_area_buf[sizeof(prop_area)];
242242
if(!swap_ptr->uread_buffer(tc_init->task,area_vaddr,prop_area_buf,sizeof(prop_area), "prop_area")){
243-
if(debug)fprintf(fp, "read prop_area fail at: %#zx !\n",area_vaddr);
243+
// fprintf(fp, "read prop_area fail at: %#zx !\n",area_vaddr);
244244
return false;
245245
}
246246
prop_area area = *reinterpret_cast<prop_area*>(prop_area_buf);
247247
if (area.magic_ != 0x504f5250){
248-
fprintf(fp, "prop_area magic not correct !\n");
248+
// fprintf(fp, "prop_area magic not correct !\n");
249249
return false;
250250
}
251251
ulong data_addr = area_vaddr + g_offset.prop_area_data_;
@@ -267,7 +267,7 @@ bool PropInfo::parser_prop_area(size_t area_vaddr){
267267

268268
void PropInfo::parser_prop_bt(size_t root, size_t prop_bt_addr){
269269
if (!is_uvaddr(prop_bt_addr,tc_init)){
270-
fprintf(fp, " prop_bt: %#zx is not invaild !\n",prop_bt_addr);
270+
// fprintf(fp, " prop_bt: %#zx is not invaild !\n",prop_bt_addr);
271271
return;
272272
}
273273
char prop_bt_buf[sizeof(prop_bt)];
@@ -301,7 +301,7 @@ void PropInfo::parser_prop_bt(size_t root, size_t prop_bt_addr){
301301

302302
void PropInfo::parser_prop_info(size_t prop_info_addr){
303303
if (!is_uvaddr(prop_info_addr,tc_init)){
304-
fprintf(fp, " prop_info: %#zx is not invaild !\n",prop_info_addr);
304+
// fprintf(fp, " prop_info: %#zx is not invaild !\n",prop_info_addr);
305305
return;
306306
}
307307
char prop_info_buf[sizeof(prop_info)];
@@ -369,7 +369,7 @@ void PropInfo::parser_prop_by_init(){
369369
prop_files.insert(file_path);
370370
char vma_data[vma_len];
371371
if (!swap_ptr->uread_buffer(tc->task, vm_start, vma_data, vma_len, "read vma data for prop")) {
372-
fprintf(fp, "uread_buffer fail in prop \n");
372+
// fprintf(fp, "uread_buffer fail in prop \n");
373373
}
374374
// if(index == 0){
375375
// prop_area pa = *reinterpret_cast<prop_area*>(vma_data);

0 commit comments

Comments
 (0)