本文为看雪论坛精华文章
看雪论坛作者ID:TkBinary
-
-
目录
-
-
系列文章
-
-
一. 了解数学知识
-
1.1 简介
-
-
1.2 数学知识
-
1.2.1 数学知识之代数与解方程
-
1.2.2 简化表达式去括号
-
1.2.3 简化表达式之交叉相乘
-
1.2.4 简化表达式之合并同类项
-
1.2.5 简化表达式之分数的加法简化
-
1.2.7 简化表达式之分数乘法
-
1.2.6 简化表达式之分数的减法简化
-
1.2.8 分数除法
-
-
二. 除法特殊汇编
-
2.1 特殊定式汇编
-
2.1.1高级代码与汇编对应
-
2.1.2 核心代码反汇编还原
-
2.1.3 特殊汇编的除法原理
-
2.1.4 x86乘法特性与x64乘法特性
-
2.1.5 汇编等式还原
-
2.2 特殊汇编M大于0x80000000的加调整
-
2.2.1 高级代码与反汇编
-
2.2.2 代码定式还原
-
2.2.3代码优化原理
-
2.3 特殊汇编大于0x80000000无调整
-
2.3.1 高级代码与反汇编
-
2.3.2 代码定式还原
-
2.3.3 除法原理还原
-
2.4 M小于0x80000000 的减调整
-
2.4.1高级代码与反汇编
-
2.4.2 代码公式还原
-
2.4.3 除法优化原理
-
-
三. 总结
反汇编逆向技术之寻找Main入口点
https://bbs.pediy.com/thread-224500.htm
反汇编代码还原之优化方式
反汇编代码还原之加减乘
反汇编代码还原之除法为2的幂
反汇编代码还原之除法为非2的幂
1.1 简介
1.2 数学知识
1.2.1 数学知识之代数与解方程
x + 3 = 6
4x + 5 = 17
x + 3 = 6
x +3-3= 6 - 3
x = 3
4x + 5 = 17
4x + 5 - 5 = 17 - 5
4x = 12
4x / 4 = 12 / 4
x = 3
1.2.2 简化表达式去括号
3(5 + 2) 展开的时候计算括号的值变成 3*5 + 3*2 = 15 + 6
a(b + c) = ab + ac
3(x + 6) = 3x + 3*6
负数乘法去括号遵循 负正得负 负负得正的规律
-3(a + -6) = -3a + -3*-6 = -3a + 18
-3(a + 6) = -3a + -3*6 = -3a + -18
3 * (2 + 4) = 3 * 6
3 *(2 + 4) = 3*2 + 3*4
2 * 204 直接算算不出可以简化为
2* 200 + 2*4 = 408
1.2.3 简化表达式之交叉相乘
1.2.4 简化表达式之合并同类项
(-xy + 5xy) + (-2xy - 4xy)+(3 - 7) == -2xy - 4
也可以变成
1.2.5 简化表达式之分数的加法简化
1.2.6 简化表达式之分数的减法简化
1.2.7 简化表达式之分数乘法
1.2.8分数除法
2.1 特殊定式汇编
2.1.1高级代码与汇编对应
int main(int argc, char* argv[])
{
/*
除法
*/
unsigned int NumberOne = 0;
unsigned int NumberTwo = 0;
scanf("%u",&NumberOne);
scanf("%u",&NumberTwo);
unsigned int Count1 = NumberOne / -6;
unsigned int Count2 = NumberTwo / 7;
printf("%d%d",Count2,Count1);
system("pause");
return 0;
}
.text:00401000
.text:00401000
.text:00401000 ; int __cdecl main(int argc, const char **argv, const char **envp)
.text:00401000 _main proc near ; CODE XREF: start+AF↓p
.text:00401000
.text:00401000 var_8 = dword ptr -8
.text:00401000 var_4 = dword ptr -4
.text:00401000 argc = dword ptr 4
.text:00401000 argv = dword ptr 8
.text:00401000 envp = dword ptr 0Ch
.text:00401000
.text:00401000 sub esp, 8
.text:00401003 xor eax, eax
.text:00401005 mov [esp+8+var_8], eax
.text:00401009 mov [esp+8+var_4], eax
.text:0040100D lea eax, [esp+8+var_8]
.text:00401011 push eax
.text:00401012 push offset aU ; "%u"
.text:00401017 call _scanf
.text:0040101C lea ecx, [esp+10h+var_4]
.text:00401020 push ecx
.text:00401021 push offset aU ; "%u"
.text:00401026 call _scanf
.text:0040102B mov ecx, [esp+18h+var_8]
.text:0040102F mov eax, 7
.text:00401034 mul ecx
.text:00401036 sub ecx, edx
.text:00401038 mov eax, 24924925h
.text:0040103D shr ecx, 1
.text:0040103F add ecx, edx
.text:00401041 shr ecx, 1Fh
.text:00401044 push ecx
.text:00401045 mov ecx, [esp+1Ch+var_4]
.text:00401049 mul ecx
.text:0040104B sub ecx, edx
.text:0040104D shr ecx, 1
.text:0040104F add ecx, edx
.text:00401051 shr ecx, 2
.text:00401054 push ecx
.text:00401055 push offset aDD ; "%d%d"
.text:0040105A call _printf
.text:0040105F push offset aPause ; "pause"
.text:00401064 call _system
.text:00401069 xor eax, eax
.text:0040106B add esp, 28h
.text:0040106E retn
.text:0040
2.1.2 核心代码反汇编还原
.text:00401000
.text:00401000
.text:00401000 ; int __cdecl main(int argc, const char **argv, const char **envp)
.text:00401000 _main proc near ; CODE XREF: start+AF↓p
.text:00401000
.text:00401000 var_8 = dword ptr -8
.text:00401000 var_4 = dword ptr -4
.text:00401000 argc = dword ptr 4
.text:00401000 argv = dword ptr 8
.text:00401000 envp = dword ptr 0Ch
.text:00401000
.text:00401003 xor eax, eax
.text:00401005 mov [esp+8+var_8], eax
.text:00401009 mov [esp+8+var_4], eax
核心位置 /-6
.text:0040102B mov ecx, [esp+18h+var_8]
.text:0040102F mov eax, 7
.text:00401034 mul ecx
.text:00401036 sub ecx, edx
.text:0040103D shr ecx, 1
.text:0040103F add ecx, edx
.text:00401041 shr ecx, 1Fh
.text:00401044 push ecx
核心位置/7
.text:00401038 mov eax, 24924925h
.text:00401045 mov ecx, [esp+1Ch+var_4]
.text:00401049 mul ecx
.text:0040104B sub ecx, edx
.text:0040104D shr ecx, 1
.text:0040104F add ecx, edx
.text:00401051 shr ecx, 2
.text:00401054 push ecx
.text:00401038 mov eax, 24924925h
.text:00401045 mov ecx, [esp+1Ch+var_4]
.text:00401049 mul ecx
.text:0040104B sub ecx, edx
.text:0040104D shr ecx, 1
.text:0040104F add ecx, edx
.text:00401051 shr ecx, 2
.text:00401054 push ecx
.text:00401038 mov eax, M
.text:00401045 mov ecx, 被除数
.text:00401049 mul ecx
.text:0040104B sub ecx, edx
.text:0040104D shr ecx, n
.text:0040104F add ecx, edx
.text:00401051 shr ecx, n
.text:00401054 push ecx
2.1.3 特殊汇编的除法原理
2.1.4 x86乘法特性与x64乘法特性
mov al,5h
mov bl,10h
mul bl //ax == 0050,CF = 0
.data
val1 WORD 2000h
val2 WORD 0l00h
.code
mov ax, val1 ; AX = 2000h
mul val2 ; DX:AX = 00200000h, CF = 1
mov eax, 12345h
mov ebx, 1000h
mul ebx ; EDX:EAX = 0000000012345000h, CF = 0
.data
multiplier QWORD 10h
.code
mov rax, OAABBBBCCCCDDDDh
mul multiplier ; RDX:RAX = 00000000000000000AABBBBCCCCDDDDOh
2.1.5 汇编等式还原
.text:00401038 mov eax, 24924925h
.text:00401045 mov ecx, [esp+1Ch+var_4]
.text:00401049 mul ecx
eax = M
ecx = 被除数
M * ecx 结果放在 edx:eax中
.text:0040104B sub ecx, edx
此条代码是让被除数 - M*ecx的高32位乘积.
等价于 ecx - (M * ecx)/2^32
.text:0040104D shr ecx, 1
然后整体又/2的一次方
(ecx - (M * ecx)/2^32)/2^1
.text:0040104F add ecx, edx
最后又加上乘积的高位
((ecx - (M * ecx)/2^32)/2) + (M * ecx)/2^32
.text:00401051 shr ecx, 2
最后整体又/2的2次方
(((ecx - (M * ecx)/2^32)/2) + (M * ecx)/2^32)/2^2
.text:00401054 push ecx
最后使用乘积高位
2^35 / (2^32 + 24924925h) === 6.99999 向上取整 = 7
2.2 特殊汇编M大于0x80000000的加调整
2.2.1 高级代码与反汇编
int main(int argc, char* argv[])
{
/*
除法
*/
int NumberOne = 0;
int NumberTwo = 0;
scanf("%u",&NumberOne);
scanf("%u",&NumberTwo);
int Count1 = NumberOne / 7;
printf("%d%d%d",Count1);
system("pause");
return 0;
}
.text:00401000 ; int __cdecl main(int argc, const char **argv, const char **envp)
.text:00401000 _main proc near ; CODE XREF: start+AF↓p
.text:00401000
.text:00401000 var_8 = dword ptr -8
.text:00401000 var_4 = dword ptr -4
.text:00401000 argc = dword ptr 4
.text:00401000 argv = dword ptr 8
.text:00401000 envp = dword ptr 0Ch
.text:00401000
.text:00401000 sub esp, 8
.text:00401003 xor eax, eax
.text:00401005 mov [esp+8+var_8], eax
.text:00401009 mov [esp+8+var_4], eax
.text:0040100D lea eax, [esp+8+var_8]
.text:00401011 push eax
.text:00401012 push offset aU ; "%u"
.text:00401017 call _scanf
.text:0040101C lea ecx, [esp+10h+var_4]
.text:00401020 push ecx
.text:00401021 push offset aU ; "%u"
.text:00401026 call _scanf
.text:0040102B mov ecx, [esp+18h+var_8]
.text:0040102F mov eax, 92492493h
.text:00401034 imul ecx
.text:00401036 add edx, ecx
.text:00401038 sar edx, 2
.text:0040103B mov eax, edx
.text:0040103D shr eax, 1Fh
.text:00401040 add edx, eax
.text:00401042 push edx
.text:00401043 push offset aDDD ; "%d%d%d"
.text:00401048 call _printf
.text:0040104D push offset aPause ; "pause"
.text:00401052 call _system
.text:00401057 xor eax, eax
.text:00401059 add esp, 24h
.text:0040105C retn
.text:0040105C _main endp
.text:0040102B mov ecx, [esp+18h+var_8]
.text:0040102F mov eax, 92492493h
.text:00401034 imul ecx
.text:00401036 add edx, ecx
.text:00401038 sar edx, 2
.text:0040103B mov eax, edx
.text:0040103D shr eax, 1Fh
.text:00401040 add edx, eax
.text:00401042 push edx
2.2.2 代码定式还原
2^34 / 2454267027 = 6.999... = 7
2.2.3代码优化原理
.text:0040102B mov ecx, [esp+18h+var_8]
.text:0040102F mov eax, 92492493h
.text:00401034 imul ecx
.text:00401036 add edx, ecx
.text:00401038 sar edx, 2
.text:0040103B mov eax, edx
.text:0040103D shr eax, 1Fh
.text:00401040 add edx, eax
.text:00401042 push edx
2.3 特殊汇编大于0x80000000无调整
2.3.1 高级代码与反汇编
int main(int argc, char* argv[])
{
/*
除法
*/
int NumberOne = 0;
int NumberTwo = 0;
scanf("%u",&NumberOne);
scanf("%u",&NumberTwo);
int Count1 = NumberOne / -5;
printf("%d",Count1);
system("pause");
return 0;
}
.text:0040102B mov ecx, [esp+18h+var_8]
.text:0040102F mov eax, 99999999h 大于0x8..没有进行调整
.text:00401034 imul ecx
.text:00401036 sar edx, 1
.text:00401038 mov eax, edx
.text:0040103A shr eax, 1Fh
.text:0040103D add edx, eax
.text:0040103F push edx
2.3.2 代码定式还原
2.3.3 除法原理还原
2.4 M小于0x80000000 的减调整
2.4.1高级代码与反汇编
int main(int argc, char* argv[])
{
/*
除法
*/
int NumberOne = 0;
int NumberTwo = 0;
scanf("%u",&NumberOne);
scanf("%u",&NumberTwo);
int Count1 = NumberOne / -7;
printf("%d",Count1);
system("pause");
return 0;
}
.text:0040102B mov ecx, [esp+18h+var_8]
.text:0040102F mov eax, 6DB6DB6Dh
.text:00401034 imul ecx
.text:00401036 sub edx, ecx 减调整
.text:00401038 sar edx, 2
.text:0040103B mov eax, edx
.text:0040103D shr eax, 1Fh
.text:00401040 add edx, eax
.text:00401042 push edx
2.4.2 代码公式还原
2^34 / (2^32 - 6DB6DB6Dh) = 6.99999...
2.4.3 除法优化原理
看雪ID:TkBinary
https://bbs.pediy.com/user-home-723188.htm
*本文由看雪论坛 TkBinary 原创,转载请注明来自看雪社区。
推荐文章++++
求分享
求点赞
求在看
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论