
汇编
文章平均质量分 71
Poison老师
写了十多年代码,也创业了多次,从底层到应用层
展开
-
ios代码混淆-字符串加密的优点和其他破解方法
程序运行效果这个例子是一个输入密码9527就会登录,否则显示"密码错误,重新输入"代码使用明文字符串的缺点oc代码下面代码是点击登录按钮以后执行判断.- (IBAction)btn1Click:(id)sender { if ([self.tf.text isEqualToString:@"9527"]){ self.label1.text = @"请输入密码"; VC1 *vc = [[VC1 alloc]init]; [self.nav原创 2022-04-15 10:27:19 · 1730 阅读 · 0 评论 -
mac m1使用免费的hopper demo版本和machoView破解修改iphone上的app
先看下破解之前的程序,密码输入错误点击按钮不能进入,只有输入9527才能登录成功如下图,hopper中找到这个tbz跳转的代码使用debugserver给app在这3个地址下断点:计算偏移量(lldb) image list -o -f |grep testCrackPwd[ 0] 0x0000000004374000 /private/var/containers/Bundle/Application/277D073A-C808-4D4B-9A91-5FB238E744FA/testCra原创 2022-03-21 15:07:49 · 6177 阅读 · 0 评论 -
arm64用debugserver和lldb和hopper调试oc方法
因为普通的oc方法会编译成c++方法,例如下面的test1::会改成objc_msgSend,[vc test1:arg1 :arg2];objc_msgSend(vc,@selector(test1::),arg1,arg2)objc_msgSend的参数:参数1是调用的控制器参数2是方法名参数3是test1函数参数1参数4是test1函数参数2所以在lldb调试方法的时候,寄存器x0,x1表示参数1,参数2.内容如下po $x0. //打印是调用的控制器x/s $x1 //原创 2022-03-11 17:35:38 · 2617 阅读 · 0 评论 -
arm64汇编adrp指令作用和使用举例
文章目录adrp作用举例1举例2adrp作用adrp 寄存器,立即数,作用是把pc寄存器跟立即数按照一定规则计算后赋值给寄存器.举例1adrp x8,1adrp指令是给寄存器赋值.赋值的规则是:先把pc寄存器里的数值先按照16进制表示,后3位清零,再把adrp 右边的立即数,左移3位,也就是在末尾+3个0 .然后让2个结果相加.例如上面的例子pc = 0x0000000104ff6754然后把pc后3位清零 得到0x0000000104ff6000adrp x8,1 右边的立即数原创 2022-03-11 10:13:35 · 20407 阅读 · 0 评论 -
arm64汇编sp fp寄存器叶子函数非叶子函数的栈平衡
文章目录sp 栈顶指针寄存器fp 栈底指针寄存器 (x29)arm64没有push 和 pop操作栈开辟的空间是16的倍数叶子函数的栈平衡非叶子函数的汇编操作栈平衡sp 栈顶指针寄存器这个跟win32的esp一样.始终指向栈顶的地址.编译器可能用sp-偏移量来表示要读写栈的地址fp 栈底指针寄存器 (x29)这个跟 win32的ebp一样,用来指向当前函数的栈底.编译器优惠有时候会用 fp+偏移量 来表示要读写栈的地址,arm64没有push 和 pop操作栈在arm64汇编中没有win32汇编原创 2022-03-10 16:49:09 · 3159 阅读 · 0 评论 -
arm64汇编中orr 和 mov的交替使用
文章目录orr作用是按位或mov的作用orr代替mov使用方法反汇编中,把给某个寄存器赋值用orr 代替movorr作用是按位或按照二进制位来或运算每个位规则如下:1或0 =10或0 = 01或1 =11或任何数都是10或任何数都是任何数mov的作用把右边的值传送到左边寄存器里 mov w8,#0x1f //把1f传入w8orr代替mov使用方法注意下面2条指令作用一样,都是给32位的寄存器w8的赋值成0x1Forr w8,wzr,#0x1fmov w8,#0x1forr是原创 2022-03-10 09:46:48 · 2774 阅读 · 0 评论 -
arm汇编lr pc b bl ret指令函数调用和返回gif动图演示
文章目录pc 寄存器lr寄存器 (x30)ret返回指令bl 跳转指令,带返回b 跳转,不带返回pc 寄存器pc保存着当前指令执行的地址,相当于win32汇编里的eip寄存器lr寄存器 (x30)lr存储函数的返回地址,每次遇到ret返回指令,都会跳转到lr寄存器里保存的地址,这个地址是函数调用的下一条指令,就是应该要执行的指令,cpu遇到ret之后,会把lr赋值给pc,这样cpu了pc里的地址,就是执行函数调用的下一条指令ret返回指令作用是返回,本质上的操作:执行ret之后,会把lr寄存器原创 2022-03-09 16:25:41 · 3857 阅读 · 1 评论 -
arm64汇编wzr和xzr零寄存器和在ios中的调用
wzr是32位的零寄存器,用于给int清零xzr是64位的零寄存器,用于给long清零汇编函数在.h文件中的声明:void fn1(int *a,int *b);oc文件中的调用 int a = 11; long b = 12; fn1(&a, &b); NSLog(@"a=%d,b=%ld",a,b);汇编函数再.s文件中的定义.text.global _fn1//wzr是32位的零寄存器,用于给int清零//xzr是64位的零寄存器,原创 2022-03-08 17:51:34 · 6261 阅读 · 0 评论 -
arm64汇编str和stur和stp指令在ios中调用
str指令作用str r0,[r1] str作用是把左边r0寄存器里的值,存入到 右边[r1]内存地址中str x0,[x1,#0x10] //x->[x1+0x10]#str 在函数中的作用oc代码调用int fn1(int a,int *b); int a = 1; int b = 10; int result = fn1(a,&b);_fn1:str x0,[x1]//把fn1(参数1,参数2) x0里是参数1,把x0的值存入到 x1(参数2的指原创 2022-03-08 17:23:02 · 7375 阅读 · 1 评论 -
arm64汇编ldr和ldur和ldp指令在xcode中传入地址调用方法
文章目录ldr指令的作用arm.h文件中的声明oc文件中的调用ldr指令的作用ldr作用是把 中括号[]中的地址里存的值存入到前面的寄存器中有下面几种格式:LDR R0, [R1] ; R0←[R1]LDR R0,[R1,#4] ;R0←[R1+4]LDR R0,[R1,#4]! ;R0←[R1+4]、R1←R1+4LDR R0,[R1] ,#4 ;R0←[R1]、R1←R1+4LDR R0,[R1,R2] ;R0←[R1+R2]arm.h文件中的声明#ifndef arm_h#def原创 2022-03-04 17:37:53 · 9863 阅读 · 0 评论 -
arm64汇编b带条件跳转指令和bl跳转带返回ret指令
B 跳转指令b 跳转指令,相当于win32汇编的jmp无条件跳转指令下面代码遇到 label4以后就跳转到label4,然后就返回了_fn2:mov x0,#0x1mov x1,#0x2b label4label3:mov x0 ,1retlabel4:mov x0 , 0ret;执行完这局以后就返回上一层了BL 带返回的跳转指令bl指令跳转以后遇到第一个ret,就会返回到bl的下一条指令继续执行同样这段代码把b换成bl就会遇到执行完label4以后遇到ret,还会跳到b l原创 2022-03-04 15:36:36 · 7187 阅读 · 1 评论 -
使用xcode在ios项目中手写汇编代码函数并且调用汇编函数的方法
文章目录在项目中新建空白文件empty重命名为.s文件新建.h头文件声明方法给别的文件使用在oc代码中调用方法通过lldb 断点调试验证寄存器结果在项目中新建空白文件empty重命名为.s文件如下图在ios app项目中新建文件->other->empty->名字改成test.s下面是2个方法:text和 add,text方法不带入参只简单测试几条mov指令add带入参,测试带2个入参的加法.text的意思是把西面代码放进代码段.因为macho文件,里面的text段就是代码原创 2022-03-03 11:28:01 · 1770 阅读 · 0 评论 -
od 查找特征码和特征码模糊搜索教程
目录特征码的作用查找多行汇编代码通过十六进制数查找特征码模糊搜索特征码特征码的作用特征码的作用是用来定位一段特殊的汇编代码,一般用作定位有偏移量的汇编代码,因为如果你破解了一个文件,但是他更新以后,里面文件的汇编指令偏移量会改变.所以需要用他附近的汇编指令当做特征码来定位.看下面的例子详细说明先看下面汇编代码地址 16进制指令 汇编指令768FACB7 29FD sub ebp,edi768FACB9 0300原创 2021-11-29 17:43:10 · 7011 阅读 · 0 评论 -
汇编中浮点栈寄存器st0~st7浮点计算fld压栈再计算的过程运行原理
目录为什么浮点数不能用普通的数学指令计算结论 用普通的数学计算add无法实现浮点数加法.必须使用浮点数计算指令fadd来进行浮点数加法计算.fpu的概念浮点数计算需要先用fld指令压栈用fld 指令压入浮点栈fld指令浮点栈 St0 到 St7 8个浮点栈寄存器fadd 浮点数加法浮点数计算完以后从寄存器中取出存入内存的出栈操作fst指令和fstp指令把所有上面的指令全部用起来的示例在od中的运行之前一直有个疑惑,为什么浮点数要单独有一套计算法则,普通的加减乘除不行吗?经过1天在od中实战研究,终于明白了原创 2021-11-19 17:35:46 · 4731 阅读 · 0 评论 -
汇编 eax test jnz jz 等组合连用的总结
目录结论举例分析test作用ZF PF标志位改变不需要记,因为不方便记忆.我们需要记住是test下面语句的跳转语句意思jnzjz总结结论这几个组合在一起通常是判断 函数返回结果是否是0.是0跳转到哪里,不是0跳转到哪里举例分析下面代码:就是判断2个字符串是否相等.push edxpush eaxcall dword ptr dS:[K&KERNEL32.1strcmpA> //判断edx和 eax 2个字符串是否相等,调用的是C语言的 strcmp test eax,eax原创 2021-11-17 16:57:16 · 6210 阅读 · 0 评论 -
od数据窗口中跟随Follow in Dump的使用方法
od 中Follow in Dump 中文版 数据窗口中跟随,的作用是,把选中的值,当做一个数据地址,去数据窗口查看,这个地址的数值可以理解为是把 指针里的值,当做一个地址去查看操作方法如下图,右键选中一条数据的值,比如下图选中寄存器esp 0019F468,然后右键选择 follow in dump ,然后再左下方的数据区会找到这地址0019F468在栈空间里也可以这样操作.例如下图选中栈空间的一个数据00403030...原创 2021-11-16 15:36:33 · 1358 阅读 · 0 评论 -
汇编中esp和ebp在函数栈空间的保存和变化 call的参数和局部变量的关系详解
目录espebpespcall执行跳入子程序以后栈顶寄存器,一直指向栈顶ebpcall执行过跳入子程序以后,一直指向栈底看下面例子模拟一个有2个参数的函数.例如函数参数1是 5, 参数2是6push 6 //参数2push 5 //参数1call 子程序地址//子程序开始以后的栈的内容操作push eip// 这里栈内显示是:"返回到" 因为call语句执行时候的把eip压入栈,这样当子程序结束的时候可以通过retn语句的时候 找到call下面的语句,就是通过这个eip找到的.因为re原创 2021-11-08 14:44:01 · 3243 阅读 · 0 评论 -
汇编中 rep指令 和 stos指令ollydbg图解
今天在od中跟踪数据的时候发现这么一条指令原创 2021-11-07 10:56:35 · 10164 阅读 · 1 评论 -
x86_64汇编中的栈平衡(内平栈外平栈)附od反汇编图解
目录push 入栈pop 出栈首先介绍占空间用到的几个寄存器ESP 栈顶指针 (extended stack pointer)英文直译是:扩展栈指针EBP 栈底指针 ,指的是本层call子程序的栈底,就是最上层call的栈底。不是整个栈空间的栈底 (extended base pointer)英文直译是扩展基址指针push 入栈push eax 等价于 sub esp , 4 mov [esp],eax 把eax压入栈等价于 县 让esp栈指针 - 4 ,然后把 eax的值存入原创 2021-11-06 17:30:39 · 4834 阅读 · 0 评论 -
微软x64常用汇编指令总结
这里写目录标题lea 直接读取有效地址值ret 函数返回xor 异或add 加法sub 减法inc 自增(increase)jmpcmpjnejelea 直接读取有效地址值lea eax ,[1001H]lea作用是把 中括号里的值存入 寄存器里把[1001H]里面的地址赋值给eax,也就是把1001H赋值给eax,执行之后的结果,是 eax = 1001H等价于 mov eax , 1001H通常做给c++指针赋值的时候使用这个指令,例如: int a = 3; // mov d原创 2021-07-07 17:28:52 · 6994 阅读 · 2 评论 -
arm汇编储存指令str stur和读取指令 ldr ldur的使用,对应xcode c++中的代码反汇编教程
目录str 和 stur 存储指令ldr 和 ldur 读取指令经常会看到xcode 返回变里面出现 stur 和 ldur之类的指令,网上资料不太多,今天做一下总结:str 和 stur 存储指令这是一对 存储指令,作用是把寄存器里的内容存储到右边地址中:用法格式如下:str 寄存器,[内存地址]stur 寄存器,[内存地址]例如下面汇编代码str w11, [x10, #0xa0]stur w12, [x29, #-0x18]从功能出发,这2条指令一般对应,存储数值,例如给变原创 2021-07-06 10:49:21 · 8545 阅读 · 2 评论 -
arm芯片汇编寻址方式,xcode中反汇编举例证明
目录立即数寻址 add R0,R0,#10.寄存器寻址 add R0,R1,R2寄存器间接寻址:ldr R0,[R1]基址变址寻址:前索引 ldr r0,[r1,#10]自动索引 ldr r0,[r1,#4]!后索引 ldr r0,[r1],#4跟x86汇编差不多,但是通用寄存器不一样格式: 指令码 指令格式条件码 目标寄存器 ,源操作数1,源操作数2立即数寻址 add R0,R0,#10.把R0+10 赋值给R0下面截图xcode中的反汇编上面例子,xcode里面反汇编了main原创 2021-07-01 10:45:11 · 619 阅读 · 6 评论