概述
有的反调试会检测23946端口是否占用,使用其他端口即可绕过此反调试。
可以使用./android_server -p12345指定端口,也可以使用IDA逆向,修改默认端口。
测试版本
IDA 7.0
patch
使用IDA打开android_server,搜索字符串Listening on,定位到引用位置。
按下F5反编译,重命名端口号变量。按下x,向上搜索找到赋值位置(可能有多处),patch即可。
附上偏移值:
1 | 0xAFE0 LDR R2, =23946 |
修改安卓内核源码,绕过对/proc/$pid/state的State和TracerPid字段,以及/proc/$pid/wchan的反调试检测
打开内核源码目录,/fs/proc下的base.c和array.c
最后一个else分支改成
1 | else |
因为/proc/pid/wchan 和 /proc/pid/task/pid/wchan在调试状态下,里面内容为ptrace_stop, 非调试的状态下为ep_poll
将4和8对应的字符("T (stopped)"和"t (tracing stop)")
都改成"S (sleeping)"
与前文(逆向修改安卓内核 x64 过TracerPID反调试)目的一致,置TracerPid为0
将参数tpid改为0即可
1 | seq_printf(m, |
使用调试器附加后,cd到/proc/$pid/,执行以下命令:head -8 statuscat wchan
得到一个pyc文件,在线反编译得到python源码。
1 | import base64 |
逻辑是将输入的字符串逐位与32异或,再加十六,转回ascii码。
在模板类中使用输出流重载发现报错,g++提示
warning: friend declaration ‘std::ostream& operator<<(std::ostream&, const A
&)’ declares a non-template function
note: (if this is not what you intended, make sure the function template has already been declared and add <> after the function name here)
增加<>后依旧报错,遂百度之,解决。
定义的友元函数还是一个模版,要实例化为参数变元后才能使用。也就是说,即使上面的友元看起来像函数定义,但是若没有经过参数化,编译器就不会生成该函数的代码
关于操作符的友元模版函数重载
个人理解是由于友元函数还没有给出声明(或者说是定义),编译器识别不出来。所以可以在类之前预先声明,而又因为该函数使用了类名,所以类名也要预先声明。
即在类定义前加上如下代码:
1 | template <typename T> class A; |
在类定义中给输出流重载函数加上<>:
1 | public: |
与其他友元函数定义类似:
1 | template <typename T> |
参考关于操作符的友元模版函数重载
直接修改类定义中的输出流重载函数为:
1 | public: |
重载函数定义不需要修改为T1(当然改也行)
1 | class A |
直接使用对应类型也是可以的,比如:
1 | map<string, void (A::*)()> zeroParmsFuns; |
不过为了方便起见,还是自定义类型吧
1 | typedef void (A::*func)(); |
使用迭代器来遍历map,funcName是函数名,对应map的key
1 | map<string, func>::iterator iter = zeroParmsFuns.find(funcName); |
中文字符串在编辑界面正常显示,编译生成的exe中文乱码。源文件编码为UTF-8,设置输出的可执行文件编码为GB2312后正常显示。
解决方案:添加编译参数-fexec-charset=GB2312
具体方法:
在tasks[args]中添加"-fexec-charset=GB2312"
在makefile中添加-fexec-charset=GB2312
比如上一篇博文中的makefile,则在CCOBJFLAG后添加该参数,变为
1 | CCOBJFLAG := $(CCFLAG) -c -fexec-charset=GB2312 |
发现makefile存在问题,仅会编译比main.cpp更新的依赖文件,导致每次都要make两次才能正常调试。已修改$?为$^
$@ –代表目标文件(target)
$^ –代表所有的依赖文件(components)
$< –代表第一个依赖文件(components中最左边的那个)
$? –代表比目标还要新的依赖文件列表
之前从知乎抄的配置只能编译单文件源文件,编译多文件的话需要手动修改g++编译参数(不能忍啊→_→),于是搜索之,找到解决方案。
关键词:makefile
原本使用VSCode就可以正常进行编译调试等操作。
已安装make工具并添加到环境变量,我自己用的是mingw32-make
(也可使用msys提供的工具包,度盘链接: https://pan.baidu.com/s/1zJBcS6tjfXlwg1kP6VnLSg 提取码: f9ya)
我基本是直接复制参考博文里的模板(修改标准库为17),内容如下
1 | # originating https://github.com/TheNetAdmin/Makefile-Templates |
src文件夹下放源文件以及头文件,后面还要需要修改.vscode中的task.json和launch.json
注意:如果使用本文中的makefle,包含主函数的源文件名必须为main.cpp
如果你使用的是msys的工具包,那command就写make
按快捷键Ctrl+Shift+B可以执行仅生成命令(build)
(在微软输入法中文模式时会出现表情窗口←_←)
1 | { |
1 |
|
enjoy it!
😉