本工具从最初版的跳转分布图只为了更直观地分析反汇编代码的分支结构,第三版开始对直观图进行逆向分支代码的输出,第四版对分支输出策略的一些探索,第五版结合之前的探索进行改进。第六版在现在功能的基础上进行增强,利用第六版(一)的基本功能-直译,第六版(二)对条件分支增加条件判断翻译,以及改进在函数调用处附带备选参数参考。
现在将第六版的(一)和(二)组合在一起进行逆向代码输出。
下面选了三个例子
void prepare_commit(CA::Transaction*) { // 0 pushq %rbp // 1 rbp = rsp; // 4 pushq %r15 // 6 pushq %r14 // 8 pushq %r13 // 10 pushq %r12 // 12 pushq %rbx // 13 rsp = rsp - 0x1058; // 20 r15 = rsi; // 23 _1078 = r15; // 30 r14 = rdi; // 33 rax = (void *)0x00000001066f9070: __stack_chk_guard; // 40 rax = rax->_0; // 43 _30 = rax; // 47 rsi = &_1030; // 54 edi = 0x400; // 59 edx = 0x1000; // 64 call // %edx = 0x1000 // %edi = 0x400 // %rsi = &_1030 x_heap_new_with_ptr; // 69 rbx = rax; // 72 _1080 = rbx; // 79 rdi = r15; // 82 call // %rdi = r15 CA::Transaction::lock(); // 87 xmm0 = 0.; ; // 90 ((float*)&_1070)[0] = xmm0.ps[0]; ((float*)&_1070)[1] = xmm0.ps[1]; ((float*)&_1070)[2] = xmm0.ps[2]; ((float*)&_1070)[3] = xmm0.ps[3]; ; // 97 _1060 = 0x0; // 108 _1058 = r15; // 115 _1050 = rbx; // 122 _1048 = 0x2; // 132 _1044 = 0x4; // 142 _1040 = 0x0; // 152 rsi = &_1070; // 159 rdi = r14; // 162 call // %rdi = r14 // %rsi = &_1070 CA::Layer::collect_layers_(CA::Layer::CollectLayersData*); // 167 rbx = _1070; // 174 rdi = r15; // 177 call // %rdi = r15 CA::Transaction::unlock(); // 182 goto _f188; _b184: // from 403 _b184: // from 386 // 184 rbx = rbx->_8; _f188: // from 182 // 188 testq %rbx, %rbx // 191 if (!) { // 188 (0 == rbx) // 197 r12 = rbx->_0; // 200 r14 = r12->_10; // 205 testq %r14, %r14 // 208 if (!) { // 205 (0 == r14) // 214 rdi = r15; // 217 call // %rdi = r15 CA::Transaction::lock(); // 222 rdi = r14; // 225 rsi = "contents"; // 232 call // %rsi = "contents" // %rdi = r14 objc_msgSend; // 238 r13 = rax; // 241 testq %r13, %r13 // 244 if () { // 241 (0 == r13) // gen jmp 336 goto _f336; // 246 rdi = r13; // 249 call // %rdi = r13 CFRetain; // 254 rdi = r15; // 257 call // %rdi = r15 CA::Transaction::unlock(); // 262 rdi = r13; // 265 call // %rdi = r13 CFGetTypeID; // 270 r15 = rax; // 273 call CGImageGetTypeID; // 278 cmpq %rax, %r15 } // 281 else if () { // 278 (r15 != rax) // gen jmp 346 goto _f346; } else { // 281 next // 283 rdi = r14; // 286 rsi = "_renderImageCopyFlags"; // 293 call // %rsi = "_renderImageCopyFlags" // %rdi = r14 objc_msgSend; // 299 r14d = eax; // 302 r15 = _1078; // 309 rdi = r15; // 312 call // %rdi = r15 CA::Context::current_colorspace(CA::Transaction*); // 317 xmm0 = 0.; ; // 320 rdi = r13; // 323 rsi = rax; // 326 edx = r14d; // 329 call // %edx = r14d // %rsi = rax // %rdi = r13 // %xmm0 = 0.; CA::Render::prepare_image(CGImage*, CGColorSpace*, unsigned int, double); // 334 goto _f369; _f336: // from 244 } // 336 // 336 rdi = r15; // 339 call // %rdi = r15 CA::Transaction::unlock(); // 344 goto _f377; _f346: // from 281 // 346 rdi = r13; // 349 rsi = "CA_prepareRenderValue"; // 356 call // %rsi = "CA_prepareRenderValue" // %rdi = r13 objc_msgSend; // 362 r15 = _1078; _f369: // from 334 // 369 rdi = r13; // 372 call // %rdi = r13 CFRelease; _f377: // from 344 } // 377 // 377 cmpq $0x0, 0x98(%r12) // 386 if () // 377 (r12->_98 == 0x0) goto _b184; // 392 rdi = r12; // 395 rsi = r15; // 398 call // %rsi = r15 // %rdi = r12 CA::Layer::prepare_animations(CA::Transaction*); // 403 goto _b184; } // 408 // 408 rdi = _1080; // 415 call // %rdi = _1080 x_heap_free; // 420 rax = (void *)0x00000001066f9070: __stack_chk_guard; // 427 rax = rax->_0; // 430 cmpq -0x30(%rbp), %rax // 434 if () // 430 (rax != _30) goto _f475; // 436 rsp = rsp + 0x1058; // 443 popq %rbx // 444 popq %r12 // 446 popq %r13 // 448 popq %r14 // 450 popq %r15 // 452 popq %rbp // 453 ret return; _b454: // from 473 // 454 r14 = rax; // 457 rdi = r15; // 460 call // %rdi = r15 CA::Transaction::unlock(); // 465 rdi = r14; // 468 call // %rdi = r14 _Unwind_Resume; // 473 goto _b454; _f475: // from 434 // 475 call __stack_chk_fail; }
State* CA::Layer::writable_state(CA::Transaction*) { // 0 pushq %rbp // 1 rbp = rsp; // 4 pushq %r15 // 6 pushq %r14 // 8 pushq %rbx // 9 pushq %rax // 10 r14 = rsi; // 13 rbx = rdi; // 16 cmpq $0x0, 0x90(%rbx) // 24 if (!) { // 16 (rbx->_90 != 0x0) // 30 testb $0x40, 0x85(%rbx) // 37 if (!) { // 30 (0 == ((0x40<<8) & rbx->_84)) // 39 rdi = rbx; // 42 rsi = r14; // 45 call // %rsi = r14 // %rdi = rbx CA::Layer::fetch_geometry(CA::Transaction*); } // 50 // 50 edi = 0x6; // 55 call // %edi = 0x6 x_mem_alloc_bucket; // 60 r15 = rax; // 63 r15->_0 = 0x1; // 70 eax = rbx->_2c; // 73 r15->_4 = eax; // 77 rax = rbx->_30; // 81 rcx = rbx->_38; // 85 r15->_10 = rcx; // 89 r15->_8 = rax; // 93 xmm0.ps[0] = ((float*)&rbx->_40)[0]; xmm0.ps[1] = ((float*)&rbx->_40)[1]; xmm0.ps[2] = ((float*)&rbx->_40)[2]; xmm0.ps[3] = ((float*)&rbx->_40)[3]; ; // 97 ((float*)&r15->_18)[0] = xmm0.ps[0]; ((float*)&r15->_18)[1] = xmm0.ps[1]; ((float*)&r15->_18)[2] = xmm0.ps[2]; ((float*)&r15->_18)[3] = xmm0.ps[3]; ; // 102 xmm0.ps[0] = ((float*)&rbx->_50)[0]; xmm0.ps[1] = ((float*)&rbx->_50)[1]; xmm0.ps[2] = ((float*)&rbx->_50)[2]; xmm0.ps[3] = ((float*)&rbx->_50)[3]; ; // 106 ((float*)&r15->_28)[0] = xmm0.ps[0]; ((float*)&r15->_28)[1] = xmm0.ps[1]; ((float*)&r15->_28)[2] = xmm0.ps[2]; ((float*)&r15->_28)[3] = xmm0.ps[3]; ; // 111 r15->_38 = 0x0; // 119 rax = rbx->_60; // 123 r15->_38 = rax; // 127 rdi = rbx->_68; // 131 eax = 0; // 133 testq %rdi, %rdi // 136 if (!) { // 133 (0 == rdi) // 138 call CFRetain; } // 143 // 143 r15->_40 = rax; // 147 rdi = rbx->_70; // 151 eax = 0; // 153 testq %rdi, %rdi // 156 if (!) { // 153 (0 == rdi) // 158 call CFRetain; } // 163 // 163 r15->_48 = rax; // 167 r15->_50 = 0x0; // 175 cmpq $0x0, 0x78(%rbx) // 180 if (!) { // 175 (rbx->_78 == 0x0) // 182 rdi = r14; // 185 call // %rdi = r14 CA::Transaction::lock(); // 190 rdi = rbx->_78; // 194 eax = 0; // 196 testq %rdi, %rdi // 199 if (!) { // 196 (0 == rdi) // 201 call CA::AttrList::copy(); } // 206 // 206 r15->_50 = rax; // 210 rdi = r14; // 213 call // %rdi = r14 CA::Transaction::unlock(); } // 218 // 218 eax = 0; _b220: // from 239 // 220 ecx = ((int32_t*)&rbx->_80)[rax]; // 227 ((int32_t*)&r15->_58)[rax] = ecx; // 232 ++rax; // 235 cmpq $0x4, %rax // 239 if () // 235 (rax != 0x4) goto _b220; // 241 r15->_59 = r15->_59 & -0x11; // 246 rbx->_90 = r15; } // 253 // 253 rbx = rbx + 0x28; // 257 rax = rbx; // 260 rsp = rsp + 0x8; // 264 popq %rbx // 265 popq %r14 // 267 popq %r15 // 269 popq %rbp // 270 ret return; // 271 rbx = rax; // 274 goto _f287; // 276 rbx = rax; // 279 rdi = r14; // 282 call // %rdi = r14 CA::Transaction::unlock(); _f287: // from 274 // 287 rdi = rbx; // 290 call // %rdi = rbx _Unwind_Resume; // 295 nop }
void CA::Layer::set_needs_display_in_rect(CGRect const&) { // 0 pushq %rbp // 1 rbp = rsp; // 4 pushq %r15 // 6 pushq %r14 // 8 pushq %r13 // 10 pushq %r12 // 12 pushq %rbx // 13 rsp = rsp - 0x38; // 17 rbx = rsi; // 20 r12 = rdi; // 23 testl $0x60000, 0x4(%r12) // 32 if (!) { // 23 (0x60000 & r12->_4) // 38 call CA::Transaction::ensure_compat(); // 43 r14 = rax; // 46 rdi = r14; // 49 call // %rdi = r14 CA::Transaction::lock(); // 54 xmm0 = 0.; ; // 58 ucomisd 0x10(%rbx), %xmm0 // 63 if (!) { // 58 (xmm0.sd == (double&)rbx->_10) // 69 ucomisd 0x18(%rbx), %xmm0 // 74 if (!) { // 69 (xmm0.sd == (double&)rbx->_18) // 80 r13 = r12->_10; // 85 rsi = "contents"; // 92 rdi = r13; // 95 call // %rdi = r13 // %rsi = "contents" objc_msgSend; // 101 _58 = rax; // 105 cmpq $0x0, -0x58(%rbp) // 110 if (!) { // 105 (_58 == 0x0) // 116 rdi = _58; // 120 call // %rdi = _58 CFGetTypeID; // 125 r15 = rax; // 128 call CABackingStoreGetTypeID; // 133 cmpq %rax, %r15 // 136 if (!) { // 133 (r15 != rax) // 142 xmm0.pd[0] = ((double*)&rbx->_0)[0]; xmm0.pd[1] = ((double*)&rbx->_0)[1]; ; // 146 xmm1.pd[0] = ((double*)&r12->_40)[0]; xmm1.pd[1] = ((double*)&r12->_40)[1]; ; // 153 xmm0.pd[0] = xmm0.pd[0] - xmm1.pd[0]; xmm0.pd[1] = xmm0.pd[1] - xmm1.pd[1]; ; // 157 rax = rbx->_10; // 161 rcx = rbx->_18; // 165 ((double*)&_50)[0] = xmm0.pd[0]; ((double*)&_50)[1] = xmm0.pd[1]; ; // 170 _40 = rax; // 174 _38 = rcx; // 178 testb $0x1, 0x87(%r12) // 187 if (!) { // 178 ((0x1<<24) & r12->_84) // 189 xmm0.sd = (double&)rax; ; // 194 xmm1.sd = (double&)rcx; ; // 199 goto _f254; } // 201 // 201 rsi = "contentsScale"; // 208 rdi = r13; // 211 call // %rdi = r13 // %rsi = "contentsScale" objc_msgSend; // 217 xmm0.pd[0] = xmm0.pd[0]; xmm0.pd[1] = xmm0.pd[0]; ; // 221 xmm1.pd[0] = ((double*)&_50)[0]; xmm1.pd[1] = ((double*)&_50)[1]; ; // 226 xmm1.pd[0] = xmm1.pd[0] * xmm0.pd[0]; xmm1.pd[1] = xmm1.pd[1] * xmm0.pd[1]; ; // 230 ((double*)&_50)[0] = xmm1.pd[0]; ((double*)&_50)[1] = xmm1.pd[1]; ; // 235 xmm0.pd[0] = xmm0.pd[0] * ((double*)&_40)[0]; xmm0.pd[1] = xmm0.pd[1] * ((double*)&_40)[1]; ; // 240 ((double*)&_40)[0] = xmm0.pd[0]; ((double*)&_40)[1] = xmm0.pd[1]; ; // 245 xmm1.pd[0] = xmm0.pd[0]; xmm1.pd[1] = xmm0.pd[1]; ; // 249 shufpd $0x1, %xmm1, %xmm1 _f254: // from 199 // 254 eax = 0; // 256 xmm2.sd = (double&) defines_property(unsigned int)::atoms + 32; ; // 264 ucomisd %xmm2, %xmm1 // 268 rsi = &_50; // 272 rsi = (xmm1.sd > xmm2.sd) ? rax : rsi; // 276 ucomisd %xmm2, %xmm0 // 280 rsi = (xmm0.sd > xmm2.sd) ? rax : rsi; // 284 rdi = _58; // 288 call // %rdi = _58 // % // %rsi = &_50 // % // %xmm2.sd = (double&) defines_property(unsigned int)::atoms + 32; CABackingStoreInvalidate; } // 293 } // 293 } // 293 } // 293 // 293 edx = 0x100; // 298 ecx = 0x200; // 303 rdi = r12; // 306 rsi = r14; // 309 call // %rsi = r14 // %rdi = r12 // %ecx = 0x200 // %edx = 0x100 CA::Layer::mark(CA::Transaction*, unsigned int, unsigned int); // 314 rdi = r14; // 317 call // %rdi = r14 CA::Transaction::unlock(); } // 322 // 322 rsp = rsp + 0x38; // 326 popq %rbx // 327 popq %r12 // 329 popq %r13 // 331 popq %r14 // 333 popq %r15 // 335 popq %rbp // 336 ret return; // 337 rbx = rax; // 340 rdi = r14; // 343 call // %rdi = r14 CA::Transaction::unlock(); // 348 rdi = rbx; // 351 call // %rdi = rbx _Unwind_Resume; }