关于逆向工程:吾爱破解2024春节解题领红包活动喜迎新春

(图作者 | 吾爱破解@Aoemax) 前言K哥在这里,先祝各位小伙伴们新春快乐,财源广进,阖家幸福! 吾爱破解每年都有个解题领红包流动,往年也不例外,须要咱们使出看家逆向本事来剖析内容取得口令红包,依据难度等级不同会取得不同数量的吾爱币,流动继续到元宵节完结。流动一共有十个题,本文分享过年期间抽空做的几个题的相干思路。文章很早就写好了,不过遵循论坛的规定,提早至元宵节之后公布。 流动地址:https://www.52pojie.cn/thread-1889163-1-1.html Windows 高级间接应用 IDA 关上,先运行一次,轻易输出: Please input password:aaaError, please try again搜寻对应字符串: 次要逻辑就是上面局部,先判断长度是否等于 36,再逐字节判断 v10 != v9,那么间接动静调试: if ( v36 == 36 ){ sub_5B2490(&v27, Src); sub_5B1FE0(Block, -3, (char *)v27, v28); LOBYTE(v38) = 2; v9 = Block; v10 = v35; if ( v34 >= 0x10 ) v9 = (char **)Block[0]; if ( v6 >= 0x10 ) v10 = v7; if ( Block[4] != (char *)36 ) goto LABEL_19; v11 = 32; while ( 1 ) { v12 = *v10; if ( *v10 != *v9 ) break; ++v10; ++v9; v14 = v11 < 4; v11 -= 4; if ( v14 ) { v13 = 0; goto LABEL_18; } } 。。。。。。。。。。。。。。。。。。。。 LABEL_18: v18 = "Success"; if ( v13 ) LABEL_19: v18 = "Wrong,please try again."; 。。。。。。。。。。。。。。。。。。。。 sub_5BA6EE("Pause");}else{ v8 = sub_5B27D0(v5, "Error, please try again"); sub_5B2A80((int)v8); sub_5BA6EE("Pause");}if ( v10 != v9 ) 这里下个断点,输出 "a"×36,很显著是明文比照了: ...

February 27, 2024 · 6 min · jiezi

关于逆向工程:iOS逆向与安全利用IDAPython插件提高反汇编和逆向工程效率

前言IDA Python是一个用Python语言编写的插件,它为IDA Pro提供了可扩展性和自动化脚本反对。应用IDA Python,能够以更快、更简略的形式实现反汇编和逆向工程工作。 1、指标疾速理解和开始应用idapython。 2、开发环境和工具清单mac零碎IDA Pro7.0 3、罕用APIidaapi模块:该模块提供了许多外围的IDA API,包含: idaapi.get_func(ea):获取给定地址处的函数对象idaapi.get_segm_by_name(name):获取指定名称的段对象idaapi.get_screen_ea():获取以后屏幕上显示的地址idaapi.get_func_name(ea):获取给定地址处的函数名idaapi.get_name_ea_simple(name):获取具备给定名称的地址idaapi.asktext(defval, prompt):显示一个文本框,期待用户输出文本idaapi.get_func_offset(ea):获取指定地址绝对于函数起始地址的偏移量idaapi.get_segment_name(ea):获取指定地址所在的段名称idaapi.idc模块:该模块提供了一些旧版IDA API的Python封装,包含: idc.GetDisasm(ea):获取给定地址处的反汇编指令idc.Jump(ea):跳转到指定地址idc.SetColor(ea, what, color):设置给定地址的色彩idc.MakeCode(ea):将给定地址处的字节转换为指令idc.MakeName(ea, name):将给定地址处的符号名称更改为给定名称idc.get_inf_attr(idc.INF_MIN_EA):获取载入程序的最小的无效地址idc.get_inf_attr(idc.INF_MAX_EA):获取载入程序的最大的无效地址idc.print_insn_mnem(ea):获取给定地址处的助记符idc.prev_head(ea):获取给定地址的上一条指令的地址idc.print_operand(ea,index):获取给定地址中的操作数idc.PatchByte(ea, 0x90):批改给定地址的第一个字节idc.PatchWord(ea, 0x9090):批改给定地址的前两个字节idc.PatchDword(ea, 0x90909090):批改给定地址的前四个字节idc.PatchQword(ea,0x9090909090909090):批改给定地址的前八个字节idautils模块:该模块提供了一些罕用的IDA辅助函数,包含: idautils.Functions():返回以后程序中所有函数的迭代器idautils.Segments():返回以后程序中所有段的迭代器idautils.Strings():返回以后程序中所有字符串的迭代器idautils.XrefsFrom(ea):返回指向给定地址的所有穿插援用的迭代器idautils.Heads(ea,ea):获取指定地址段的汇编指令4、应用示例移除SVC指令:须要被移除的汇编指令如下: MOV X0, #0x1FMOV X1, #0MOV X2, #0MOV X3, #0MOV W16, #0x1ASVC 0x80idapython脚本如下: import idautilsimport idc# 获取二进制文件的起始地址和完结地址start_addr = idc.get_inf_attr(idc.INF_MIN_EA)end_addr = idc.get_inf_attr(idc.INF_MAX_EA)print("Start")# 遍历二进制文件中的所有指令for addr in idautils.Heads(start_addr, end_addr): # 判断以后指令是否为svc指令 mnem = idc.print_insn_mnem(addr) if mnem == "SVC": # 判断svc指令的前五行是否是mov指令 prev1_addr = idc.prev_head(addr) prev2_addr = idc.prev_head(prev1_addr) prev3_addr = idc.prev_head(prev2_addr) prev4_addr = idc.prev_head(prev3_addr) prev5_addr = idc.prev_head(prev4_addr) if ( idc.print_insn_mnem(prev1_addr) == "MOV" and idc.print_operand(prev1_addr, 0) == "W16" and idc.print_operand(prev1_addr, 1) == "#0x1A" and idc.print_insn_mnem(prev2_addr) == "MOV" and idc.print_operand(prev2_addr, 0) == "X3" and idc.print_operand(prev2_addr, 1) == "#0" and idc.print_insn_mnem(prev3_addr) == "MOV" and idc.print_operand(prev3_addr, 0) == "X2" and idc.print_operand(prev3_addr, 1) == "#0" and idc.print_insn_mnem(prev4_addr) == "MOV" and idc.print_operand(prev4_addr, 0) == "X1" and idc.print_operand(prev4_addr, 1) == "#0" and idc.print_insn_mnem(prev5_addr) == "MOV" and idc.print_operand(prev5_addr, 0) == "X0" and idc.print_operand(prev5_addr, 1) == "#0x1F" ): print '查找到一条MOV指令' # 将相干指令设为nop idc.PatchDword(addr, 0xd503201f) # nop idc.PatchDword(prev1_addr, 0xd503201f) # nop idc.PatchDword(prev2_addr, 0xd503201f) # nop idc.PatchDword(prev3_addr, 0xd503201f) # nop idc.PatchDword(prev4_addr, 0xd503201f) # nop idc.PatchDword(prev5_addr, 0xd503201f) # nopprint("End")执行前:按下图操作执行上边的脚本 ...

March 27, 2023 · 1 min · jiezi

关于逆向工程:fridarpc实现某一短视频刷邀请

