





其他案例请查看,aes解码,密钥123456789,密文U2FsdGVkX1/Bd4k8ZAij4D8oMKFwS3bBvmalzk3NT7UEJTw7/qemqhDLwG4nl9H9/nO3Xk0Ebmv0W50P9akHkb0F2ubxR31a6lldXh/T1P5UbUFht0mf2SUJwAKMq1bg
x32dbg/x64dbg逆向之找main入口方式
1)寻找main的叙述
咱们各种调试器打开以后是不是乱起八糟的,内存居然跳到00B11217,00007FFE22359920 ,各种奇怪的地址,如果咱们需要定位到要调试的代码地方咱们应该怎么做呢?
咱们拿之前写的汇编和c语言在汇编中对比的一下有没有发现熟悉函数mainCRTStartup,咱们在汇编中每次讲解都是用这个函数作为程序入口。
IDA 交叉
Project1.exe!main() Line 8
Project1.exe!invoke_main() Line 79
Project1.exe!__scrt_common_main_seh() Line 288
Project1.exe!__scrt_common_main() Line 331
Project1.exe!mainCRTStartup(void *__formal) Line 17
kernel32.dll!00007fffa9b2e8d7()
ntdll.dll!00007fffaae6c48c()
咱们跟踪mainCRTStartup这个函数看下它做了什么事情。
#if defined _SCRT_STARTUP_MAIN
using main_policy = __scrt_main_policy;
using file_policy = __scrt_file_policy;
using argv_policy = __scrt_narrow_argv_policy;
using environment_policy = __scrt_narrow_environment_policy;
static int __cdecl invoke_main()
{
return main(__argc, __argv, _get_initial_narrow_environment());
}
2)字符串寻找
调试器cpu窗口右键-》搜索-》当前模块-》字符串,直接搜索界面文字,日志等特征字符串,双击跳转代码位置,快速定位关键逻辑。
3)调试版本(debug)找jmp.main
载入程序运行后,在 CPU 窗口右键-》搜索-》当前模块-》命令,输入jmp main搜索,直接定位到jmp main指令,下方就是 main 函数真实入口。
4)发布版本(Release)顶部寻找
无调试符号,载入后直接停在程序入口点,往上翻找函数起始特征(push ebp/mov ebp,esp),就是优化后的 main 函数。
5) main函数特点寻找
三个push一个call,无需跟踪程序流程,直接搜索 三个"push(x86)/mov(x64)"+call 的二进制特征码,匹配到后直接定位call的目标地址。
00B11217 | 57 | push edi | edi:&"ACSetupSvcPort=23210"
00B11218 | 56 | push esi | esi:&"C:\\Users\\Desktop\\r.exe"
00B11219 | FF30 | push dword ptr ds:[eax] | eax:_mbcasemap+3DC
00B1121B | E8 20FEFFFF | call <r._main> |
6) APi定位法
odbg或者x32/x64dbg Command 输入"bp MessageBoxW"或者"bp CreateWindowExW",根据咱们学习的堆栈原理,找到压入的Call地址,Follow Eip回去就好哈哈哈哈哈哈
7)IDA定位法
把需要分析的程序拖入IDA,左边找到main方法就行。
8)入口点回溯法(OEP→main)
OEP咱们到时候单独聊哦
9)特征码/签名扫描法
提取main函数固定汇编机器码做特征签名,在程序内全局扫描匹配,完全可以精准找到 main入口。(PEiD 0.95专门用特征码签名库,只用来识别加壳类型,编译器,程序语言,不能用来定位 main函数,它只查壳不找代码入口。x32/x64dbg特征码扫描用自定义函数头部汇编字节做特征,专门扫内存/文件定位main关键函数,是定位代码用的。)
x64db中cpu窗口,.text区域搜索-》当前模块-》特征/参数(Pattern)匹配输入48 83 EC 48就可以找到main入口了
通用万能 main特征
32位程序通用 main头:55 8B EC(push ebp mov ebp,esp)
64位程序通用 main头:48 83 EC
10)段属性分析定位法
核心逻辑:main 函数位于可执行的代码段(.text 段),通过筛选段属性缩小定位范围,再结合特征找入口。
操作步骤:
打开内存窗口分析段属性:
OD:点击"查看→内存";
x32/x64dbg:按Alt+M打开内存映射窗口。
定位.text 段:
在内存窗口中,筛选"属性"列显示为R/X(可读/可执行)的段,名称通常为.text(代码段);
记录该段的起始/结束地址(如00401000 - 00408000)。
缩小搜索范围:
在.text段范围内,鼠标右击Find refernces to region 搜索call <_main>
其他案例请查看,aes解码,密钥123456789,密文U2FsdGVkX1/Bd4k8ZAij4D8oMKFwS3bBvmalzk3NT7UEJTw7/qemqhDLwG4nl9H9/nO3Xk0Ebmv0W50P9akHkb0F2ubxR31a6lldXh/T1P5UbUFht0mf2SUJwAKMq1bg
x32dbg/x64dbg逆向之找main入口方式
1)寻找main的叙述
咱们各种调试器打开以后是不是乱起八糟的,内存居然跳到00B11217,00007FFE22359920 ,各种奇怪的地址,如果咱们需要定位到要调试的代码地方咱们应该怎么做呢?
咱们拿之前写的汇编和c语言在汇编中对比的一下有没有发现熟悉函数mainCRTStartup,咱们在汇编中每次讲解都是用这个函数作为程序入口。
IDA 交叉
Project1.exe!main() Line 8
Project1.exe!invoke_main() Line 79
Project1.exe!__scrt_common_main_seh() Line 288
Project1.exe!__scrt_common_main() Line 331
Project1.exe!mainCRTStartup(void *__formal) Line 17
kernel32.dll!00007fffa9b2e8d7()
ntdll.dll!00007fffaae6c48c()
咱们跟踪mainCRTStartup这个函数看下它做了什么事情。
#if defined _SCRT_STARTUP_MAIN
using main_policy = __scrt_main_policy;
using file_policy = __scrt_file_policy;
using argv_policy = __scrt_narrow_argv_policy;
using environment_policy = __scrt_narrow_environment_policy;
static int __cdecl invoke_main()
{
return main(__argc, __argv, _get_initial_narrow_environment());
}
2)字符串寻找
调试器cpu窗口右键-》搜索-》当前模块-》字符串,直接搜索界面文字,日志等特征字符串,双击跳转代码位置,快速定位关键逻辑。
3)调试版本(debug)找jmp.main
载入程序运行后,在 CPU 窗口右键-》搜索-》当前模块-》命令,输入jmp main搜索,直接定位到jmp main指令,下方就是 main 函数真实入口。
4)发布版本(Release)顶部寻找
无调试符号,载入后直接停在程序入口点,往上翻找函数起始特征(push ebp/mov ebp,esp),就是优化后的 main 函数。
5) main函数特点寻找
三个push一个call,无需跟踪程序流程,直接搜索 三个"push(x86)/mov(x64)"+call 的二进制特征码,匹配到后直接定位call的目标地址。
00B11217 | 57 | push edi | edi:&"ACSetupSvcPort=23210"
00B11218 | 56 | push esi | esi:&"C:\\Users\\Desktop\\r.exe"
00B11219 | FF30 | push dword ptr ds:[eax] | eax:_mbcasemap+3DC
00B1121B | E8 20FEFFFF | call <r._main> |
6) APi定位法
odbg或者x32/x64dbg Command 输入"bp MessageBoxW"或者"bp CreateWindowExW",根据咱们学习的堆栈原理,找到压入的Call地址,Follow Eip回去就好哈哈哈哈哈哈
7)IDA定位法
把需要分析的程序拖入IDA,左边找到main方法就行。
8)入口点回溯法(OEP→main)
OEP咱们到时候单独聊哦
9)特征码/签名扫描法
提取main函数固定汇编机器码做特征签名,在程序内全局扫描匹配,完全可以精准找到 main入口。(PEiD 0.95专门用特征码签名库,只用来识别加壳类型,编译器,程序语言,不能用来定位 main函数,它只查壳不找代码入口。x32/x64dbg特征码扫描用自定义函数头部汇编字节做特征,专门扫内存/文件定位main关键函数,是定位代码用的。)
x64db中cpu窗口,.text区域搜索-》当前模块-》特征/参数(Pattern)匹配输入48 83 EC 48就可以找到main入口了
通用万能 main特征
32位程序通用 main头:55 8B EC(push ebp mov ebp,esp)
64位程序通用 main头:48 83 EC
10)段属性分析定位法
核心逻辑:main 函数位于可执行的代码段(.text 段),通过筛选段属性缩小定位范围,再结合特征找入口。
操作步骤:
打开内存窗口分析段属性:
OD:点击"查看→内存";
x32/x64dbg:按Alt+M打开内存映射窗口。
定位.text 段:
在内存窗口中,筛选"属性"列显示为R/X(可读/可执行)的段,名称通常为.text(代码段);
记录该段的起始/结束地址(如00401000 - 00408000)。
缩小搜索范围:
在.text段范围内,鼠标右击Find refernces to region 搜索call <_main>
其他案例请查看,aes解码,密钥123456789,密文U2FsdGVkX1/Bd4k8ZAij4D8oMKFwS3bBvmalzk3NT7UEJTw7/qemqhDLwG4nl9H9/nO3Xk0Ebmv0W50P9akHkb0F2ubxR31a6lldXh/T1P5UbUFht0mf2SUJwAKMq1bg
其他案例请查看,aes解码,密钥123456789,密文U2FsdGVkX1/Bd4k8ZAij4D8oMKFwS3bBvmalzk3NT7UEJTw7/qemqhDLwG4nl9H9/nO3Xk0Ebmv0W50P9akHkb0F2ubxR31a6lldXh/T1P5UbUFht0mf2SUJwAKMq1bg
x32dbg/x64dbg逆向之找main入口方式
1)寻找main的叙述
咱们各种调试器打开以后是不是乱起八糟的,内存居然跳到00B11217,00007FFE22359920 ,各种奇怪的地址,如果咱们需要定位到要调试的代码地方咱们应该怎么做呢?
咱们拿之前写的汇编和c语言在汇编中对比的一下有没有发现熟悉函数mainCRTStartup,咱们在汇编中每次讲解都是用这个函数作为程序入口。
IDA 交叉
Project1.exe!main() Line 8
Project1.exe!invoke_main() Line 79
Project1.exe!__scrt_common_main_seh() Line 288
Project1.exe!__scrt_common_main() Line 331
Project1.exe!mainCRTStartup(void *__formal) Line 17
kernel32.dll!00007fffa9b2e8d7()
ntdll.dll!00007fffaae6c48c()
咱们跟踪mainCRTStartup这个函数看下它做了什么事情。
#if defined _SCRT_STARTUP_MAIN
using main_policy = __scrt_main_policy;
using file_policy = __scrt_file_policy;
using argv_policy = __scrt_narrow_argv_policy;
using environment_policy = __scrt_narrow_environment_policy;
static int __cdecl invoke_main()
{
return main(__argc, __argv, _get_initial_narrow_environment());
}
2)字符串寻找
调试器cpu窗口右键-》搜索-》当前模块-》字符串,直接搜索界面文字,日志等特征字符串,双击跳转代码位置,快速定位关键逻辑。
3)调试版本(debug)找jmp.main
载入程序运行后,在 CPU 窗口右键-》搜索-》当前模块-》命令,输入jmp main搜索,直接定位到jmp main指令,下方就是 main 函数真实入口。
4)发布版本(Release)顶部寻找
无调试符号,载入后直接停在程序入口点,往上翻找函数起始特征(push ebp/mov ebp,esp),就是优化后的 main 函数。
5) main函数特点寻找
三个push一个call,无需跟踪程序流程,直接搜索 三个"push(x86)/mov(x64)"+call 的二进制特征码,匹配到后直接定位call的目标地址。
00B11217 | 57 | push edi | edi:&"ACSetupSvcPort=23210"
00B11218 | 56 | push esi | esi:&"C:\\Users\\Desktop\\r.exe"
00B11219 | FF30 | push dword ptr ds:[eax] | eax:_mbcasemap+3DC
00B1121B | E8 20FEFFFF | call <r._main> |
6) APi定位法
odbg或者x32/x64dbg Command 输入"bp MessageBoxW"或者"bp CreateWindowExW",根据咱们学习的堆栈原理,找到压入的Call地址,Follow Eip回去就好哈哈哈哈哈哈
7)IDA定位法
把需要分析的程序拖入IDA,左边找到main方法就行。
8)入口点回溯法(OEP→main)
OEP咱们到时候单独聊哦
9)特征码/签名扫描法
提取main函数固定汇编机器码做特征签名,在程序内全局扫描匹配,完全可以精准找到 main入口。(PEiD 0.95专门用特征码签名库,只用来识别加壳类型,编译器,程序语言,不能用来定位 main函数,它只查壳不找代码入口。x32/x64dbg特征码扫描用自定义函数头部汇编字节做特征,专门扫内存/文件定位main关键函数,是定位代码用的。)
x64db中cpu窗口,.text区域搜索-》当前模块-》特征/参数(Pattern)匹配输入48 83 EC 48就可以找到main入口了
通用万能 main特征
32位程序通用 main头:55 8B EC(push ebp mov ebp,esp)
64位程序通用 main头:48 83 EC
10)段属性分析定位法
核心逻辑:main 函数位于可执行的代码段(.text 段),通过筛选段属性缩小定位范围,再结合特征找入口。
操作步骤:
打开内存窗口分析段属性:
OD:点击"查看→内存";
x32/x64dbg:按Alt+M打开内存映射窗口。
定位.text 段:
在内存窗口中,筛选"属性"列显示为R/X(可读/可执行)的段,名称通常为.text(代码段);
记录该段的起始/结束地址(如00401000 - 00408000)。
缩小搜索范围:
在.text段范围内,鼠标右击Find refernces to region 搜索call <_main>
其他案例请查看,aes解码,密钥123456789,密文U2FsdGVkX1/Bd4k8ZAij4D8oMKFwS3bBvmalzk3NT7UEJTw7/qemqhDLwG4nl9H9/nO3Xk0Ebmv0W50P9akHkb0F2ubxR31a6lldXh/T1P5UbUFht0mf2SUJwAKMq1bg
x32dbg/x64dbg逆向之找main入口方式
1)寻找main的叙述
咱们各种调试器打开以后是不是乱起八糟的,内存居然跳到00B11217,00007FFE22359920 ,各种奇怪的地址,如果咱们需要定位到要调试的代码地方咱们应该怎么做呢?
咱们拿之前写的汇编和c语言在汇编中对比的一下有没有发现熟悉函数mainCRTStartup,咱们在汇编中每次讲解都是用这个函数作为程序入口。
IDA 交叉
Project1.exe!main() Line 8
Project1.exe!invoke_main() Line 79
Project1.exe!__scrt_common_main_seh() Line 288
Project1.exe!__scrt_common_main() Line 331
Project1.exe!mainCRTStartup(void *__formal) Line 17
kernel32.dll!00007fffa9b2e8d7()
ntdll.dll!00007fffaae6c48c()
咱们跟踪mainCRTStartup这个函数看下它做了什么事情。
#if defined _SCRT_STARTUP_MAIN
using main_policy = __scrt_main_policy;
using file_policy = __scrt_file_policy;
using argv_policy = __scrt_narrow_argv_policy;
using environment_policy = __scrt_narrow_environment_policy;
static int __cdecl invoke_main()
{
return main(__argc, __argv, _get_initial_narrow_environment());
}
2)字符串寻找
调试器cpu窗口右键-》搜索-》当前模块-》字符串,直接搜索界面文字,日志等特征字符串,双击跳转代码位置,快速定位关键逻辑。
3)调试版本(debug)找jmp.main
载入程序运行后,在 CPU 窗口右键-》搜索-》当前模块-》命令,输入jmp main搜索,直接定位到jmp main指令,下方就是 main 函数真实入口。
4)发布版本(Release)顶部寻找
无调试符号,载入后直接停在程序入口点,往上翻找函数起始特征(push ebp/mov ebp,esp),就是优化后的 main 函数。
5) main函数特点寻找
三个push一个call,无需跟踪程序流程,直接搜索 三个"push(x86)/mov(x64)"+call 的二进制特征码,匹配到后直接定位call的目标地址。
00B11217 | 57 | push edi | edi:&"ACSetupSvcPort=23210"
00B11218 | 56 | push esi | esi:&"C:\\Users\\Desktop\\r.exe"
00B11219 | FF30 | push dword ptr ds:[eax] | eax:_mbcasemap+3DC
00B1121B | E8 20FEFFFF | call <r._main> |
6) APi定位法
odbg或者x32/x64dbg Command 输入"bp MessageBoxW"或者"bp CreateWindowExW",根据咱们学习的堆栈原理,找到压入的Call地址,Follow Eip回去就好哈哈哈哈哈哈
7)IDA定位法
把需要分析的程序拖入IDA,左边找到main方法就行。
8)入口点回溯法(OEP→main)
OEP咱们到时候单独聊哦
9)特征码/签名扫描法
提取main函数固定汇编机器码做特征签名,在程序内全局扫描匹配,完全可以精准找到 main入口。(PEiD 0.95专门用特征码签名库,只用来识别加壳类型,编译器,程序语言,不能用来定位 main函数,它只查壳不找代码入口。x32/x64dbg特征码扫描用自定义函数头部汇编字节做特征,专门扫内存/文件定位main关键函数,是定位代码用的。)
x64db中cpu窗口,.text区域搜索-》当前模块-》特征/参数(Pattern)匹配输入48 83 EC 48就可以找到main入口了
通用万能 main特征
32位程序通用 main头:55 8B EC(push ebp mov ebp,esp)
64位程序通用 main头:48 83 EC
10)段属性分析定位法
核心逻辑:main 函数位于可执行的代码段(.text 段),通过筛选段属性缩小定位范围,再结合特征找入口。
操作步骤:
打开内存窗口分析段属性:
OD:点击"查看→内存";
x32/x64dbg:按Alt+M打开内存映射窗口。
定位.text 段:
在内存窗口中,筛选"属性"列显示为R/X(可读/可执行)的段,名称通常为.text(代码段);
记录该段的起始/结束地址(如00401000 - 00408000)。
缩小搜索范围:
在.text段范围内,鼠标右击Find refernces to region 搜索call <_main>
其他案例请查看,aes解码,密钥123456789,密文U2FsdGVkX1/Bd4k8ZAij4D8oMKFwS3bBvmalzk3NT7UEJTw7/qemqhDLwG4nl9H9/nO3Xk0Ebmv0W50P9akHkb0F2ubxR31a6lldXh/T1P5UbUFht0mf2SUJwAKMq1bg

810

被折叠的 条评论
为什么被折叠?