指标APP:某一短视频 之前发过一篇文章,app降级算法之后还没来得及更新,文章就被举报404了,悲痛,明天更新写一下新版,这里就不贴源码了,文章最初放github,须要自取,我看老六还怎么举报。工具筹备HTTP Debugger Professional v9.11雷电模拟器9绿色去广告版算法助手(通用hook插件)用到的工具及配置好的雷电模拟器零碎备份在release页面下载 PS. 间接应用备份的零碎,环境都配置好了,关上frida转发端口就能用。 自行配置步骤:模拟器设置system可写并开启root,用MagiskDelta刷面具,删除自带的su文件,刷入LSPosed,装置算法助手插件,用FridaHooker装置Frida。算法助手中关上总开关和算法剖析的3个开关,开启Frida,通过adb转发端口,关上HTTP Debugger Pro抓包(需装置证书到零碎分区) 剖析过程工具都配置好后,关上指标APP,直到胜利绑定邀请码。(我测试过程中装完证书间接就能够失常抓包,说抓不到的能够试试在算法助手里关上JustTrustMe) 返回算法助手查看,发现没有aes加密,居然和以前加密形式不同了 不过回算法助手能够看到sign还是有的,仍然是老办法,sha256+md5 apk拖到GDA中,定位到算法助手中sign的调用堆栈地位,很容易发现加密点 按x查看穿插援用,最终定位到了sojm.so package com.qq.lib.EncryptUtil;import java.lang.System;import java.lang.String;import java.lang.Object;public class EncryptUtil // [email protected]{ static { System.loadLibrary("sojm"); } public void EncryptUtil(){ super(); } public static native String decrypt(String p0,String p1); public static native String decryptHls(String p0,String p1); public static native byte[] decryptImg(byte[] p0,int p1,String p2); public static native byte[] decryptImg2(byte[] p0,int p1,String p2); public static native String encrypt(String p0,String p1);}因为不会剖析so,尝试一番后无果,且模拟器frida无奈hook到第三方APP的so,手上又没有真机,遂放弃 ...

November 4, 2022 · 1 min · jiezi

关于逆向工程:反向VB6的c2exe的start函数

反向c2.exe的start函数C2.exe是vb6编译器的一部分,其应用VC6编写(通过DIE查问),对于抉择编译为齐全的P-Code时,间接调用C2.exe编译后应用link.exe链接。而后对于编译成native code的选项时,会先通过vb6.exe解决,生成两头语言。 这是笔者第一次逆向软件,没有教训,只能时刻查问教材,其次要是《加密与解密第3版》、《加密与解密第4版》、《反编译技术与软件逆向剖析第1版》、《IDA Pro权威指南(第2版)》、《C++反汇编与逆向剖析技术揭秘 第一版 钱林松 》和MSDN。 为了缩小工作量而简直不配图,故本文可能比拟难读懂。浏览本文须要汇编语言、C\C++的根底知,只管笔者本人就是初学者。等笔者纯熟逆向之后会出一系列视频,精密地解说逆向这个软件的所有我所能用语言表白的内容。 用IDA加载本文件后按F5反编译,失去的后果和钱林松书上所述的大不一样,所以我认为启动函数是另外写的。起初感觉,把几个要害的函数名去运行时源代码1的内容里搜搜看。后果真的有,而且函数运行的程序也是一样的,这就轻松了,尽管不须要逆向Start函数,间接看main函数即可,然而我仍然很好奇start做了什么。不过,我仍然不晓得是什么时候采纳crtexe.c的内容作为启动函数。 实现的代码: void __noreturn start(){ char **argv; // [esp+10h] [ebp-2Ch] BYREF int startinfo; // [esp+14h] [ebp-28h] BYREF typedef struct // { // int newmode; // } _startupinfo; int mainret; // [esp+18h] [ebp-24h] char **envp; // [esp+1Ch] [ebp-20h] BYREF int argc; // [esp+20h] [ebp-1Ch] BYREF CPPEH_RECORD ms_exc; // [esp+24h] [ebp-18h] ms_exc.registration.TryLevel = 0; _set_app_type(_crt_console_app); dword_107ABD78 = -1; dword_107ABD7C = -1; *_p__fmode() = _fmode; *_p__commode() = _commode; dword_107ABD80 = adjust_fdiv; nullsub_14(); if ( !__defaultmatherr ) _setusermatherr((_UserMathErrorFunctionPointer)UserMathErrorFunction); _setdefaultprecision(); initterm(&First, &Last); startinfo = newmode; _getmainargs(&argc, &argv, &envp, dowildcard, &startinfo); initterm(&dword_107A3000, &dword_107A3004); *(_DWORD *)_p___initenv() = envp; mainret = main(argc, (const char **)argv, (const char **)envp); exit(mainret);} VC6提供了C runtimelibrary (CRT) 的源代码,地位于“安装包\VC98\CRT\SRC”。 ↩

October 29, 2022 · 1 min · jiezi

关于逆向工程:PSX反向工程所需要的工具和资源

PSX反向工程所须要的工具和资源以下是用于剖析、批改或翻译PlayStation游戏的工具和文档列表。很多软件在Linux中能够通过apt之类的包管理器不便地取得。 PSX文件格式转换工具jPSXdec 音视频转换器,可从光盘镜像中提取PSX文件格式并建设文件地位索引,并转换XA、STR、TIM文件。 psxsdk 用于创立PlayStation游戏的非官方SDK。包含PSX格局(ISO/BIN、WAV/VAG.TIM/BMP)的一些转换工具的源代码。 CD-ROM toolsPSXImager 三个工具:psxrip(从BIN/CUE提取文件和光盘元数据)、psxbuild(创立光盘镜像)和psxinject(批改光盘镜像)。但作者只提供了源代码,并且解决某些镜像有艰难。 AcetoneISO 用于挂载、提取和刻录单轨ISO和BIN的Linux工具。 PowerISO 商用Windows/Linux光盘制作工具。 ccd2iso 转换IMG到ISO的Linux工具。 iat 将各种格局转换为ISO的Linux工具。 bchunk Linux工具,能够转换BIN/CUE到ISO、音乐CD到WAV。反对PSX 2336字节块跟踪。 isoinfo 列出ISO文件内容的Linux工具。 binmerge Python脚本,将多轨道BIN/CUE合并为一个。 反汇编器和反编译器Ghidra 美国国家安全局(NSA)的反汇编/反编译程序,于2019年向公众公布。ghidra_psx_ldr Ghidra的PSX剖析插件。 Radare2 收费、开源的反汇编工具。 IDA Pro 商用反编译器。收费版本然而只反对x64/64且不反对MIPS(PSX)。 This Dust Remembers What It Once Was 辅助Ghidra剖析PSX的工具。能够将PSX-EXE转换为ELF,并对Psy Q的.sym调试符号文件进行句法分析。 仿真器和调试器Mednafen 自带弱小调试器的仿真器。 No$psx PSX仿真器和调试器。 ePSXe PSX仿真器。 文档Nocash PSX Specifications(收费的PSX技术规范) No$psx的作者写的PSX零碎技术文档。 Everything You Have Always Wanted to Know about the Playstation But Were Afraid to Ask v1.1 2000开始编写的,对于PSX硬件信息的文档,(原版). Introduction to Hacking the Sony Playstation One ...

October 24, 2022 · 1 min · jiezi

关于逆向工程:SE-处理程序安装是什么意思

00520CB0 . 6A FF PUSH -100520CB2 . 68 E9D85F00 PUSH 005FD8E9 ; SE 处理程序装置00520CB7 . 64:A1 0000000>MOV EAX, FS:[0]00520CBD . 50 PUSH EAX00520CBE . 64:8925 00000>MOV FS:[0], ESP00520CC5 . 83EC 0C SUB ESP, 0C00520CC8 . 56 PUSH ESI00520CC9 . 8D4424 04 LEA EAX, [ESP+4]00520CCD . 8BF1 MOV ESI, ECX00520CCF . 50 PUSH EAX00520CD0 . 8D4C24 0C LEA ECX, [ESP+C]00520CD4 . 51 PUSH ECX00520CD5 . C74424 10 000>MOV DWORD PTR [ESP+10], 000520CDD . C74424 0C 000>MOV DWORD PTR [ESP+C], 0 ...

August 29, 2022 · 1 min · jiezi

关于逆向工程:极验深知验证分析

案例地址:geetest.com/Register案例内容:剖析极验登录时深知检测V2提交的Request Payload信息。 文章内容仅作学习参考,如有侵权请分割作者进行删除 接口分析POST申请 加密Payload: 参数定位长话短说,通过XHR断点。 往回走5步就能够看到参数生成的地位。 依据调试信息和接口中的值比照,发现e = DWYi[ymDv(1137)](l)是payload的其中一部分。 持续调试,发现代码:e + h[AUJ_(1173)] 联合调试信息得出结论:payload = DWYi[ymDv(1137)](l) + h[AUJ_(1173)] h[AUJ_(1173)]经测试,h是动静的,其中的aeskey和rsa的值不固定。再次剖析源码,可知 h = o[AUJ_(1156)]() 持续调试,AUJ_(1156) = 'LpFU'双击点进去,找到对应的办法。 把这个文件内容在 Lxtools 中解混同一下,变量名还原。 复制到本地格式化后的整体代码构造如下:发现都是自执行的办法,手动解决后能够改成如下所示: 而后依据报错把环境补上,比方呈现的这些 补完之后再次运行,会返回MlHc。 而后批改下代码,让其返回 LkEB['prototype'].LpFU()。 运行测试,胜利打印了 o[AUJ_(1156)](),从中提出rsa参数即可。 DWYi[ymDv(1137)](l)先查看各项含意,其中 l 是EbF_[ymDv(409)](e, h[ymDv(1194)]),调用办法为DWYi['tc_t'] 先看 l可知此处的 aeskey 是从咱们第一段剖析剖析的 o[AUJ_(1156)]() 对象中提取的。 此处的e 中包含了操作id、行为轨迹,以及未知参数。 EbF_[ymDv(409)]是对应的encrypt加密办法。在本地中可看到由JOOO返回,JOOO在EbF_中。那能够间接应用 EbF_.encrypt()来调用加密办法。即:EbF_.encrypt(e, h[ymDv(1194)]) 本地调用,胜利生成 l 。 调用tc_t有了l 之后,咱们在补的JS中间接调用DWYi.tc_t(l) 即可。 总体流程: // 注册 _asekey_rsa _asekey_rsa = LkEB['prototype'].LpFU()rsa = _asekey_rsa.rsaaeskey = _asekey_rsa.aeskey// 生成 lvar l = EbF_.encrypt(e,aeskey)// 加密后拼接return DWYi.tc_t(l)+rsa打印后果: ...

August 2, 2022 · 1 min · jiezi

关于逆向工程:快手滑块验证码分析

老文章: 《快手滑块验证码剖析 2021-10-21》 从新看了一遍流程,发现官网有一些更新。 当初双验证接口,别离是 /rest/zt/captcha/sliding/kSecretApiVerify 和 /rest/zt/captcha/sliding/verify 不过这俩接口是独立校验的,二者目前没有关联关系。(无论过了哪一个API的校验,都能够应用) 本文次要说一下新的验证接口 kSecretApiVerify 。 kSecretApiVerifykSecretApiVerify 近期是新加的,参数是verifyParam。如何断点不再具体介绍,大家能够参考老文章。c.a[i("0x31")](r) 的值是验证接口中,加密前的verifyParam。 c.a[i("0x31")] 等同于 urlencode。 能够在控制台输入 r 。 通过剖析,这几个参数含意如下: captchaSn 滑块验证码信息bgPicWidth 原背景图 WidthbgPicHeight 原背景图 HeightcutPicWidth 原滑块图 WidthcutPicHeight 原滑块图 HeightcaptchaExtraParam 浏览器指纹信息gpuInfo 浏览器GPU信息trajectory 滑动轨迹relativeX 滑块X轴拖动间隔relativeY 滑块Y轴高度captchaSn 、bgPicWidth、bgPicHeight、cutPicWidth、cutPicHeight 是依据 captchaSession 获取的验证码配置信息。获取接口是 /rest/zt/captcha/sliding/config captchaExtraParam 、gpuInfo 能够设为定值 relativeY 在配置信息中有,relativeX 须要自行计算。 trajectory 咱们解决时须要由拖动间隔生成。 trajectory有行为检测,代码生成的匀速轨迹并不能通过校验,手动去复制吧。 verifyParamkSecretApiVerify接口提交的参数是加密的,也就是说须要对明文的verifyParam加密。还是断点后往下调试就行,具体步骤我就不贴了。总之,加密是先 o = l(a) ,再 d(x) , 不过须要留神 d(o) 是Promise 类型。 l 比较简单,d 是一段加密。再具体就本人点进去看吧。点进去,发现新大陆了。加密在这个文件,拿进去本人测吧。 Verify验证胜利会返回 captchaToken。 个别验证参数谬误,轨迹谬误,返回350014 。 整体流程 --- ...

March 19, 2022 · 1 min · jiezi

关于逆向工程:FridaHook环境搭建

1.Hook能够用来做什么能够用来判断app执行某个操作的时候,是否通过咱们的狐疑的这个函数能够用来批改被hook函数的运行逻辑能够用来在运行过程中,获取被hook的函数传入的具体的参数和返回值能够用来被动调用app中的某些函数2. Python3.8 64bit的下载和装置https://www.python.org/downlo...3.8 64bit的任意一个版本都行,不必管最初的小版本 3. Python虚拟环境的装置装置virtualenvwrapper pip install virtualenvwrap per-win创立虚拟环境 mkvirtualenv --python=D:\soft\python386\python.exe xiaojianbang配置虚拟环境变量 WORKON_HOME 这个环境变量用来指定虚拟环境默认保留目录进入虚拟环境 workon xiaojianbang4.frida版本、Android零碎版本与Python版本frida12.3.6Android5-6Python3.7frida12.8.0Android7-8Python3.8frida14+Android9+Python3.85.frida的装置pip install fridapip install frida-tools(装frida-tools时会主动装置frida)在 virtualenvwrapper 的虚拟环境中装置frida,在以下门路会产生whl包,可用于当前离线装置该版本frida。用venv虚拟环境,并未产生该whl 包。 c:\users\administrator\appdata\local\pip\cache\wheels......6.如何判断frida是否装置胜利cmd中执行frida --version,能打印出版本号阐明frida-tools没有问题cmd中执行python,进入控制台import frida,能胜利导包,阐明frida库没有问题7.frida的卸载pip uninstall fridapip uninstall frida-tools8.whl包的离线装置pip install frida-14.2.18-cp38-cp38-win_amd64.whlpip install frida_tools-9.2.5-py3-none-any.whl9.frida装置指定版本因为 frida-tools 的一个版本对应对个frida 版本,主动装置的frida版本不可控。因而先装置frida。 先装置指定版本frida再装置指定版本frida-toolsfrida-tools版本的查看 https://github.com/frida/frida/releaseshttps://github.com/frida/frida/releases/tag/12.3.610.frida代码提醒的配置npm i @types/frida-gum

January 16, 2022 · 1 min · jiezi

关于逆向工程:JS-逆向-03

hook eval && bypass native code checkreturn "function eval() { [native code] }" 经典hook var a=eval+""var _eval=evaleval=function(arg){ console.log(arg) return _eval(arg)}eval.toString=function(){return "function eval() { [native code] }"}var _old=Function.prototype.toString.call;console.log(_old);Function.prototype.toString.call=function(arg){ if(arg==eval){ return "function eval() { [native code] }" } return _old.call(this,arg);}// console.log(Function.prototype.toString.call(eval))console.log(Function.prototype.toString.call(RegExp))

December 15, 2021 · 1 min · jiezi

关于逆向工程:JS逆向-02

转载自:https://evilrecluse.top/post/...前置常识:Https-TLS相干 在线测试JA3: https://ja3er.com/jsongithub页:https://github.com/salesforce...老外的领导:https://github.com/yolossn/JA... 信息JA3特征值是依据TLS的Client Hello 报文生成的,对于同一台主机对服务器的拜访而言,这个值会保持一致相似的,JA3S的特征值是依据TLS的Server Hello 报文生成的,对于同一台服务器对同一台主机的响应而言,这个值会保持一致 利用的策略绝对简略服务器能够利用 JA3值 用来标识客户端客户端能够利用 JA3S值 用来标识服务器 利用同主机 JA3值 不变的特点来限度并发拜访利用同 服务器&主机 JA3S值不变的特点,避免浸透/坑骗 流程获取数据关上wireshark,捕捉数据包拜访 在线测试JA3,失去测试值 { "ja3_hash":"b32309a26951912be7dba376398abc3b", "ja3":"771,4865-4866-4867-49195-49199-49196-49200-52393-52392-49171-49172-156-157-47-53,0-23-65281-10-11-35-16-5-13-18-51-45-43-27-21,29-23-24,0", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36"}这里会拿到两个值 JA3 和 JA3_Hash JA3 收集 Client Hello 报文 特色信息第一次握手中,客户端会发送Client Hello 报文 JA3 会收集 Client Hello 报文的以下字段的十进制字节值 TLS版本加密组件扩大类型列表反对组椭圆曲线明码格局VersionCipherSuitesType List of ExtensionsSupported GroupElliptic Curve Formats将这些值串联在一起。同一字段中的各值用-来分隔,不同字段用,来分隔最终组合成 JA3 值:771,4865-4866-4867-49195-49199-49196-49200-52393-52392-49171-49172-156-157-47-53,0-23-65281-10-11-35-16-5-13-18-51-45-43-27-21,29-23-24,0与在测试网页上获取的信息统一 JA3S MD5-Hash-32 收集 Server Hello 报文 信息第二次握手中,客户端会发送Server Hello 报文和第一步相似JA3 会收集 Server Hello 报文的以下字段的十进制字节值 ...

December 14, 2021 · 1 min · jiezi

关于逆向工程:JS逆向-01

js分辨是nodejs运行还是web运行的一个小技巧 在这里Sa.wc为undefined 而在浏览器中 会返回true 这个在很多进攻中都有 比方阿里的滑块 特色就是在浏览器的devtools的console选项卡外面会呈现一条没有任何内容的输入 网上很多解释是用于判断是否开启的devtools,这个在老版本的chrome是有可能的,然而当初只有是浏览器运行的应该都是true

December 14, 2021 · 1 min · jiezi

关于逆向工程:LINUX下可执行文件逆向分析基础

一、概述在如下示例程序print_banner中,调用了glibc动静库中的函数printf,在编译和链接阶段,链接器无奈晓得过程运行起来之后printf函数的加载地址,所以示例中call printf的地址只有在过程运行起来当前能力确定。 080483cc <print_banner>: 80483cc: push %ebp 80483cd: mov %esp, %ebp 80483cf: sub $0x8, %esp 80483d2: sub $0xc, %esp 80483d5: push $0x80484a8 80483da: call **<printf函数的地址>** 80483df: add $0x10, %esp 80483e2: nop 80483e3: leave 80483e4: ret那么过程运行起来之后,glibc动静库也装载了,printf函数地址也确定了,上述call指令中的地址是如何取得的呢。call地址次要是在运行时/链接时进行重定位。运行时重定位和链接时重定位相干常识见背景常识模块。 背景常识1、古代操作系统不容许批改代码段,只能批改数据段2、编译阶段和运行阶段汇编的变动参考文档:https://blog.csdn.net/linyt/a...编译阶段是将.c源码翻译成汇编指令的中间件.o查看应用objdump -d test.o ,能够看到printf的地址临时应用fc ff ff ff代替,这个地址在链接/运行时会进行修改。 00000000 <print_banner>: 0: 55 push %ebp 1: 89 e5 mov %esp, %ebp 3: 83 ec 08 sub $0x8, %esp 6: c7 04 24 00 00 00 00 movl $0x0, (%esp) d: e8 fc ff ff ff call e <print_banner+0xe> 12: c9 leave 13: c3 ret链接阶段是将一个或多个两头文件(.o)通过链接器链接成一个可执行文件,链接次要实现 ...

December 7, 2021 · 1 min · jiezi

关于逆向工程:iOS逆向技巧之HOOK

目前的几种hook形式:1.通过oc的runtime形式去hook,这个仅限于oc办法的hook,有局限性.2.通过monkeydev 的logs形式进行hook,这个是monkeydev在oc的runtime形式封装成工具模式,也仅限于oc办法的hook.3.通过monkeydev的substrate能够hook地址,地址查找可通过IDA查看,长处:1.利用范畴比拟广,能够hook c 、c++、swift、oc等等办法毛病:1.这个有局限性,只有越狱机才能够hook地址4.通过hookzz即github上的dobby库hook地址长处:1.利用范畴比拟广,能够hook c 、c++、swift、oc等等办法长处:2.能够在非越狱机上hook胜利毛病:1.只能在debug环境能力hook胜利(这个小毛病也不算毛病了,平时调试也是Debug)

December 1, 2021 · 1 min · jiezi

关于逆向工程:抖音signature

抖音网页版官网凋谢了,不同于之前的分享页,内容还是比拟丰盛的。文中是调试逻辑、文末有源码链接不同接口所需环境不同,(点关、搜视频不可用、其余均可应用)任何可操作性的内容与本文无关文章内容仅供参考学习,如有侵权请分割作者进行删除 1、Js堆栈调试 接口中的加密参数目前只有_signature。 XHR中抉择堆栈调试 轻易找一个进去断点,通常先进第一个xmlhttpRequetssend。 n[1]中有 _signaturen = this.openArgs this.openArgs = arguments,察看url 打印o ,o中有_signature这里会检测鼠标状态,鼠标挪动则触发到debug 我通过滚轮触发申请后再调试 具体内容返回查看 https://blog.csdn.net/weixin_... 采集评论示例:

July 11, 2021 · 1 min · jiezi

关于逆向工程:iOS-之逆向学习-之root-app

如何创立一个rootapp1.先装置iosOpendev,详见(iOS之逆向学习之 iOSOpendev装置)2.创立一个原生app工程3.点击+号 Add User-defined settings,增加iOSOpenDev配置项,最次要的是增加CODE_SIGNING_ALLOWED为NO,敞开签名4.

June 11, 2021 · 1 min · jiezi

关于逆向工程:iOS-之逆向学习-iOSOpendev安装

最近在搞一个iOS root app,遇到的坑也比拟多,root app须要提权,须要用到iOSOpendev工具包1.先装置iOSOpendev,下载地址:http://iosopendev.com/download/ 这玩意很久没有更新了,下载最新版本1.6.2版本,失去iOSOpenDev-1.6-2.pkg,双击装置.等差不多十几分钟会提醒装置失败,这里就须要手动装置了. 装置those工具(如果有装置过monkeydev,这一步能够省略),关上终端,配置theos的环境变量,官网默认是/opt/theosexport THEOS=/opt/theos下载兼容iosopendev的版本 git clone -b stableversion https://github.com/haorenqq/theos/ $THEOS3.设置Specifications文件夹传送门->详见 https://blog.upx8.com/2101 中的传送门->相干文件下载外面应该有8个文件, iPhoneOS结尾的四个文件放到/应用程序/Xcode/Content/Developer/Platforms/IphoneOS.platform/Developer/Library/Xcode/Specifications文件夹下(如果没有,请本人创立一个), iPhone Simulator 结尾的另外四个文件放入/应用程序/Xcode/Content/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/Xcode/Specifications文件夹下(如果没有,请同样创立一个)。 另外在/应用程序/Xcode/Content/Developer/Platforms/iPhoneSimulator.platform/Developer/文件夹下创立usr文件夹,usr文件夹下再创立一个名为bin的文件夹4.装置iOSOpenDev之前装置失败,能力进入这个手动装置环节,请持续以下步骤! cd /opt/iOSOpenDevSetup/binsudo ./iod-setup base指定最新xcode sdk:sudo ./iod-setup sdk -sdk iphoneos功败垂成,启动xcode,新建工程,就能够看到iOSOpenDev了.多个xcode能够共享一个iOSOpendev

June 11, 2021 · 1 min · jiezi

关于逆向工程:记一次某加速器APP算法解密实现刷邀请

0x00 工具筹备Fiddler(代理抓包)Xposed(hook框架) Inspeckage(通用hook插件)CryptoFucker/算法助手(常见加密算法hook插件,用处同上)反射巨匠(APP脱壳插件)HEX编码转换/数据加解密工具(测试加解密与后果对照)MT管理器/NP管理器(脱壳后dex修复)GDA(反编译工具)工具打包下载:https://lanzoui.com/b0eknupng 明码:4vpf各工具应用办法介绍等具体内容可参考各自文档或。0x01 发现问题指标APP:蚂蚁加速器(不提供下载) 因为指标APP没有公开下载渠道,接口域名也无奈间接拜访,所以全文未打码。关上Fiddler,模拟器中设置好代理,装置证书,关上APP,具体步骤自行百度。 Fiddler中能够看到,所有申请接口发送的数据都是差不多的,看不出发送和返回的数据是什么内容,这次的指标就是将其转为可读的明文,也就是其中的data和sign参数生成、返回数据的解密。 0x02 用hook插件简略剖析需提前装置Xposed框架。 对简略的APP,如果只用了很罕用的规范加密算法(如明文字符串拼接后取MD5、应用明文key进行对称加密),那只有用Inspeckage、CryptoFucker或算法助手其中一个就能够解决了,这三个工具都是用来hook罕用加密算法的,如SHA、MD5、AES、DES等,详见各自文档。 三个工具大同小异,本次测试过程中发现的优缺点如下: Inspeckage 长处各参数会base64编码,不会导致显示乱码。性能很多,加密hook只是其中之一。 毛病应用办法比其余两个麻烦一点。AES的IV参数有时候会漏掉。有时不显示加密模式。sha-256字符串显示谬误。CryptoFucker 长处会显示HEX编码和解码后内容,不会导致只显示乱码。加密模式全副能显示。开源,能够本人批改源码。 毛病所有加解密都放在同一个文件,看着很乱。AES的IV参数有时候会漏掉。算法助手 长处AES的IV参数不会漏掉,加密模式全副能显示。加解密参数一一对应,浏览不便。 毛病参数显示乱码。多个工具能够同时开启。配置好一个或多个hook插件后,关上指标APP,随便切换两个界面后,能够在查看各工具后果。本次测试以算法助手和Inspeckage为例。 从Inspeckage的Crypto后果中一部分json内容能够确定加密算法是AES,key是tJb4MRKOT+HeM/S3osRuDdR3JSSkgm/kSG/MB+PiuH8=(base64编码),没有拿到iv,解密模式是AES/CFB/NoPadding,加密模式应该是一样的。从Inspeckage的Hash后果中能够看到sign的生成是SHA-256后再取MD5,然而在测试SHA-256加密时后果对不上,暂放。 从算法助手后果中能够看到hook到多种类型加密,点进AES,能够看到key和iv都是乱码,也就是说这两个参数都是不可见字符,不过能够确定加密模式是AES/CFB/NoPadding。 如果是简略点的APP(像后面说的,明文字符串拼接后取MD5、应用明文key进行对称加密),这个时候可能就完结了,间接拿到明文key、iv以及MD5拼接字符串模板,间接去写代码就完事了。 0x03 脱壳下面用hook插件失去的后果: 申请data加密和返回数据解密模式为AES/CFB/NoPadding。key是tJb4MRKOT+HeM/S3osRuDdR3JSSkgm/kSG/MB+PiuH8=(base64编码,可转为HEX编码)。sign生成是SHA-256后再取MD5,然而SHA-256后果对不上。因为没有拿到iv、SHA-256后果对不上,此时须要进一步反编译剖析。 GDA是一个国产收费安卓反编译工具,只有一个几兆的可执行文件,不必配置环境,反编译速度极快,性能比拟弱小,整体应用体验较好。这里没有抉择一些老牌反编译工具,只用GDA就够了。 间接用GDA关上APK,发现提醒有360加固,须要脱壳。 GDA中也有拖dex的性能,不过没弄明确怎么用,所以还是用反射巨匠来无脑拖dex(步骤:Xposed启用模块/反射巨匠内抉择指标APP并关上/点击六芒星图标/点击以后Activity/长按写出DEX)。 此时拿到两个dex,第一个文件比拟大,第二个很小,尝试用GDA关上,发现第一个dex无奈反编译,而第二个dex内搜不到什么有用信息,所以要用MT管理器或NP管理器修复第一个dex,再用GDA关上。 0x04 用GDA反编译剖析GDA应用比拟不便,上方一排工具栏很明确,还有快捷键清单,上手教程见https://zhuanlan.zhihu.com/p/...。 因为后面确定了加密模式为AES/CFB/NoPadding,所以GDA反编译实现后,间接全局搜寻(快捷键S)字符串AES/CFB/NoPadding或CFB来定位加密点(也可搜其余字符串/类名/办法名/变量名,个别从申请接口中来寻找搜寻的字符串,能够多尝试)。 搜寻后果只有两个,双击进入,发现没有混同,应该比较简单。这里间接定位到了加密、解密的办法中,左侧看办法列表,能够大抵确定算法就是这个了。 先略微读一下Java代码,不会的函数就百度,弄懂这几句还是比较简单的。 public static String decrypt(String p0,String p1){ // p0是明文key,p1是返回数据包的16进制字符串data值(穿插援用查看) String str = "UTF-8"; byte[] obyteArray = null; try{ // 待解密data值16进制字符串转字节数组 byte[] bhex2byte = Cfb_256crypt.hex2byte(p1); // 初始化实例,加密模式为"AES/CFB/NoPadding" Cipher cInstance = Cipher.getInstance("AES/CFB/NoPadding"); // AES实例参数初始化,key由明文通过EVP_BytesToKey算法生成,iv为data值的前16字节 cInstance.init(2, new SecretKeySpec(Cfb_256crypt.EVP_BytesToKey(32, 16, obyteArray, p0.getBytes(str), 0)[0], "AES"), new IvParameterSpec(Arrays.copyOfRange(bhex2byte, 0, 16))); // 待解密数据为为data值16字节当前的数据 return new String(cInstance.doFinal(Arrays.copyOfRange(bhex2byte, 16, bhex2byte.length)), str); }catch(java.lang.Exception e6){ e6.printStackTrace(); return obyteArray; } }public static String encrypt(String p0,String p1){ // p0是明文key,p1是待加密数据(穿插援用查看) String str = "UTF-8"; byte[] obyteArray = null; try{ // 初始化实例,加密模式为"AES/CFB/NoPadding" Cipher cInstance = Cipher.getInstance("AES/CFB/NoPadding"); // AES实例参数初始化,key由明文通过EVP_BytesToKey算法生成,iv未指定,为随机生成 cInstance.init(1, new SecretKeySpec(Cfb_256crypt.EVP_BytesToKey(32, 16, obyteArray, p0.getBytes(str), 0)[0], "AES")); // 随机生成的iv+加密后的数据,合并后转为16进制字符串,发送给服务器 return Cfb_256crypt.byte2hex(Cfb_256crypt.byteMerger(cInstance.getIV(), cInstance.doFinal(p1.getBytes(str)))); }catch(java.lang.Exception e6){ e6.printStackTrace(); return obyteArray; } }光标放在encryp/decrypt办法上,能够查看是哪里调用的(即穿插援用,快捷键X),间接定位到了申请接口的封装类,顺便间接拿到了key的明文。 ...

May 17, 2021 · 3 min · jiezi

关于逆向工程:IDA静态分析

一: 剖析“getText”函数1.首先任意关上一个函数,以getText函数为例,如下图所示。 2.双击关上该函数,开始剖析汇编指令,箭头所指地位是指令的开始处,如下图所示。 .text:00001148 STMFD SP!,{R3-R5,LR} 压栈操作,把R3-R5,LR别离压到栈顶。 .text:0000114C MOV R5, R1 把R1赋值给R5。 .text:00001150 LDR R3, [R0] 将R0的地址给R3。 .text:00001154 MOV R4, R0 将R0给R4。 .text:00001164 BLX R3 跳转带链接状态切换到R3。 .text:0000117C ADD R3, PC, R3 将PC和R3相加给R3。 曾经晓得他的操作流程,那么它的这些操作为了实现什么逻辑呢?带着这个疑难持续剖析。 二:比照剖析源码、伪代码、汇编指令三者对应关系1.如下图所示为源代码的逻辑,它在获取字段的值。 2.在反汇编窗口中找到getText函数,按“F5”,将汇编指令切换为伪代码,通过查看IDA里的伪代码发现:默认传入的参数类型须要批改能力查看,如下图所示。 3.选中getText函数的参数,右键N对名称进行批改。第一个参数就是刚刚看到的env,间接改为env;右键Y对类型的批改,将类型批改为JNIEnv*。这样就辨认实现了,成果如下图所示。 剖析此处的逻辑: 第一个跳转是:Findclass 第二个跳转是:GetFindID 第三个跳转是:GetObjectFieId 第四个跳转是:GetStringUTFChars 第五个是返回一个:NewStringUTF 接着批改参数,如下图所示。 4.参数批改实现后,右键抉择copy将伪代码拷贝到反汇编窗口,也就是getText函数的汇编指令,如下图所示。 这就是最终的成果,剖析最终成果,便能够理解这些指令的作用,如下图所示。 小结本次次要分享了动态剖析的流程: 1、剖析函数,查看ARM汇编指令。 2、比照剖析源码、伪代码、汇编指令三者对应关系。 3、查看跳转,理清逻辑。 4、总结逻辑,实现过程。

January 15, 2021 · 1 min · jiezi

关于逆向工程:IDA调试修改内存数据

一: 批改寄存器的值 以图所示的BLX R3这个函数为例,执行结束后,他的返回值在右面的R0寄存器,对它进行批改。 1.将鼠标移到R0寄存器,右键,抉择“Modify value”选项,能够批改为任意值,如下图所示。 2.除了抉择“Modify value”选项外,还能够抉择“Zero value”选项,间接置零,如下图所示。 二:篡改内存数据 在函数头打断点,点击F9,程序胜利在函数头断下,紧接着F8往下走,当走到“ADD R2, PC, R2”这条指令时,该指令应用的是绝对寻址形式,PC寄存器的值加上R2寄存器的值得到的是一个地址,该地址寄存的是一个字符串,即Activity,如下图所示。 1.点开十六进制窗口,同步R2寄存器,如下图所示。 2.同步后的值,如下图所示。 3.间接F2进行批改,如下图所示。 4.“31”代表的是“1”,如下图所示。 5.实现上述流程,提交后的成果,如下图所示。 三:NOP函数或代码 以BL zhengchu函数为例。 当程序执行到这里,如果持续往下单步,会执行上面这个函数,如下图所示。 若不想执行此函数,则进行上面的操作流程: 1.进入十六进制窗口,点击鼠标右键,抉择Synchronize with再抉择IDA View PC同步PC寄存器,如下图所示。 2.同步后的成果如下图所示。 3.PC寄存器的值永远指向以后指令,所以此刻同步以后PC寄存器的值就是行将要执行的函数BL的值。间接右键抉择edit或者间接快捷键F2,如下图所示。 4.将其全副批改为零,如下图所示。 5.批改后,持续右键,F2提交,如下图所示。 6.实现上述流程,查看原函数,已变成一条有效的指令,如下图所示。 7.间接单步往下走,不会再进入该函数,而是执行下一条指令,如下图所示。 执行到这里,已将函数胜利NOP掉,变为一条有效的空指令。 小结 咱们晓得如何批改对应寄存器的值:鼠标右键,抉择“Modify value”选项,能够改为任意值,或者抉择“Zero value”选项,间接置零,同时批改寄存器的值能够实现篡改内存数据,这里须要留神的是NOP函数或代码实现不跳转或者不执行。

January 14, 2021 · 1 min · jiezi

关于逆向工程:实战分析43XX的HTTPS协议

1、抓包剖析协定数据第一次抓包:POST https://mapi.4399api.net/user... HTTP/1.1Content-Length: 179Content-Type: application/x-www-form-urlencodedHost: mapi.4399api.netConnection: Keep-AliveUser-Agent: 4399GameCenter/4.7.0.26(android;oppo R11 Plus;5.1.1;720x1280;WIFI;1322.352;a4399)Accept-Encoding: gzipmauth: mareacode: 999999mauthcode: SM-DEVICEID: 201905041309028d5a7f8497361da6970ae4648182 781501ebe495ed6c69f4m-id: 00%3A81%3Af0%3A3a%3A81%3Ae1a-id: 90af9d75bb5711afe-id: 865166020506633mdeviceId: 865166020506633pauth: s-id: 460006017714263mudid: 1094ghmbkrL3FHgyrMy0ca6d4dateline=1557294373&deviceIdentifier=865166020506633&info=1&model=oppo+R11+Plus&password=ytHJhV3wqmTLqeV%2BzhXB%2BA%3D%3D&sign=8d86292d44242171706dbb86878c5fef&username=1908920848第二次抓包:POST https://mapi.4399api.net/user... HTTP/1.1Content-Length: 179Content-Type: application/x-www-form-urlencodedHost: mapi.4399api.netConnection: Keep-AliveUser-Agent: 4399GameCenter/4.7.0.26(android;oppo R11 Plus;5.1.1;720x1280;WIFI;1322.352;a4399)Accept-Encoding: gzipmauth: mareacode: 999999mauthcode: SM-DEVICEID: 201905041309028d5a7f8497361da6970ae4648182781501ebe495ed6c69f4m-id: 00%3A81%3Af0%3A3a%3A81%3Ae1a-id: 90af9d75bb5711afe-id: 865166020506633mdeviceId: 865166020506633pauth: s-id: 460006017714263mudid: 1094ghmbkrL3FHgyrMy0ca6d4dateline=1557294488&deviceIdentifier=865166020506633&info=1&model=oppo+R11+Plus&password=ytHJhV3wqmTLqeV%2BzhXB%2BA%3D%3D&sign=17098977627437634f0e58674edcafc3&username=1908920848 ](https://p6-juejin.byteimg.com... ](https://p1-juejin.byteimg.com... 2、间接搜寻网址](https://p3-juejin.byteimg.com... ](https://p3-juejin.byteimg.com... ](https://p6-juejin.byteimg.com... ](https://p1-juejin.byteimg.com... ](https://p9-juejin.byteimg.com... ](https://p1-juejin.byteimg.com... 除了”sign”这个字段,其余字段都找到了。”sign”字段就在以后类的左近,通过com.m4399.gamecenter.plugin.main.f.ay.ae类的基类(com.m4399.gamecenter.plugin.main.f.c)发现一个十分可疑的类(com.m4399.framework.providers.SignDataProvider),点击进去发现该类有一个办法(buildRequestParams)正是计算”sign”字段的值。 3、Android Studio+smalidea插件动静调试smali代码调试模启动式adb shell am start -D -n com.m4399.gamecenter/.controllers.splash.SplashActivity 端口转发adb forward tcp:8700 jdwp:2561呈现这个谬误阐明8700端口被占用error: cannot bind listener: cannot bind to 127.0.0.1:8700: 通 常每个套接字地址(协定/网络地址/端口)只容许应用一次。 (10048) ...

January 13, 2021 · 1 min · jiezi

关于逆向工程:ios逆向与安全攻防

一、iOS逆向工程根底苹果开发者打算脱壳重签名日志打印本地文件网络通信Hook1.苹果开发者打算只有退出苹果开发者打算,能力对利用进行非法签名。Debug版本和Release版本。开发者调式设施。iOS利用分为AppStore利用和企业应用。developer.apple.com2.脱壳AppStore上架利用,都被苹果加了一层壳。在越狱设施中运行,dump内存数据整合成未加密的可执 行文件。Clutch,DumpDecrypted,MonkeyDevClutch -d com.company.app3.重签名代码签名机制应用本人的开发者证书从新对批改后的利用进行签名,使之可 以运行在本人的调试设施中,以便后续动态分析。codesign,iOS App Signer,MonkeyDev4.连贯设施能够通过USB、wifi连贯mac和iOS设施。usbmuxdpython tcprelay.py -t 22:2345 • ssh root@localhost -p 23455.日志打印对利用的日志输入实时监控。idevicesyslog,Console,Xcode6.本地文件ipa包资源文件data目录数据文件(用户数据、各种缓存数据)keychain数据ipa包能够间接解压数据文件ssh到越狱设施查看keychaindumper7.网络通信监听、截获设施的网络通信数据。Burp Suite,Charles,WireShark导入证书bypass证书验证 SSL Kill Switch8.动态剖析IDA Pro,Hopper,Ghidra,class-dump,strings提取字符串、类、函数办法、导入函数等信息 • class-dump -s -H -S target -o outputDir9.Hook对要害函数办法进行Hook,打印要害信息或扭转函数行为。Theos,MonkeyDevLogos语法@hook Class- (void)targetMethod { NSLog(@”Hooked”); @orig;} @end二、iOS利用平安编码iOS系统安全机制简介iOS利用常见破绽及问题点如何编写平安的iOS利用1.iOS系统安全机制简介代码签名——避免未经受权的程序在设施上运行沙盒机制——利用只能拜访数据本人的数据KeyChain——平安存储本地数据隐衷信息权限管制——避免利用未受权拜访用户隐衷信息2.iOS利用常见破绽及问题点本地存储问题——敏感信息不恰当地存储造成信息泄露网络通信问题——通信形式、报文数据处理不当造成信息泄露源码相干问题——敏感代码未混同加密造成信息泄露业务破绽——权限管制不当导致攻击者有能力进行未受权操作2.1本地存储文件个别能够在以下门路找到:配置文件 /var/mobile/Containers/Data/Application/[UUID]/Library/Preference 缓存 /var/mobile/Containers/Data/Application/[UUID]/Library/Caches 数据库 /var/mobile/Containers/Data/Application/[UUID]/Documents 测试数据&证书数据 /var/mobile/Containers/Bundle/Application/[UUID]/APP.app 2.1.1本地存储破绽案例应用NSUserDefaults明文存储用户设定的手势明码。利用工具提取设施中利用对应的用户配置plist文件后,即可查看相应字段,找到明码。倡议计划对敏感信息加密后应用KeyChain存储 2.2网络通信未应用https且明文通信http通信内容能够被轻松截获、篡改。如果报文内容为明文,可导致信息泄露。https服务端证书未认证通信内容能够被截获、篡改,同样造成中间人攻打。敏感参数弱加密一旦被攻打,敏感信息容易被破解、透露。未进行加签/验签一旦被攻打,报文数据被篡改,如订单号、数量等。外发不明数据有问题的IDE或不明第三方SDK导致,敏感信息可能被透露。 2.2.1网络通信破绽案例应用网络流量抓包工具监听设施的网络流量,能够看到未做全网络通信防护措施的利用通信明文数据。倡议计划利用内全局应用https进行网络通信,并且对服务端证书做强校验,同时对报文中的敏感信息进行加密,对通信报文整体进行加签、验签,利用不擅自接入第三方SDK或模块。 2.3源码相干问题日志打印通过日志打印的调试信息,攻击者能够还原业务逻辑。要害源码未混同攻击者能够逆向利用,还原要害业务逻辑。敏感字符串未加密AppSecret、加解密应用的密钥等敏感字符串未加密造成信息泄露。未检测设施运行环境无奈及时发现注入、调试等攻击行为。 2.3.1源码相干问题破绽案例不管越狱与否,都能够通过工具查看实时日志打印。某利用打印了网络申请,能够看到报文中的明文数据。倡议计划利用在开发实现上传App Store审核前,能够通过宏定义形式去掉Release版本中所有日志打印。 2.3.2源码相干问题破绽案例通过工具导出了所有可执行文件中的办法名,通过搜寻能够很容易地发现诸如loginWithPassword的要害办法名。倡议计划对要害办法名应用宏定义进行随机数字符串替换,减少攻打难度和老本。 2.4业务破绽越权攻击者取得了本不属于他的权限,能够查看、批改信息。扫号、爆破应用工具批量发送特定网络申请探测用户信息或明码信息。认证绕过通过批改网络通信数据包等操作批改认证断定后果。短信破绽未对短信接口做限度造成短信轰炸或短信内容任意编辑。重放数据包未做签名、工夫戳等机制,造成能够重放网络申请。 3.如何编写平安的iOS利用准则:敏感信息的爱护防止所有可能造成敏感信息透露事件的产生。WHY:为什么要爱护敏感信息防止上述破绽和问题的产生,爱护公司和客户的财产、信息安全。WHAT:什么是敏感信息业务信息、用户身份、调试信息等所有与公司、用户、程序行为相干的信息。HOW:如何爱护敏感信息遵循敏感信息存取准则(迪米特法令),加密存储,按需提取。 3.1剪贴板尽量避免应用零碎剪贴板,倡议应用自定义剪贴板应用实现后尽快删除禁用敏感信息TextField的复制/剪切3.2截屏缓存folder/to/AppData/Library/Caches/Snapshots/ 监听利用退出前台事件对以后页面进行截屏进行含糊解决笼罩到最上层3.3键盘缓存零碎键盘默认会对非明码非数字进行缓存。倡议调整对应TextField的属性,敞开主动修改选项。内存中的实例变量 不要将明码明文寄存在实例变量中。敏感数据及时加密和摘除。3.4 网络申请缓存设置网络申请缓存策略,不在本地缓存网络申请报文 NSURLRequestReloadIgnoringLocalCacheDataNSURLRequestReloadIgnoringCacheDataconnection willCacheResponse{ return nil;}3.5网络通信平安网络通信报文数据须要加密和加签。https服务端证书须要认证。3.6应用NSURLConnection证书认证connection didFailWithError:(NSError *)error;该办法为连贯失败的回调,若证书验证失败,会触发该办法。 connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace;当收到HTTPS服务端认证的challenge时的回调办法,在该办法中实现对服务端证书的认证。 -(BOOL)shouldTrustProtectionSpace:(NSURLProtectionSpace *)protectionSpace;证书认证的具体实现,非协定办法,须自行实现。 3.7AFNetworking证书认证[AFHTTPSessionManager manager].securityPolicy = [self customSecurityPolicyWithCertName:@"myCer2020"];设定安全策略未读取指定证书文件进行证书验证 ...

August 24, 2020 · 1 min · jiezi

关于逆向工程:unidbg调用so生成xgorgon

目前很多 App 的加密签名算法都在so文件中,强行逆向so的话可能会耗费大量工夫和资源。 之前用 xposed 采纳 hook 的办法从程序计算签名,然而须要模拟器或者真机运行这个利用,应用效率不高。也用过 jtype 启动JVM,而后通过 native 对so文件进行调用,因为每次都须要启动JVM,所以效率也不高。 unidbg 他不须要运行 app,也无需逆向 so 文件,通过在 app 中找到对应的 JNI 接口,而后用 unicorn 引擎间接调用 so 文件,所以效率绝对要高不少。 unidbg特点模仿JNI调用API,能够调用JNI_OnLoad反对JavaVM,JNIEnv模拟系统调用反对ARM32和ARM64内联钩子(Inline Hook)Android import hookiOS 的一些hook工具 fishhook and substrate and whale hook反对简略的控制台调试器,gdb存根,实验性IDA android调试器服务器,指令跟踪,内存读/写跟踪反对iOS objc和Swiftunidbg环境配置unidbg下载链接: https://github.com/zhkl0228/unidbg IntelliJ IDEA可用于编辑unidbg源 下载实现之后示导入到 IDEA 中,当然你须要筹备好java环境(jdk、maven) 抉择Maven期待加载实现之后,运行src/..../encrypt 中的TTEncrypt测试用例如果控制台打印相干调用信息,阐明曾经导入胜利。 加载libcms.so看过这篇文章的应该曾经晓得生成xg函数的地位,所以不具体说了。《抖音xgorgon(0401)》 上面筹备调用libcms.so文件中的 leviathan 函数 首先在 src/test/resources 目录下新建文件夹dylib,放入libcms.so文件 libcms.so 下载地址: https://download.csdn.net/download/weixin_43582101/12713664 而后我在 /unidbg/unidbg-android/src/test/java/com/sun/jna/ 目录下新建了 JniDispatch128.java文件 JniDispatch128.java文件内容如下: 备注"com/ss/sys/ces/a"须要调用函数所在的Java类残缺门路,比方 a/b/c/d 等等,留神须要用/代替."leviathan(II[B)[B"须要调用的函数名,名字是smali语法,可通过jadx等工具查看“vm.loadLibrary(new File)”so文件的门路,须要自行批改,最好为绝对路径package com.sun.jna;import com.github.unidbg.*;import com.github.unidbg.linux.android.AndroidARMEmulator;import com.github.unidbg.linux.android.AndroidResolver;import com.github.unidbg.linux.android.dvm.*;import com.github.unidbg.memory.Memory;import com.github.unidbg.memory.MemoryBlock;import com.github.unidbg.linux.android.dvm.array.ByteArray;import java.io.File;import java.io.IOException;public class JniDispatch128 extends AbstractJni { private static LibraryResolver createLibraryResolver() { return new AndroidResolver(23); } private static AndroidEmulator createARMEmulator() { return new AndroidARMEmulator("com.sun.jna"); } private final AndroidEmulator emulator; private final Module module; private final VM vm; private final DvmClass Native; private JniDispatch128() { emulator = createARMEmulator(); final Memory memory = emulator.getMemory(); memory.setLibraryResolver(createLibraryResolver()); vm = emulator.createDalvikVM(null); vm.setJni(this); vm.setVerbose(true); // 自行批改文件门路 DalvikModule dm = vm.loadLibrary(new File("/Users/Desktop/unidbg/unidbg-android/src/test/resources/dylib/libcms.so"), false); dm.callJNI_OnLoad(emulator); module = dm.getModule(); Native = vm.resolveClass("com/ss/sys/ces/a"); private void destroy() throws IOException { emulator.close(); System.out.println("destroy"); } public static void main(String[] args) throws Exception { JniDispatch128 test = new JniDispatch128(); test.test(); test.destroy(); } public static String xuzi1(byte[] bArr) { if (bArr == null) { return null; } char[] charArray = "0123456789abcdef".toCharArray(); char[] cArr = new char[(bArr.length * 2)]; for (int i = 0; i < bArr.length; i++) { int b2 = bArr[i] & 255; int i2 = i * 2; cArr[i2] = charArray[b2 >>> 4]; cArr[i2 + 1] = charArray[b2 & 15]; } return new String(cArr); } private void test() { String methodSign = "leviathan(II[B)[B"; byte[] data = "临时轻易写的,这里是url通过解决后的data".getBytes(); int time = (int) (System.currentTimeMillis() / 1000); Native.callStaticJniMethod(emulator, methodSign, -1,time,new ByteArray(vm,data)); Object ret = Native.callStaticJniMethodObject(emulator, methodSign, -1,time,new ByteArray(vm,data)); System.out.println("callObject执行后果:"+((DvmObject) ret).getValue()); byte[] tt = (byte[]) ((DvmObject) ret).getValue(); System.out.println(new String(tt)); String s = xuzi1(tt); System.out.println(s); }}运行main办法即可查看生成进去的xgorgon了 ...

August 17, 2020 · 2 min · jiezi